search
LoginSignup
0

More than 1 year has passed since last update.

posted at

updated at

ビッグエンディアン検証環境構築 (Debian + systemd-nspawn)

市販のパソコンでビッグエンディアンの機器が絶滅して久しいが(異論あればコメントお願いします)、Debian (Ubuntu可) でビッグエンディアンでのプログラム動作検証環境を割と手っ取り早く作る手順です。ビッグエンディアンのCPU用のDebian Linuxが動作するコンテナを作ります。

エンディアンって何よ?

endian.c
#include <stdio.h>

int main(void)
{
  unsigned int test = 0x12345678;
  int i; unsigned char *ptr = &test;
  for(i=0; i<sizeof test; i++) printf("%02X ", (unsigned int)ptr[i]);
  putchar('\n');
  return 0;
}

をコンパイルして実行すると

$ ./a.out 
12 34 56 78 

となるのがビッグエンディアンです。ARM, PowerPC, MIPSなどはエンディアンを選べます。「京」コンピュータで使われたSPARCはビッグエンディアン固定です。一方

$ ./a.out 
78 56 34 12 

となるのがリトルエンディアンです。インテル・AMDのCPUはリトルエンディアンです。

qemu-user-static のインストール

qemu-user-static はホストLinuxのCPUとは異なるCPU用の実行可能ファイルを直接動作させるためのDebianパッケージです。これをインストールします。

# apt-get install qemu-user-static binfmt-support

systemd-nspawn 用のディレクトリツリーの展開

MIPS (32-bit big endian) 向けDebianの展開

MIPS 向け Debian Buster のコンテナ用ディレクトリツリーを展開します。

# mkdir -p /var/lib/machines
# cd /var/lib/machines
# btrfs subvolume create mips-buster (もしbtrfs使ってれば)
# mmdebstrap --components="main contrib non-free" --architectures=mips --variant=apt\
 --include=systemd-sysv,libpam-systemd,libnss-systemd,dbus-user-session,locales,tzdata,apt-utils,whiptail,vim-tiny,bash \
 buster mips-buster

上記の手順だとコンテナ内に最小限のパッケージしか入らないので、より多くのパッケージを入れたい場合、 --variant=important あるいは --variant=standardmmdebstrap のオプションに指定して下さい。

PowerPC (64-bit big endian)向けDebianの展開

PowerPC 向け Debian PPC64 のコンテナ用ディレクトリツリーを展開します。PPC64 は https://buildd.debian.org/stats/graph2-week-big.png にあるようにDebian Ports の中ではかなりまともです。まず

/var/tmp/ports.txt
deb http://deb.debian.org/debian-ports sid main
deb-src http://deb.debian.org/debian sid main
deb http://deb.debian.org/debian-ports unreleased main
deb-src http://deb.debian.org/debian-ports unreleased main

を作ります。その後に

# apt-get install debian-ports-archive-keyring
# cd /var/lib/machines
# btrfs subvolume create ppc64-sid (もしbtrfs使ってれば)
# cat /var/tmp/ports.txt | 
 mmdebstrap --components="main" --architectures=ppc64 --variant=apt \\
 --include=debian-ports-archive-keyring,systemd-sysv,libpam-systemd,libnss-systemd,dbus-user-session,locales,tzdata,apt-utils,whiptail,vim-tiny,bash \\
 sid ppc64-sid -

とすると、/var/lib/machines/ppc64-sid 以下にsystemd-nspan 用のディレクトリツリーができます。 --variant=apt 以外を指定するとパッケージの欠如によりエラーが出ることがあります。

コンテナの設定

最低限のコンテナの設定をします。PPC64を使う場合 mips-busterppc64-sid に置き換えて下さい

# systemd-nspawn -M mips-buster -a
以下はコンテナ内部で
# passwd (ルートのパスワードの設定)
# dpkg-reconfigure tzdata (タイムゾーンの設定)
# dpkg-reconfigure locales (ロカールの設定)
# echo mips-buster >/etc/hostname
# exit (コンテナから抜ける)

これで最低限のコンテナの設定ができたので、 systemd-nspawn -M mips-buster -b でコンテナを起動し、 machinectl shell mips-buster でコンテナ内のシェルを起動して操作して下さい。

qemu-user-static の限界

gdb や アドレスサニタイザー が使えません。未定義サニタイザー は使えます。Debian MIPSには libubsan が無いため -fsanitize-undefined-trap-on-errorgcc にオプションとして渡すと未定義サニタイザーが使えます。PPC64ではそういう細工は要りません。

Failed to enqueue loopback interface start request: Operation not supported

というエラーメッセージが出た場合、 https://bugs.launchpad.net/qemu/+bug/1886811 のパッチを当てると直る可能性があります。 Debian port PowerPC (32-bit big endian) の場合はそのパッチが必要です

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0