ローカルの仮想環境とFTP接続する際、パッシブは繋がるがアクティブだと接続できない
序文
FTP通信を行う単体テストなどでよくある状況だが、 やたら詰まったのでメモ。
以下のようにPORTコマンドを送った際、 レスポンス500が帰ってきてしまい接続に失敗する。
| 送信 | PORT 127,0,0,1,127,50 | ポートは適当 |
|---|---|---|
| 返信 | 500 Illegal PORT command |
メモ
- ポートフォワーディングではない
制御コマンドは全てポート番号21で通信するため、ここまで来てから止まることはない。
そして、内部から外部への接続はポートフォワーディング不要で接続できる。 - Windowsファイアウォールでもない
ファイアウォールを完全にOFFにしても変化なし。
設定をごちゃごちゃするまでもない。 - NAT接続だとできないというのも間違い
後述の設定をすれば普通に可能。
結論
PORTの接続先に「127.0.0.1」「localhost」等のループバックアドレスを指定していると発生する。 というのも、仮想環境の外から中のポート番号は見えるため上記アドレスでも接続できるが、中から外のポート番号は見えないことから指定されたアドレスに接続できないと判定されてしまうため。
ならどうするかというと簡単で、ルーター等から自身に割り振られたLAN上でのアドレスを指定すればよい。
分かれば単純なのだが意外と気づかないので記録しておく。
ArchLinuxによる基本のdwmデスクトップ
概要
ArchLinuxでデスクトップ環境を作成する時、見落としやすい手順をまとめた。 基本となる手順はインストールガイド - ArchWikiを参照。
なおwikiの手順は一見複雑に見えるかもしれないが、以下のような大きな流れがある事を理解してから読めば大体分かるはず。
上にある"pacstrap"コマンドは、指定したディレクトリ以下をルートとみなして書き込むpacmanのようなもの。言い換えれば、「インストーラ環境上でpacstrap」と「インストール後のデスクトップでpacman -S」はほぼ同じである。
そのため、デスクトップは起動したが足りないパッケージ等があったら後でpacmanすればいいし、
逆にインストール後pacmanが動かない等で困ったらインストーラ環境に戻ってきてもいい。
1. ファイルシステム作成
UEFIで作成したいので、gdiskを使用する。
| No | デバイス | サイズ | タイプ | マウント先 |
|---|---|---|---|---|
| 1 | /dev/nvme0n1p1 | 512MB | EFI System (gdisk=EF00) |
/efi |
| 2 | /dev/nvme0n1p2 | (残り) | Linux filesystem (gdisk=8300) |
/ |
2. パッケージ追加&有効化
No.1~4あたりはpacstrapで入れる。AURはNo.4以降から使用可能。
| No | グループ | 1. pacman | 2. AUR | 3. 有効化コマンド |
|---|---|---|---|---|
| 1 | 必須 | base base-devel linux linux-firmware |
||
| 2 | ブート設定 | amd-ucode | bootctl install | |
| 3 | ネットワーク | systemctl enable systemd-networkd systemctl enable systemd-resolved |
||
| 4 | ツール | gvim less git xfsprogs dosfstools zsh zsh-completions |
||
| 5 | GUI | xorg-xserver xorg-xrandr xorg-xsetroot lightdm lightdm-gtk-greeter libxft libxinerama mate-terminal |
dwm-git dmenu |
systemctl enable lightdm |
| 6 | オーディオ | alsa-utils pulseaudio pavucontrol |
||
| 7 | 日本語 | fcitx5-im fcitx5-skk noto-fonts-cjk noto-fonts-emoji noto-fonts-extra |
3. 設定作成
1.インストーラ環境上で実行するもの
| No | 概要 | 作業内容 |
|---|---|---|
| 1 | ブートローダ設定 | 以下のファイルを作成。 /efi/loader/entries/arch.conf > title Arch Linux > linux /vmlinuz-linux > initrd /initramfs-linux.img > initrd /amd-ucode.img > options root="LABEL=ARCH_OS" rw ※optionsはルートファイルシステムの指定のため、UUIDなどでも良い。 |
| 2 | ログイン用ユーザ作成 | 以下のコマンドを実行。 useradd -m -G wheel -s /usr/bin/zsh (ユーザ名) passwd (ユーザ名) |
| 3 | sudoers設定 | visudoを使用、以下の行からコメントアウト(先頭#)を削除。 #%wheel ALL=(ALL:ALL) ALL |
| 4 | ネットワーク設定 | 以下のファイルを作成。 /etc/systemd/network/20-wired.network > [Match] > Name=enp1s0 > > [Network] > DHCP=yes |
| 5 | 日本語入力 | ログインユーザのホーム直下に以下ファイルを作成。 ~/.xprofile > #!/bin/sh > export LANG=ja_JP.UTF-8 > export EDITOR=vim > > # インプットメソッド起動 > export GTK_IM_MODULE=fcitx > export QT_IM_MODULE=fcitx > export XMODIFIERS=@im=fcitx > /bin/fcitx5 & |
2.インストール後、デスクトップ環境で実行するもの
| No | 概要 | 作業内容 |
|---|---|---|
| 1 | インプットメソッドの有効化 | fcitx5-configtoolを起動 →「有効な入力メソッド」からskkをダブルクリック →「現在の入力メソッド」に設定されたことを確認 →「OK」で画面を閉じる |
| 2 | NTP設定 | 以下のコマンドを実行。 timedatectl set-ntp true |
参考サイト
ライブラリを使用せずCSV読込する汎用ロジック
概要
タイトルそのまま。
単純な制御構文と文字列操作のみで実装することで、 採用ライブラリを制限された環境下でなるべく短く最低限実用性のあるCSVパーサを実装するための実験。
あるいは、VBAのようにそもそも一般的なライブラリのない言語でも使えるロジックを作成する。
(参考実装に使用したのはJava)
主に使用条件を限定することでコード量を削減している。
使用条件
- 区切り文字は半角カンマ、囲み文字は半角ダブルクオート
(囲み文字は無くてもよい) - 半角ダブルクオートで囲まれたカラムには半角カンマおよび改行を含むことができる
(半角ダブルクオートをカラム内に含める場合、後述の変更が必要) - カラム内に含まれた改行の改行コード種類は無視され、出力では常にLFのみになる
- 区切り文字と囲み文字の間に文字があった場合、データ内に含める
コード
import java.io.BufferedReader; import java.io.IOException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; public class CsvCutter { /** * テスト実行 */ public static void main(String[] args) { try { // 文字コード取得 Charset cs = (args.length == 1) ? StandardCharsets.UTF_8 : Charset.forName(args[1]); // 入力表示 System.out.println("■入力"); System.out.println("-----------------------------------"); Files.readAllLines(Paths.get(args[0]), cs) .forEach(System.out::println); System.out.println("-----------------------------------\n"); // 分解実行 System.out.println("■出力"); try (BufferedReader br = Files.newBufferedReader(Paths.get(args[0]), cs)) { List<String> lnCsv; int row = 1; // レコード取得 while ((lnCsv =readCsvLine(br)) != null) { // 結果出力 for (int col = 0; col < lnCsv.size(); col++) { System.out.println(row + "行" + (col + 1) + "列 = \"" + lnCsv.get(col) + "\""); } row++; } } } catch (Exception e) { // エラー e.printStackTrace(); } } /** * CSVファイルから1レコードを取得 */ public static List<String> readCsvLine(BufferedReader reader) throws IOException { List<String> lnCsv = new ArrayList<>(); StringBuilder buf = new StringBuilder(); String line; boolean inQuote = false; // 行ループ while ((line = reader.readLine()) != null) { // 行内処理 for (int i = 0; i < line.length(); i++) { char c = line.charAt(i); if (c == '"') { inQuote = !inQuote; } else if (c == ',' && !inQuote) { lnCsv.add(buf.toString()); buf = new StringBuilder(); } else { buf.append(c); } } // 行末判定 if (inQuote) { // 次行へレコード継続 buf.append("\n"); } else { // 行終了 lnCsv.add(buf.toString()); buf = new StringBuilder(); break; } } if (0 < buf.length()) { // イレギュラー:クオート内のままファイル終了 lnCsv.add(buf.toString()); } return !lnCsv.isEmpty() ? lnCsv : null; } }
実行例
■入力 ----------------------------------- "Name","Age","City" "John Doe","25","New York" "Mary Lee","45","Houston, TX" "Tom Brown","35","San Francisco" "Jane Smith", "30",+"Los Angeles"* ----------------------------------- ■出力 1行1列 = "Name" 1行2列 = "Age" 1行3列 = "City" 2行1列 = "John Doe" 2行2列 = "25" 2行3列 = "New York" 3行1列 = "Mary Lee" 3行2列 = "45" 3行3列 = "Houston, TX" 4行1列 = "Tom Brown" 4行2列 = "35" 4行3列 = "San Francisco" 5行1列 = "Jane Smith" 5行2列 = " 30" 5行3列 = "+Los Angeles*"
補足
if (c == '"') { inQuote = !inQuote; } else //〜後略 ↓ if (c == '"') { if (inQuote && i + 1 < line.length() && line.charAt(i + 1) == '"') { buf.append(c); i++; } else { inQuote = !inQuote; } } else //〜後略
Excelファイルを一括検索するVBAマクロ
概要
Excel-VBAを使って、Excelファイルを一括検索するソフトを作成しました。
本当はもっとちゃんとしたツールが沢山存在しており、
そちらを利用した方が速度的にも精度的にも有利です。
しかし、会社のルールでソフトが自由にインストールできないなどの理由から、
そういったツールの使えない環境でも似たような検索ができるように作成しました。
- コピーで作成しやすいよう、1シート&1モジュールで完結させています
- 検索キーワードは部分一致、かつワイルドカード(VBA Like形式)に対応しています
- 余計なファイルは検索から除外することで高速に処理できるよう、 「ファイル名フィルタ」および「除外フォルダ名」を搭載しています
- 図形に含まれたテキストも検索対象とします。
その時、図形の左上端がセル位置として表示されます。 - パスワードがかかっている等の理由で開けないファイルがあった場合、
検索結果の代わりにエラーメッセージが出力されます。
なお、勘のいい方ならお気付きでしょうが基本的に自分用です。
二次利用は自由ですが自己責任でお願い致します。
Step1. スクリプト
VBAエディタで「標準スクリプト」を追加して、 以下の内容を貼り付け。
'================================ ' Excel-Grep検索 '================================ Const SHEET_OUTPUT = "search" Const CELL_PRINT_COL = 1 Const CELL_PRINT_ROW = 9 Const CELL_ROOT_DIR = "B3" Const CELL_SEARCH_WORD = "B4" Const CELL_FILE_FILTER = "B5" Const CELL_EXCLUDE_DIR = "B6" ' 現在の出力行 Dim nowRow As Long ' 最初の検索フォルダ Dim rootDir As String ' 検索用Excel Dim xlApp As Excel.Application ' メイン処理 Sub searchMacro() Dim outputSht As Worksheet Dim excludeDir As Dictionary Dim rootDir As String Dim searchWord As String Dim fileFilter As String Dim s As String Set outputSht = ThisWorkbook.Sheets(SHEET_OUTPUT) Set excludeDir = New Dictionary nowRow = CELL_PRINT_ROW ' 入力取得 With ouputSht rootDir = .Range(CELL_ROOT_DIR) searchWord = .Range(CELL_SEARCH_WORD) fileFilter = .Range(CELL_FILE_FILTER) For Each s In Split(.Range(CELL_EXCLUDE_DIR), ";") excludeDir.Add s, Empty Next End With ' 入力チェック If "" Like searchWord Then MsgBox "検索ワードを入力してください" Exit Sub End If ' 結果シート初期化 With outputSht .Cells(CELL_PRINT_ROW, CELL_PRINT_COL).Select .Range(.Cells(CELL_PRINT_ROW, CELL_PRINT_COL), .Cells.SpecialCells(xlCellTypeLastCell)).ClearContents .Range("C:C,F:F").NumberFormatLocal = "@" End With ' 検索用Excel起動 Set xlApp = New Excel.Application On Error Goto GrepErr ' フォルダ内を検索 Call searchDir(rootDir, searchWord, fileFilter, excludeDir) ' 検索用Excel終了 xlApp.Quit Set xlApp = Nothing On Error Goto 0 If 0 < nowRow - CELL_PRINT_ROW Then MsgBox "検索結果:キーワード「" & searchWord & "」に、" & Format(nowRow - CELL_PRINT_ROW, "#,##0") & "件の一致がありました。" Else MsgBox "検索結果:キーワード「" & searchWord & "」への一致はありませんでした。" End If Application.StatusBar = "" Exit Sub GrepErr: Application.StatusBar = "" xlApp.Quit Set xlApp = Nothing MsgBox "<エラー発生>" & vbCrLf & _ "Number=" & Err.Number & vbCrLf & _ "Source=" & Err.Source & vbCrLf & _ "Description=" & Err.Description End Sub ' フォルダ内検索 Sub searchDir(ByVal searchPath As String, ByVal searchWord As String, ByVal fileFilter As String, ByVal excludeDir As Dictionary) Dim curDir As Folder, subDir As Folder, f As File Application.StatusBar = "検索中フォルダ:" & searchPath DoEvents ' フォルダを開く With New FileSystemObject Set curDir = .GetFolder(searchPath) End With '------ ファイルを検索 ------ Application.ScreenUpdating = False Application.Calculation = xlCalculationManual For Each f In curDir.Files If f.Name Like fileFilter Then Call grepExcel(searchPath, f.Name, searchWord) End If Next Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True '------ サブフォルダを検索 ------ For Each subDir In curDir.SubFolders If Not excludeDir.Exists(subDir.Name) Then Call searchDir(subDir.Path, searchWord, fileFilter, excludeDir) End If Next End Sub ' Excelファイル内を検索 Sub grepExcel(ByVal searchPath As String, ByVal searchFile As String, ByVal searchWord As String) Dim wb As Workbook Dim sht As Worksheet ' ファイルを開く On Error Resume Next Set wb = xlApp.Workbooks.Open(Filename:=searchPath & "\" & searchFile, UpdateLinks:=0, ReadOnly:=True, _ IgnoreReadOnlyRecommended:=True, Password:="") If Err.Number <> 0 Then Call writeSheet(searchPath, searchFile, "-", "-", "ERROR: 開けないファイル") Exit Sub End If On Error Goto 0 ' 各シートを検索 For Each sht In wb.Worksheets Dim aryWhole As Variant Dim crow As Long, ccol As Long, ctext As String Dim shp As Shape '------ セル検索 ------ With sht aryWhole = .Range("A1", .Cells.SpecialCells(xlCellTypeLastCell)) If vbArray < VarType(aryWhole) Then For crow = LBound(aryWhole) To UBound(aryWhole) For ccol = LBound(aryWhole, 2) To UBound(aryWhole, 2) ctext = aryWhole(crow, ccol) If ctext Like "*" & searchWord & "*" Then ' 見つかった内容を書き込み Call writeSheet(searchPath, searchFile, sht.Name, .Cells(crow, ccol).Address(False, False), ctext) End If Next Next End If End With '------ 図形検索 ------ For Each shp In sht.Shapes With shp ' 図形内テキストを検索 (テキストのない図形は無視) ctext = "" On Error Resume Next ctext = .TextFrame.Characters.Text On Error Goto 0 If ctext Like "*" & searchWord & "*" Then ' 見つかった内容を書き込み Call writeSheet(searchPath, searchFile, sht.Name, .TopLeftCell.Address(False, False) & " *", ctext) End If End With Next Next ' ファイルを閉じる wb.Close saveChanges:=False End Sub ' 検索結果を書き込む Sub writeSheet(ByVal searchPath As String, ByVal searchFile As String, ByVal resultSheet As String, ByVal resultAddr As String, ByVal resultText As String) ThisWorkbook.Sheets(SHEET_OUTPUT).Cells(nowRow, CELL_PRINT_COL).Resize(, 6) = Array( _ Replace(searchPath, rootDir, "") _ , searchFile _ , resultSheet _ , resultAddr _ , Replace("=HYPERLINK(""["" & $B$3 & $A# & ""\"" & $B# & ""]"" & $C# & ""!"" & $D#, ""LINK"")", "#", nowRow) _ , resultText _ ) nowRow = nowRow + 1 End Sub
Step2. 操作シート
ファイル内に「search」シートを作成して、以下のテーブルをA1セルへ貼り付ける。
その後、フォーム部品からボタンを配置、スクリプトの「searchMacro()」を割り当てる。
| Excel-Grep検索 | |||||
| 検索フォルダ | |||||
| 検索ワード(部分一致、ワイルドカード可) | |||||
| ファイルフィルタ(ワイルドカード可) | |||||
| 除外フォルダ(";"区切り、完全一致) | |||||
| フォルダ名 | ファイル名 | シート名 | セル番号 | LINK | セル内容 |
【参考】自由にインストールが可能な場合に使いたいツール
TresGrep
- http://hp.vector.co.jp/authors/VA055804/TresGrep/
- 普段使用しているソフト。
検索が高速なことはもちろん、多様なファイル形式に対応していることから探し漏れが生じづらく信頼性が高い。
また、ソフト自体の起動終了が早いため、ちょっとした時にも使いやすい。
RelaxTools Addin
- http://software.opensquare.net/relaxtools/
- Excel用アドオン。Grep以外にも何かの時に使いそうなマクロが大量に含まれている。
以上
ソーシャルログイン 管理画面リンク集
はじめに
私はパスワード管理アプリとしてFirefoxのパスワード管理機能を使っていて、 各サービスのアカウント情報は基本的にそこに集まっています。
しかし、Webサービスの中にはパスワードを使わずにアカウント連携でログインしているものもあり、 それらは把握できていませんでした。 これらは「ソーシャルログイン」と呼ばれており、二段階認証など強固なセキュリティが一般的になるとともに近年対応サービスを増やしています。
今回、そういった連携サービスもきちんと把握していけるよう、 ソーシャルログイン機能を持つサービスとその管理画面をリンク集としてまとめることにしました。
提供者一覧
- 表示手順
- もっと見る > 設定とプライバシー > セキュリティとアカウントアクセス > アプリとセッション > 連携しているアプリ
- リンク
- https://twitter.com/settings/connected_apps
- 表示手順
- 右上アイコン > Googleアカウントを管理 > セキュリティ > アカウントにアクセスできるサードパーティ アプリ
- リンク
- https://myaccount.google.com/permissions
- 表示手順
- 右上の「アカウント&リスト」 > アカウントサービス > その他のアカウント > Amazonログインの設定
- リンク
- https://www.amazon.co.jp/ap/adam
LINE
- 表示手順
- ※PCからはアクセスできず、スマホアプリから管理画面を出さなければならない。
右上歯車アイコン > アカウント > 連動アプリYahoo!Japan
- 表示手順
- ユーザー名右にある「登録情報」 > プライバシー・メール配信 > 外部企業へのデータ提供設定 (または 各アプリケーションでのデータ利用)
- リンク
- https://accounts.yahoo.co.jp/privacy/optout/vendors (外部企業へのデータ提供設定)
https://accounts.yahoo.co.jp/privacy/optout/auth (各アプリケーションでのデータ利用)- 表示手順
- 右上アイコン > 設定とプライバシー > 設定 > アプリとウェブサイト
- リンク
- https://www.facebook.com/settings?tab=applications&apps_only
確認結果
| サービス名 | 管理状況 |
|---|---|
| Firefox | ユーザー名&パスワード:93件 |
| 連携しているアプリ | 23件 | |
| サードパーティ アプリ: Google でログイン:15件 Google のアプリ:2件 |
|
| Amazon | Amazonログイン:3件 |
| LINE | 連動アプリ:4件 |
| Yahoo!Japan | 外部企業へのデータ提供設定:2件 外部アプリケーションでのデータ利用:1件 Yahoo! JAPAN 公式アプリ:2件 |
| アプリとウェブサイト:0件 |
おわりに
結局、今回消したのはアプリ削除済みだったGoogleのサードパーティ認証1件のみでした。
今後も定期的に確認するよう心掛けたいと思います。
私は基本的にTwitter連携に集約していたつもりだったのですが、思ったよりもGoogle連携が沢山ありました。
ちなみに、世間一般的にはLINEが一番人気らしいです。
しかし、PCから管理できないのが面倒なので私がメインにすることは恐らく今後も無いでしょう…
なお、今回上げた以外にも、Mixiがソーシャルログインサービスを行なっているようです。
ただ私がそもそもMixiのアカウントを持っていないため確認できませんでした。
PT3のドライバ更新が失敗した (kernel 5.19.1-arch2-1)
TL;DR
- ArchLinuxにてpacman -Syuした際に、DKMSによるドライバ更新が失敗した
- 原因はカーネルバージョンアップに際し、レガシー関数pci_alloc_consistentにエラーが出るようになったため
- 既に対応パッチが出てるので、リポジトリを取り直して再ビルドしましょう
m-tsudo · GitHub
詳細
pacmanでこんな内容のエラーが出ました。
:: パッケージを取得します... linux-5.19.1.arch2-1-x86_64 178.4 MiB 4.32 MiB/s 00:41 [#####################################################################################] 100% (10/16) Updating module dependencies... depmod: ERROR: failed to load symbols from /lib/modules/5.19.1-arch2-1/kernel/sound/soc/intel/avs/snd-soc-avs.ko.zst: Invalid argument (11/16) Install DKMS modules ==> dkms install --no-depmod pt3_drv/0.0.1 -k 5.19.1-arch2-1 Error! Bad return status for module build on kernel: 5.19.1-arch2-1 (x86_64) Consult /var/lib/dkms/pt3_drv/0.0.1/build/make.log for more information. ==> WARNING: `dkms install --no-depmod pt3_drv/0.0.1 -k 5.19.1-arch2-1' exited 10
ログファイルの内容はこんな感じ。
最後の方にある「いくつかの警告はエラーとして取り扱われます」 という一文がなんとなく怪しいですね。
$ cat /var/lib/dkms/pt3_drv/0.0.1/build/make.log
DKMS make.log for pt3_drv-0.0.1 for kernel 5.19.1-arch2-1 (x86_64)
2022年 8月 16日 火曜日 22:08:37 JST
eval `sed -e "s/\[0\]//" ./dkms.conf`; \
GREV=`git rev-list HEAD | wc -l 2> /dev/null`; \
if [ $GREV != 0 ] ; then \
printf "#define DRV_VERSION \"${PACKAGE_VERSION}rev$GREV\"\n#define DRV_RELDATE \"`git show --date=short --format=%ad | sed -n '1p' 2> /dev/null`\"\n#define DRV_NAME \"${BUILT_MODULE_NAME}\"\n" > version.h; \
else \
printf "#define DRV_VERSION \"${PACKAGE_VERSION}\"\n#define DRV_RELDATE \"$PACKAGE_RELDATE\"\n#define DRV_NAME \"${BUILT_MODULE_NAME}\"\n" > version.h; \
fi
fatal: detected dubious ownership in repository at '/var/lib/dkms/pt3_drv/0.0.1/build'
To add an exception for this directory, call:
git config --global --add safe.directory /var/lib/dkms/pt3_drv/0.0.1/build
make -C /lib/modules/5.19.1-arch2-1/build M=`pwd` V=0 modules
make[1]: 警告: jobserver が利用不可: 今回は -j1 を使います. 親 make ルールに `+' を追加しましょう.
make[1]: ディレクトリ '/usr/lib/modules/5.19.1-arch2-1/build' に入ります
CC [M] /var/lib/dkms/pt3_drv/0.0.1/build/pt3_pci.o
/var/lib/dkms/pt3_drv/0.0.1/build/pt3_pci.c: 関数 ‘pt3_pci_init_one’ 内:
/var/lib/dkms/pt3_drv/0.0.1/build/pt3_pci.c:923:14: エラー: 関数 ‘pci_set_dma_mask’ の暗黙的な宣言です [-Werror=implicit-function-declaration]
923 | rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
| ^~~~~~~~~~~~~~~~
/var/lib/dkms/pt3_drv/0.0.1/build/pt3_pci.c:925:22: エラー: 関数 ‘pci_set_consistent_dma_mask’ の暗黙的な宣言です [-Werror=implicit-function-declaration]
925 | rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: いくつかの警告はエラーとして取り扱われます
make[2]: *** [scripts/Makefile.build:249: /var/lib/dkms/pt3_drv/0.0.1/build/pt3_pci.o] エラー 1
make[1]: *** [Makefile:1843: /var/lib/dkms/pt3_drv/0.0.1/build] エラー 2
make[1]: ディレクトリ '/usr/lib/modules/5.19.1-arch2-1/build' から出ます
make: *** [Makefile:12: pt3_drv.ko] エラー 2
自分でオプションを変更してもよかったのですが、この類のエラーは自分の環境だけではないだろうと思い、
upstreamを確認したところ以下のようなコミットを見つけました。
commit c10619da580e3a801b205df2ba4a95a850a38786
Author: fix@elementz <fix@elemsoft.com>
Date: Sat Jun 18 01:15:05 2022 +0900
Fix compile error on kernel 5.18.
M pt3_dma.c
M pt3_pci.c
という訳で、あとはgitからソースを再取得してインストール&DKMSをやり直して終了です。
$ sudo /bin/bash ./dkms.install [sudo] fuha のパスワード: Deleting module pt3_drv-0.0.1 completely from the DKMS tree. rm -vf /lib/modules/`uname -r`/kernel/drivers/video/pt3_drv.ko* /etc/udev/rules.d/99-pt3.rules '/usr/src/pt3_drv-0.0.1/pt3_tc.h' を削除しました '/usr/src/pt3_drv-0.0.1/pt3_bus.c' を削除しました '/usr/src/pt3_drv-0.0.1/pt3_bus.h' を削除しました '/usr/src/pt3_drv-0.0.1/pt3_mx.c' を削除しました '/usr/src/pt3_drv-0.0.1/pt3_i2c.h' を削除しました '/usr/src/pt3_drv-0.0.1/pt3_i2c.c' を削除しました '/usr/src/pt3_drv-0.0.1/dkms.install' を削除しました '/usr/src/pt3_drv-0.0.1/.gitignore' を削除しました '/usr/src/pt3_drv-0.0.1/pt3_tc.c' を削除しました '/usr/src/pt3_drv-0.0.1/Makefile' を削除しました '/usr/src/pt3_drv-0.0.1/COPYING' を削除しました '/usr/src/pt3_drv-0.0.1/.git/logs/HEAD' を削除しました '/usr/src/pt3_drv-0.0.1/.git/logs/refs/heads/master' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/logs/refs/heads' を削除しました '/usr/src/pt3_drv-0.0.1/.git/logs/refs/remotes/origin/HEAD' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/logs/refs/remotes/origin' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/logs/refs/remotes' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/logs/refs' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/logs' を削除しました '/usr/src/pt3_drv-0.0.1/.git/description' を削除しました '/usr/src/pt3_drv-0.0.1/.git/objects/pack/pack-74a2bbe7e502032cbbc16ae0607eb906cb1d65ea.idx' を削除しました '/usr/src/pt3_drv-0.0.1/.git/objects/pack/pack-74a2bbe7e502032cbbc16ae0607eb906cb1d65ea.pack' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/objects/pack' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/objects/info' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/objects' を削除しました '/usr/src/pt3_drv-0.0.1/.git/HEAD' を削除しました '/usr/src/pt3_drv-0.0.1/.git/refs/heads/master' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/refs/heads' を削除しました '/usr/src/pt3_drv-0.0.1/.git/refs/remotes/origin/HEAD' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/refs/remotes/origin' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/refs/remotes' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/refs/tags' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/refs' を削除しました '/usr/src/pt3_drv-0.0.1/.git/packed-refs' を削除しました '/usr/src/pt3_drv-0.0.1/.git/hooks/fsmonitor-watchman.sample' を削除しました '/usr/src/pt3_drv-0.0.1/.git/hooks/pre-merge-commit.sample' を削除しました '/usr/src/pt3_drv-0.0.1/.git/hooks/pre-push.sample' を削除しました '/usr/src/pt3_drv-0.0.1/.git/hooks/push-to-checkout.sample' を削除しました '/usr/src/pt3_drv-0.0.1/.git/hooks/pre-rebase.sample' を削除しました '/usr/src/pt3_drv-0.0.1/.git/hooks/applypatch-msg.sample' を削除しました '/usr/src/pt3_drv-0.0.1/.git/hooks/post-update.sample' を削除しました '/usr/src/pt3_drv-0.0.1/.git/hooks/pre-receive.sample' を削除しました '/usr/src/pt3_drv-0.0.1/.git/hooks/pre-applypatch.sample' を削除しました '/usr/src/pt3_drv-0.0.1/.git/hooks/commit-msg.sample' を削除しました '/usr/src/pt3_drv-0.0.1/.git/hooks/update.sample' を削除しました '/usr/src/pt3_drv-0.0.1/.git/hooks/prepare-commit-msg.sample' を削除しました '/usr/src/pt3_drv-0.0.1/.git/hooks/pre-commit.sample' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/hooks' を削除しました '/usr/src/pt3_drv-0.0.1/.git/config' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/branches' を削除しました '/usr/src/pt3_drv-0.0.1/.git/index' を削除しました '/usr/src/pt3_drv-0.0.1/.git/info/exclude' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/info' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/.git' を削除しました '/usr/src/pt3_drv-0.0.1/td/check_lfsr.c' を削除しました '/usr/src/pt3_drv-0.0.1/td/.gitignore' を削除しました '/usr/src/pt3_drv-0.0.1/td/Makefile' を削除しました '/usr/src/pt3_drv-0.0.1/td/td.c' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/td' を削除しました '/usr/src/pt3_drv-0.0.1/pt3_com.h' を削除しました '/usr/src/pt3_drv-0.0.1/dkms.uninstall' を削除しました '/usr/src/pt3_drv-0.0.1/pt3_qm.c' を削除しました '/usr/src/pt3_drv-0.0.1/pt3_ioctl.h' を削除しました '/usr/src/pt3_drv-0.0.1/pt3_pci.c' を削除しました '/usr/src/pt3_drv-0.0.1/README' を削除しました '/usr/src/pt3_drv-0.0.1/pt3_dma.h' を削除しました '/usr/src/pt3_drv-0.0.1/pt3_pci.h' を削除しました '/usr/src/pt3_drv-0.0.1/pt3_qm.h' を削除しました '/usr/src/pt3_drv-0.0.1/pt3_dma.c' を削除しました '/usr/src/pt3_drv-0.0.1/etc/99-pt3.rules' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1/etc' を削除しました '/usr/src/pt3_drv-0.0.1/pt3_mx.h' を削除しました '/usr/src/pt3_drv-0.0.1/dkms.conf' を削除しました ディレクトリ '/usr/src/pt3_drv-0.0.1' を削除しました Creating symlink /var/lib/dkms/pt3_drv/0.0.1/source -> /usr/src/pt3_drv-0.0.1 Sign command: /usr/lib/modules/5.19.1-arch2-1/build/scripts/sign-file Signing key: /var/lib/dkms/mok.key Public certificate (MOK): /var/lib/dkms/mok.pub Building module: Cleaning build area.... make -j2 KERNELRELEASE=5.19.1-arch2-1 KVER=5.19.1-arch2-1 dkms.......................... Signing module /var/lib/dkms/pt3_drv/0.0.1/build/pt3_drv.ko Cleaning build area...kj pt3_drv.ko.zst: Running module version sanity check. - Original module - No original module exists within this kernel - Installation - Installing to /usr/lib/modules/5.19.1-arch2-1/updates/dkms/ depmod.................
あとがき
注意点として、pacmanによる更新をした直後だと「uname -r」で取れるカーネルバージョンが昔のバージョンのままのため、linux-headerのバージョンが合わずMakeが失敗する。 Make前に一回再起動することで回避ができる。
archlinuxの更新でQEMU関連ファイルがエラーを吐いた話
ある日、パッケージ更新をしようとした所以下のようなエラーが表示された。
エラー: 処理を完了できませんでした (衝突しているファイル) seabios: /usr/share/qemu/bios-microvm.bin がファイルシステムに存在しています (qemu によって所有されています) seabios: /usr/share/qemu/vgabios-ati.bin がファイルシステムに存在しています (qemu によって所有されています) エラーが発生したため、パッケージは更新されませんでした。
Wikiを調べた結果、「qemuは3つのパッケージに分割された」という趣旨のリリースがあった。
この変更のせいで変な競合の仕方をしたと思われる。
というわけで、一旦消してから入れ直すことにした。
なお、筆者の場合QEMUはVirtualBox用にインストールしたものであり、
現在もいくつかVirtualBoxの環境を持っている。
ただ、アンインストールしたとしてもいきなりユーザーデータを消したりはしないだろう
ということでそのまま削除した。
結果、滞りなく更新は終了し、VirtualBoxも以前と変わりなく利用できた。
以上
余談
見返した所、更新の実行前に時に以下のような確認が出ていたので、 ここでそのままYesにしても同じ結果になったかもしれない。
ただ、毎回ちゃんとそのまま置換できるパッケージが提案されるとは限らないと思うので、 一応確認したことは意味がある…はず。