Install bundled 32-bit system in 64-bit system
zh-CN:Install bundled 32-bit system in Arch64 Template:Article summary start Template:Article summary text Template:Article summary end
Contents
Install the Base 32-bit System
1. Create the directory:
mkdir /opt/arch32
2. Generate temporary pacman configuration files for chroot:
sed -e 's/\$arch/i686/g' /etc/pacman.d/mirrorlist > /opt/arch32/mirrorlist sed -e 's@/etc/pacman.d/mirrorlist@/opt/arch32/mirrorlist@g' /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 enable it, in the /opt/arch32/pacman.conf
file
The --root
switch in the pacman command below will create /var/log/pacman.log
and /var/lib/pacman/db.lck
inside /opt/arch32
. The pacman log will be /opt/arch32/var/log/pacman.log
and will not interfere with the native 64-bit installation. There is no need for a LogFile
directive in /etc/pacman.conf
or a --logfile
switch.
The --cachedir
switch is for the package to be cached in /opt/arch32/var/cache/pacman/pkg
instead of /var/cache/pacman/pkg
.
Use the --config
switch to tell pacman to use the configuration file generated above, rather than /etc/pacman.conf
.
3. Create the directory, just to be sure:
mkdir -p /opt/arch32/var/{cache/pacman/pkg,lib/pacman}
3b. Edit 'Architecture' for pacman >= 3.4
# In /opt/arch32/pacman.conf # Architecture=auto Architecture=i686
3c. Users following the Arch installer method will have a line at the top of /etc/pacman.d/mirrorlist
similar to:
# Mirror used during installation Server = http://mirror.rit.edu/archlinux/$repo/os/x86_64
The 'sed' command above searches for instances of '$arch' and replaces them with 'i686'. Unfortunately, since this installation mirror is explicitly set as x86_64, it is not replaced and will cause issues. Either comment it out or change it like so:
Server = http://mirror.rit.edu/archlinux/$repo/os/i686
4. Sync pacman:
pacman --root /opt/arch32 --cachedir /opt/arch32/var/cache/pacman/pkg --config /opt/arch32/pacman.conf -Sy
5. Install the base and optionally base-devel groups:
pacman --root /opt/arch32 --cachedir /opt/arch32/var/cache/pacman/pkg --config /opt/arch32/pacman.conf -S base base-devel
Optionally remove the temporary pacman configuration files.
rm /opt/arch32/{mirrorlist,pacman.conf}
6. To use the newly installed pacman, uncomment some mirrors in /opt/arch32/etc/pacman.d/mirrorlist
and make any other desired changes to the new pacman installation.
7. Edit your /opt/arch32/etc/pacman.conf and change that Architecture from auto back to i686.
Create an Arch32 Daemon Script and Systemd Service
/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 # Add '/var/run /var/lib/dbus' to the list to enable pulseaudio. dirs=(/dev /dev/pts /dev/shm /tmp /home) case $1 in start) for d in "${dirs[@]}"; do mount -o bind $d /opt/arch32$d done ;; stop) for (( i = ${#dirs[@]} - 1; i >= 0; i-- )); do umount "/opt/arch32${dirs[i]}" done umount /opt/arch32/{proc,sys} ;; *) echo "usage: $0 (start|stop)" exit 1 esac
Be sure to make the init script executable:
# chmod +x /usr/local/bin/arch32
Enable the service as any other systemd service.
Configure the new system
Configuration files
Key configuration files should be copied over:
cd /opt/arch32/etc cp /etc/passwd* . cp /etc/shadow* . cp /etc/group* . cp /etc/sudoers . # note: you'll need to install sudo before creating this entry, or sudo will refuse to install cp /etc/rc.conf . cp /etc/resolv.conf . cp /etc/localtime . cp /etc/locale.gen . cp /etc/profile.d/locale.sh profile.d cp /etc/vimrc . cp /etc/mtab . cp /etc/sudoers .
Be sure to include the "." character.
Configure the chroot
Chroot into the new system:
/etc/rc.d/arch32 start xhost +SI:localuser:usernametogiveaccesstogoeshere 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.
Before continuing, keep in mind that the file /etc/pacman.conf
from the 32-bit environment is the default one. Make sure to uncomment some mirrors in /etc/pacman.d/mirrorlist
.
Fix possible locale issues:
/usr/sbin/locale-gen
Install the needed packages including apps, fonts, etc. for example:
pacman -S acroread opera pacman -S firefox pacman -S flashplugin pacman -S mplayer-plugin
Regain space by removing some unnecessary packages.
The following shows recommended packages for removal:
pacman -Rd linux mkinitcpio pacman -R dhcpcd ppp xfsprogs reiserfsprogs jfsutils logrotate lvm2 pcmciautils netcfg heirloom-mailx iputils iproute2 man-pages mdadm inetutils man-db cronie vi
Also consider regularly clearing out pacman's cache:
pacman -Scc
Install and Configure Schroot
Install "schroot" to the native 64-bit installation:
pacman -S schroot
Edit /etc/schroot/schroot.conf
, and create an [Arch32] section.
[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 /etc/rc.d/arch32
.
Using Schroot to run a 32-bit application
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.
Troubleshooting
Compilation and installing
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.
You may need to give users write access to your chroot's /dev/null to stop some scripts from failing:
chmod 666 /dev/null
Video issues
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. For example,
pacman -S nvidia
Sound in flash (youtube, etc.)
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:
pacman -S alsa-oss
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
Java in a chroot
See Java for installation instructions.
After installing, adjust the path to get Java working:
export PATH="/opt/java/bin/:$PATH"
arch32-light
Xyne has created a package that installs a minimalist 32-bit chroot as described above. More information can be found on the forum and on the project page.
Allowing 32-bit applications access to 64-bit Pulseaudio
Add these lines in /etc/rc.d/arch32
, above add_daemon arch32
:
mount --bind /var/run /opt/arch32/var/run mount --bind /var/lib/dbus /opt/arch32/var/lib/dbus
And above rm_daemon arch32
:
umount /opt/arch32/var/run umount /opt/arch32/var/lib/dbus
More information is available at the Pulseaudio article, especially the section on Pulseaudio from within a chroot.
Enabling sound in Firefox
Open a text editor and save the following in /usr/bin/firefox32
as root:
#!/bin/sh schroot -p firefox $1;export FIREFOX_DSP="aoss"
Make it executable:
sudo chmod +x /usr/bin/firefox32
Now you can make an alias for Firefox, if desired:
alias firefox="firefox32"
Add this to the end of file ~/.bashrc
and source it to enable its usage. Or you can just change all your desktop environment's launchers to firefox32 if you still want 64-bit Firefox to be available.
Enabling 3D acceleration
In case you want to run any 32 bit application under your chroot with 3D acceleration (e.g. WINE, native 32 bit games) you simply need to install the corresponding libs as under your "native" arch.
For an ATI card using the radeon driver this could be:
pacman -S xf86-video-ati libgl ati-dri
For more informations on how to set up your graphic adapter refer to:
Your can easily check if you have 3D rendering within the 32 bit chroot by installing mesa-demos and running the following command:
glxinfo | grep renderer
If you have no 3D acceleration you'll get some output like this:
[joe@arch64]$ OpenGL renderer string: Software Rasterizer
If 3D acceleration is enabled you'll get a message like this:
[joe@arch64]$ OpenGL renderer string: Mesa DRI R600 (RV730 9490) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
Script for 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-hacks 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
.