64ビット環境に32ビット環境をインストール
この記事では32ビットのアプリケーションを動作させる一つの方法を説明しています。multilib リポジトリから lib32-* ライブラリをインストールする代わりに32ビットのアプリケーションを分離させます。この方法では "chroot 監獄" を作成して32ビットのアプリを管理します。
目次
インストール
1. ディレクトリを作成:
# mkdir /opt/arch32
2. chroot 用に一時的な pacman の設定ファイルを作成:
# sed -e 's/\$arch/i686/g' /etc/pacman.d/mirrorlist > /opt/arch32/mirrorlist # sed -e 's@/etc/pacman.d/mirrorlist@/opt/arch32/mirrorlist@g' -e '/Architecture/ s,auto,i686,' /etc/pacman.conf > /opt/arch32/pacman.conf
- These files would conflict with the normal pacman files, which will be installed in the later steps.
- For this reason they must be put into a temporary location (
/opt/arch32
is used here). - Remember to delete/comment the multilib repo, if you have enabled it, in the
/opt/arch32/pacman.conf
file
3. ディレクトリを作成:
# mkdir -p /opt/arch32/var/{cache/pacman/pkg,lib/pacman}
4. pacman を同期:
# pacman --root /opt/arch32 --cachedir /opt/arch32/var/cache/pacman/pkg --config /opt/arch32/pacman.conf -Sy
5. base グループと任意で base-devel グループをインストール:
# pacman --root /opt/arch32 --cachedir /opt/arch32/var/cache/pacman/pkg --config /opt/arch32/pacman.conf -S base base-devel
Optionally add your favorite text editor and distcc if you plan to compile within the chroot with other machines:
# pacman --root /opt/arch32 --cachedir /opt/arch32/var/cache/pacman/pkg --config /opt/arch32/pacman.conf -S base base-devel sudo vim distcc
Optionally move the pacman mirror list into place:
# mv /opt/arch32/mirrorlist /opt/arch32/etc/pacman.d
設定
重要な設定ファイルをコピーしてください:
# for i in passwd* shadow* group* sudoers resolv.conf localtime locale.gen vimrc mtab inputrc profile.d/locale.sh; do cp -p /etc/"$i" /opt/arch32/etc/; done
Remember to define the correct the number of MAKEFLAGS and other vars in /opt/arch32/etc/makepkg.conf
before attempting to build.
デーモンと systemd サービス
/etc/systemd/system/arch32.service
[Unit] Description=32-bit chroot [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/local/bin/arch32 start ExecStop=/usr/local/bin/arch32 stop [Install] WantedBy=multi-user.target
/usr/local/bin/arch32
#!/bin/bash ## User variables. MOUNTPOINT=/opt/arch32 ## Set MANAGEPARTITION to any value if /opt/arch32 resides on a separate ## partition and not mounted by /etc/fstab or some other means. ## If /opt/arch32 is part of your rootfs, leave this empty. MANAGEPARTITION= ## Leave USEDISTCC empty unless you wish to use distccd from within the chroot. USEDISTCC= DISTCC_SUBNET='10.9.8.0/24' ## PIDFILE shouldn't need to ba changed from this default. PIDFILE=/run/arch32 start_distccd() { [[ ! -L "$MOUNTPOINT"/usr/bin/distccd-chroot ]] && ln -s /usr/bin/distccd "$MOUNTPOINT"/usr/bin/distccd-chroot DISTCC_ARGS="--user nobody --allow $DISTCC_SUBNET --port 3692 --log-level warning --log-file /tmp/distccd-i686.log" [[ -z "$(pgrep distccd-chroot)" ]] && linux32 chroot "$MOUNTPOINT" /bin/bash -c "/usr/bin/distccd-chroot --daemon $DISTCC_ARGS" } stop_distccd() { [[ -n "$(pgrep distccd-chroot)" ]] && linux32 chroot "$MOUNTPOINT" /bin/bash -c "pkill -SIGTERM distccd-chroot" } case $1 in start) [[ -f "$PIDFILE" ]] && exit 1 if [[ -n "$MANAGEPARTITION" ]]; then mountpoint -q $MOUNTPOINT || mount LABEL="arch32" $MOUNTPOINT fi dirs=(/tmp /dev /dev/pts /home) for d in "${dirs[@]}"; do mount -o bind $d "$MOUNTPOINT"$d done mount -t proc none "$MOUNTPOINT/proc" mount -t sysfs none "$MOUNTPOINT/sys" touch "$PIDFILE" [[ -n "$USEDISTCC" ]] && start_distccd ;; stop) [[ ! -f "$PIDFILE" ]] && exit 1 [[ -n "$USEDISTCC" ]] && stop_distccd if [[ -n "$MANAGEPARTITION" ]]; then umount -R -A -l "$MOUNTPOINT" else dirs=(/home /dev/pts /dev /tmp) [[ -n "$USEDISTCC" ]] && stop_distccd umount "$MOUNTPOINT"/{sys,proc} for d in "${dirs[@]}"; do umount -l "$MOUNTPOINT$d" done fi rm -f "$PIDFILE" ;; *) echo "usage: $0 (start|stop)" exit 1 esac
初期化スクリプトに実行可能属性を付与してください:
# chmod +x /usr/local/bin/arch32
設定
新しい環境に chroot:
# /usr/local/bin/arch32 start $ xhost +SI:localuser:username_to_give_access_to # chroot /opt/arch32
It is recommended to use a custom bash prompt inside the 32-bit chroot installation in order to differentiate from the regular system. You can, for example, add a ARCH32 string to the PS1 variable defined in ~/.bashrc
. In fact, the default Debian .bashrc prompt string contains appropriate logic to report whether the working directory is within a chroot.
初期設定
ロケールの問題を修正:
# /usr/bin/locale-gen
pacman を初期化:
# sed -i 's/CheckSpace/#CheckSpace/' /etc/pacman.conf # pacman-key --init && pacman-key --populate archlinux
Schroot
schroot をネイティブの64ビット環境にインストール:
/etc/schroot/schroot.conf
を編集して [Arch32] セクションを作成して下さい。
[Arch32] type=directory profile=arch32 description=Arch32 directory=/opt/arch32 users=user1,user2,user3 groups=users root-groups=root personality=linux32 aliases=32,default
Optionally edit /etc/schroot/arch32/mount
to match the mounts created within /usr/local/bin/arch32
.
Schroot を使って32ビットのアプリケーションを実行
The general syntax for calling an application inside the chroot is:
# schroot -p -- htop
In this example, htop is called from within the 32-bit environment.
トラブルシューティング
コンパイルとインストール
Ensure the desired options are set in the local /etc/makepkg.conf
.
Some packages may require a --host
flag be added to the ./configure script in the PKBUILD:
$ ./configure --host="i686-pc-linux" ...
This is the case when the build makes use of values (for example, the output of the uname
command) inherited from your base system.
ビデオ問題
If you get:
X Error of failed request: BadLength (poly request too large or internal Xlib length error)
while trying to run an application that requires video acceleration, make sure you have installed appropriate video drivers in your chroot.
Flash の音声
To get sound from the flash player in Firefox, open a terminal and chroot inside the 32-bit system:
# chroot /opt/arch32
From there, install alsa-oss as usual with pacman.
Then type:
$ export FIREFOX_DSP="aoss"
Every chroot into the 32-bit system will require this export command to be entered so it may be best to incorporate it into a script.
Finally, launch Firefox.
For Wine this works the same way. The package alsa-oss will also install the alsa libs required by Wine to output sound.
Tips and tricks
chroot の Java
See Java. After installation, adjust the path:
$ export PATH="/opt/java/bin/:$PATH"
32ビットアプリケーションから64ビットの PulseAudio にアクセス
Additional paths have to be bind-mounted to the chroot environment:
# mount --bind /var/run /opt/arch32/var/run # mount --bind /var/lib/dbus /opt/arch32/var/lib/dbus
Unmount them when leaving the environment:
# umount /opt/arch32/var/run # umount /opt/arch32/var/lib/dbus
Optionally add the commands to the /usr/local/bin/arch32
script after the other bind-mount/umount commands. See PulseAudio from within a chroot for details
Firefox の音声
Create /usr/bin/firefox32
as root:
#!/bin/sh schroot -p firefox $1;export FIREFOX_DSP="aoss"
Make it executable:
# chmod +x /usr/bin/firefox32
Now you can make an alias for Firefox, if desired:
alias firefox="firefox32"
Add this to ~/.bashrc
and source it to enable it. Or you can just change all your desktop environment's launchers to firefox32 if you still want 64-bit Firefox to be available.
3D アクセラレーション
You need to install the corresponding package under your "native" arch for 3D support.
For information on how to set up your graphic adapter refer to:
Wine
In order to compile wine, you need a 32-bit system installed. Compiling wine is needed for applying patches in order to get PulseAudio working. See also wine-hacksAUR from AUR.
Add the following alias to ~/.bashrc
:
alias wine='schroot -pqd "$(pwd)" -- wine'
The -q
switch makes schroot operate in quiet mode, so it works like "regular" wine does. Also note that If you still use dchroot instead of schroot, you should use switch -d
instead of -s
.
印刷
To access installed CUPS printers from the chroot environment, one needs to bind the /var/run/cups
directory to the same (relative) location in the chroot environment.
Simply make sure the /var/run/cups
directory exists in the chroot environment and bind-mount the host /var/run/cups
to the chroot environment:
# mkdir chroot32-dir/var/run/cups # mount --bind /var/run/cups chroot32-dir/var/run/cups
and printers should be available from 32-bit chroot applications immediately.