📢 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-capture-devel-static xfsprogs-devel perl-Text-Markdown
                     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>