📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| (同じ利用者による、間の4版が非表示) | |||
| 46行目: | 46行目: | ||
zlib-devel zlib-devel-32bit zlib-devel-static zlib-devel-static-32bit \ | zlib-devel zlib-devel-32bit zlib-devel-static zlib-devel-static-32bit \ | ||
readline-devel-static pcre-devel-static pcre2-devel pcre2-devel-static \ | readline-devel-static pcre-devel-static pcre2-devel pcre2-devel-static \ | ||
libbpf-devel-static sysprof | libbpf-devel-static sysprof-devel xfsprogs-devel perl-Text-Markdown | ||
<br> | <br> | ||
QEMUのソースコードをダウンロードする。<br> | QEMUのソースコードをダウンロードする。<br> | ||
| 133行目: | 133行目: | ||
export PATH="/<QEMU-User-Staticのインストールディレクトリ>/bin:/<QEMU-User-Staticのインストールディレクトリ>/sbin:$PATH" | export PATH="/<QEMU-User-Staticのインストールディレクトリ>/bin:/<QEMU-User-Staticのインストールディレクトリ>/sbin:$PATH" | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | |||
== QEMUバイナリフォーマット設定スクリプト (binfmt登録スクリプト) == | |||
==== スクリプトの実行 ==== | |||
このシェルスクリプトは、"binfmt script" や "QEMU binfmt setup" と略称されることもある。<br> | |||
<br> | |||
QEMUバイナリフォーマット設定スクリプトは、異なるアーキテクチャのバイナリをLinuxカーネルのbinfmt_misc機能を使用して自動的に実行できるように設定するものである。<br> | |||
<br> | |||
各オプションの意味を以下に示す。<br> | |||
* --qemu-path <パス> | |||
*: QEMUインタープリタのインストールパスを指定する。 | |||
*: デフォルトでは環境変数<code>$QEMU_PATH</code>の値が使用される。 | |||
*: <br> | |||
* --qemu-suffix <サフィックス> | |||
*: QEMUインタープリタ名に接尾辞を追加する。 | |||
*: 例えば、複数バージョンのQEMUを区別する際に使用する。 | |||
*: <br> | |||
* --debian | |||
*: /procディレクトリに直接書き込まず、Debian / Ubuntu系のupdate-binfmtsコマンド用のテンプレートファイルを生成する。 | |||
*: <br> | |||
* --systemd <各アーキテクチャ名> | |||
*: /procディレクトリに直接書き込まず、systemd-binfmt.service用の設定ファイルを生成する。 | |||
*: <各アーキテクチャ名>には、具体的なアーキテクチャ (例: aarch64) を指定すると、そのアーキテクチャのみの設定を生成する。 | |||
*: また、<各アーキテクチャ名> に <code>ALL</code> を指定すると、全てのサポートCPUの設定を生成する。 | |||
*: <br> | |||
* --exportdir <パス> | |||
*: 設定ファイルの出力先ディレクトリを指定する。 | |||
*: デフォルトは以下の通り。 | |||
** systemdモード | |||
**: /etc/binfmt.d | |||
** debianモード | |||
**: /usr/share/binfmts | |||
*: <br> | |||
* セキュリティ・動作関連オプション | |||
*: <br> | |||
* --credential <yes または no> | |||
*: 重要なセキュリティオプション | |||
** yes | |||
**: 実行されるバイナリに基づいてクレデンシャル (UID / GID) やセキュリティトークンが計算される。 | |||
** no (デフォルト) | |||
**: インタープリタのクレデンシャルが使用される。 | |||
*: <br> | |||
*: binfmt_miscの <code>O</code> および <code>C</code> フラグに対応し、setuid / setgidバイナリの安全な実行に関連する。 | |||
*: <br> | |||
* --persistent <yes または no> | |||
*: パフォーマンスとメモリに関するオプション | |||
** yes | |||
**: binfmt設定時にインタープリタがメモリにロードされ、常駐する。以降の実行はこのオープンファイルからクローンされる。 | |||
**: yesを指定すると、インタープリタファイルが削除されても動作し続けるが、メモリを消費する。コンテナ環境で有用である。 | |||
** no (デフォルト) | |||
**: 実行の度にインタープリタファイルが読み込まれる。 | |||
*: <br> | |||
* --preserve-argv0 <yes または no> | |||
** yes | |||
**: 元のプログラム名を argv[0] として保持する。 | |||
** no (デフォルト) | |||
**: インタープリタ名が argv[0] になる。 | |||
**: プログラムが自分の名前を参照する動作に影響する。 | |||
*: <br> | |||
* --ignore-family <yes または no> | |||
** yes | |||
**: ホストCPUが同じファミリーのプログラムをネイティブに実行できないと仮定する。(例: RISC-V 64ホスト上でRISC-V 32プログラムも変換) | |||
** no (デフォルト) | |||
**: 同じファミリー内は互換性があると仮定する。 | |||
<br> | |||
# 使用例 | |||
# systemd環境で全アーキテクチャの設定を生成 | |||
sudo ./qemu-binfmt-conf.sh --systemd ALL --persistent yes | |||
# Debian環境でARM64のみ設定 | |||
sudo ./qemu-binfmt-conf.sh --debian --systemd aarch64 --credential yes | |||
# Docker等でpersistentモードを使用 | |||
./qemu-binfmt-conf.sh --persistent yes --credential yes | |||
<br> | |||
このスクリプトは、クロスプラットフォーム開発やDockerでのマルチアーキテクチャビルドにも使用されることもある。<br> | |||
<br> | |||
==== binfmt_miscの登録の解除 ==== | |||
<code>--persistent yes</code> で実行した後、メモリ上のインタープリタを削除するには、binfmt_miscの登録を解除する必要がある。<br> | |||
<br> | |||
* 方法1 | |||
*: 個別のアーキテクチャを削除 | |||
# 特定のアーキテクチャを削除 (例:aarch64) | |||
echo -1 | sudo tee /proc/sys/fs/binfmt_misc/qemu-aarch64 | |||
<br> | |||
* 方法2 | |||
*: 全てのbinfmt登録を一括削除 | |||
*: <code>-1</code> を書き込むと登録が削除され、persistent設定でメモリに常駐していたインタープリタも解放される。 | |||
*: 再度使用する場合は、スクリプトを再実行する必要がある。 | |||
# 全てのbinfmt_misc登録を削除 | |||
echo -1 | sudo tee /proc/sys/fs/binfmt_misc/status | |||
<br> | |||
* 方法3 | |||
*: systemdを使用している場合 | |||
# systemd-binfmtサービスを停止 (全ての登録が削除される) | |||
sudo systemctl stop systemd-binfmt.service | |||
# または再起動 (設定ファイルを削除してから) | |||
sudo rm /etc/binfmt.d/qemu-*.conf | |||
sudo systemctl restart systemd-binfmt.service | |||
<br> | |||
* 方法4 | |||
*: Debian / Ubuntu系でupdate-binfmtsを使用 | |||
# 特定のアーキテクチャを無効化 | |||
sudo update-binfmts --disable qemu-aarch64 | |||
# 完全に削除 | |||
sudo update-binfmts --package qemu-aarch64 --remove qemu-aarch64 /usr/bin/qemu-aarch64-static | |||
<br> | |||
==== binfmt_miscの確認方法 ==== | |||
登録状況を確認する。<br> | |||
<br> | |||
# 登録されているbinfmt一覧 | |||
ls /proc/sys/fs/binfmt_misc/ | |||
# 特定の登録の詳細 | |||
cat /proc/sys/fs/binfmt_misc/qemu-aarch64 | |||
<br><br> | <br><br> | ||
| 288行目: | 406行目: | ||
<Raspberry Pi OS (AArch64) のイメージファイル名>.raw \ | <Raspberry Pi OS (AArch64) のイメージファイル名>.raw \ | ||
/mnt | /mnt | ||
sudo mount --bind /sys /mnt/sys && sudo mount --make-rslave /mnt/sys && \ | |||
sudo mount --bind /dev /mnt/dev && sudo mount --make-rslave /mnt/dev && \ | |||
sudo mount --bind /proc /mnt/proc && sudo mount --make-rslave /mnt/proc && \ | |||
sudo mount --bind /dev/pts /mnt/dev/pts | |||
# または | |||
sudo mount --rbind /sys /mnt/sys && sudo mount --make-rslave /mnt/sys && \ | |||
sudo mount --rbind /dev /mnt/dev && sudo mount --make-rslave /mnt/dev && \ | |||
sudo mount --rbind /proc /mnt/proc && sudo mount --make-rslave /mnt/proc && \ | |||
sudo mount --rbind /dev/pts /mnt/dev/pts | |||
sudo cp /run/netconfig/resolv.conf /mnt/etc/ | |||
<br> | <br> | ||
AArch64命令セットを動作させるために必要なライブラリを、Raspberry Pi OS (AArch64) のマウント先ディレクトリにコピーする。<br> | AArch64命令セットを動作させるために必要なライブラリを、Raspberry Pi OS (AArch64) のマウント先ディレクトリにコピーする。<br> | ||
| 305行目: | 435行目: | ||
sudo umount -dfl /mnt/proc; \ | sudo umount -dfl /mnt/proc; \ | ||
sudo umount -dfl /mnt | sudo umount -dfl /mnt | ||
<br><br> | |||
== エラー関連 == | |||
==== ロケールの警告 ==== | |||
chrootコマンドを実行して異なるアーキテクチャのイメージファイルにアクセスする時、以下に示す警告が表示される場合がある。<br> | |||
この警告メッセージは、ホスト側のx64システムとchroot先の環境の間で、ロケール設定の不一致が起きているためである。<br> | |||
bash: warning: setlocale: LC_CTYPE: cannot change locale (ja_JP.UTF-8): No such file or directory | |||
<br> | |||
* 方法 1 | |||
*# まず、localesパッケージをインストールする。 | |||
*#: <code>apt update</code> | |||
*#: <code>apt install locales</code> | |||
*# 次に、ロケールの自動生成を行う。 | |||
*#: <code>dpkg-reconfigure locales</code> | |||
*: <br> | |||
* 方法 2 | |||
*# ロケール設定ファイルを編集して、<code>ja_JP.UTF-8 UTF-8</code> のコメントアウトを外して有効化する。 | |||
*#: <code>vi /etc/locale.gen</code> | |||
*# 変更を反映する。 | |||
*#: <code>locale-gen</code> | |||
<br><br> | <br><br> | ||