Difference between revisions of "Install bundled 32-bit system in 64-bit system"

From ArchWiki
Jump to: navigation, search
(Install and Configure Schroot: updated with new profile key since script-config key is out-dated and throws warnings upon execution)
(improve install link as recommended in Help:Style#Package management instructions)
 
(91 intermediate revisions by 22 users not shown)
Line 1: Line 1:
[[Category:Arch64]]
+
[[Category:Getting and installing Arch]]
[[cs:32bit chroot]]
+
[[cs:Install bundled 32-bit system in 64-bit system]]
 
[[fr:Install environnement 32 sur un systeme 64]]
 
[[fr:Install environnement 32 sur un systeme 64]]
[[zh-CN:Install bundled 32-bit system in Arch64]]
+
[[ja:64ビット環境に32ビット環境をインストール]]
{{Article summary start}}
+
[[zh-cn:Install bundled 32-bit system in 64-bit system]]
{{Article summary text|
+
This article presents one way of running 32-bit applications, which may be of use to those who do not wish to install the lib32-* libraries from the multilib repository and instead prefer to isolate 32bit applications. The approach involves creating a "chroot jail" to handle 32-bit apps.
This article presents one way of running 32-bit applications, which may be of use to those who do not wish to install the lib32-* libraries from the multilib repository and instead prefer to isolate 32bit applications. The approach involves creating a "chroot jail" to handle 32-bit apps.}}
+
 
{{Article summary end}}
+
{{Tip|1=Xyne has created a package that installs a minimalist 32-bit chroot as described below. See [https://bbs.archlinux.org/viewtopic.php?id=97629] and [http://xyne.archlinux.ca/projects/arch32-light] for details.}}
 +
 
 +
== Installation ==
  
==Install the Base 32-bit System==
 
 
1. Create the directory:
 
1. Create the directory:
{{bc|mkdir /opt/arch32}}
+
 
 +
# mkdir /opt/arch32
  
 
2. Generate temporary [[pacman]] configuration files for chroot:
 
2. Generate temporary [[pacman]] configuration files for chroot:
{{bc|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 ({{ic|/opt/arch32}} is used here). Remember to delete/comment the multilib repo, if you have enable it, in the {{ic|/opt/arch32/pacman.conf}} file
 
  
The {{ic|--root}} switch in the pacman command below will create {{ic|/var/log/pacman.log}} and {{ic|/var/lib/pacman/db.lck}} inside {{ic|/opt/arch32}}. The pacman log will be {{ic|/opt/arch32/var/log/pacman.log}} and will ''not'' interfere with the native 64-bit installation. There is no need for a {{ic|LogFile}} directive in {{ic|/etc/pacman.conf}} or a {{ic|--logfile}} switch.
+
  # 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
  
The {{ic|--cachedir}} switch is for the package to be cached in {{ic|/opt/arch32/var/cache/pacman/pkg}} instead of {{ic|/var/cache/pacman/pkg}}.
+
*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 ({{ic|/opt/arch32}} is used here).
 +
*Remember to delete/comment the multilib repo, if you have enabled it, in the {{ic|/opt/arch32/pacman.conf}} file
  
Use the {{ic|--config}} switch to tell pacman to use the configuration file generated above, rather than {{ic|/etc/pacman.conf}}.
+
3. Create the directory:
  
3. Create the directory, just to be sure:
+
  # mkdir -p /opt/arch32/var/{cache/pacman/pkg,lib/pacman}
  mkdir -p /opt/arch32/var/{cache/pacman/pkg,lib/pacman}
+
  
3b. Edit 'Architecture' for pacman >= 3.4
+
4. Sync pacman:
  
  # In /opt/arch32/pacman.conf
+
  # pacman --root /opt/arch32 --cachedir /opt/arch32/var/cache/pacman/pkg --config /opt/arch32/pacman.conf -Sy
# Architecture=auto
+
Architecture=i686
+
  
3c. Users following the Arch installer method will have a line at the top of {{ic|/etc/pacman.d/mirrorlist}} similar to:
+
5. Install the base and optionally base-devel groups:
{{bc|1=# 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:
+
# pacman --root /opt/arch32 --cachedir /opt/arch32/var/cache/pacman/pkg --config /opt/arch32/pacman.conf -S base base-devel
{{bc|1=Server = http://mirror.rit.edu/archlinux/$repo/os/i686}}
+
  
4. Sync pacman:
+
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 -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 sudo vim distcc
  pacman --root /opt/arch32 --cachedir /opt/arch32/var/cache/pacman/pkg --config /opt/arch32/pacman.conf -S base base-devel
+
{{Note|For minimal arch32 chroot installation following packages are sufficient: bash, coreutils, filesystem, grep, gzip, licenses, sed, pacman and file.}}
+
  
 +
Optionally move the pacman mirror list into place:
  
Optionally remove the temporary pacman configuration files.
+
# mv /opt/arch32/mirrorlist /opt/arch32/etc/pacman.d
  
rm /opt/arch32/{mirrorlist,pacman.conf}
+
=== Settings ===
  
6. To use the newly installed pacman, uncomment some mirrors in {{ic|/opt/arch32/etc/pacman.d/mirrorlist}} and make any other desired changes to the new pacman installation. 
+
Key configuration files should be copied over:
  
7. Edit your /opt/arch32/etc/pacman.conf and change that Architecture from auto back to i686.
+
# 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
  
== Create an Arch32 Daemon Init Script ==
+
Remember to define the correct the number of MAKEFLAGS and other vars in {{ic|/opt/arch32/etc/makepkg.conf}} before attempting to build.
  
{{Warning|This included script does not change anything outside the 32-bit directory. However, you will be creating hard links to your base system's configuration files and also mounting your home and other directories inside the 32-bit install directory.  Thus, mistaken settings in the linked configuration files or carelessly removing all or part of the locally mounted directories can inflict catastrophic damage to your base system.}}
+
=== Daemon and systemd service ===
 +
{{hc|/etc/systemd/system/arch32.service|<nowiki>
 +
[Unit]
 +
Description=32-bit chroot
  
To initiate the 32-bit environment at startup, create the following init script {{ic|/etc/rc.d/arch32}}:
+
[Service]
 +
Type=oneshot
 +
RemainAfterExit=yes
 +
ExecStart=/usr/local/bin/arch32 start
 +
ExecStop=/usr/local/bin/arch32 stop
  
{{bc|<nowiki>#!/bin/bash
+
[Install]
 +
WantedBy=multi-user.target
 +
</nowiki>}}
  
. /etc/rc.conf
+
{{hc|/usr/local/bin/arch32|<nowiki>
. /etc/rc.d/functions
+
#!/bin/bash
  
# Add '/var/run /var/lib/dbus' to the list to enable pulseaudio.
+
## User variables.
dirs=(/dev /dev/pts /dev/shm /tmp /home)
+
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
 
case $1 in
    start)
+
start)
        stat_busy "Starting Arch32 chroot"
+
[[ -f "$PIDFILE" ]] && exit 1
        for d in "${dirs[@]}"; do
+
        mount -o bind $d /opt/arch32$d
+
        done
+
        mount -t proc none /opt/arch32/proc
+
        mount -t sysfs none /opt/arch32/sys
+
        add_daemon arch32
+
        stat_done
+
        ;;
+
    stop)
+
        stat_busy "Stopping Arch32 chroot"
+
        for (( i = ${#dirs[@]} - 1; i >= 0; i-- )); do
+
        umount "/opt/arch32${dirs[i]}"
+
        done
+
        umount /opt/arch32/{proc,sys}
+
        rm_daemon arch32
+
        stat_done
+
        ;;
+
    restart)
+
        $0 stop
+
        sleep 1
+
        $0 start
+
        ;;
+
    *)
+
        echo "usage: $0 {start|stop|restart}"
+
esac
+
exit 0</nowiki>}}
+
A version of the script for Gentoo Linux (OpenRC) is available here: http://pastebin.com/kHt3440j
+
  
Then allow execution of the script:
+
if [[ -n "$MANAGEPARTITION" ]]; then
chmod +x /etc/rc.d/arch32
+
mountpoint -q $MOUNTPOINT || mount LABEL="arch32" $MOUNTPOINT
 +
fi
  
And add it to {{ic|/etc/rc.conf}}:
+
dirs=(/tmp /dev /dev/pts /home)
DAEMONS=(syslog-ng network netfs '''arch32''' crond)
+
for d in "${dirs[@]}"; do
 +
mount -o bind $d "$MOUNTPOINT"$d
 +
done
  
==Configure the new system==
+
mount -t proc none "$MOUNTPOINT/proc"
===Configuration files===
+
mount -t sysfs none "$MOUNTPOINT/sys"
Key configuration files should be copied over:
+
touch "$PIDFILE"
 +
[[ -n "$USEDISTCC" ]] && start_distccd
 +
;;
  
cd /opt/arch32/etc
+
stop)
+
[[ ! -f "$PIDFILE" ]] && exit 1
cp /etc/passwd* .
+
[[ -n "$USEDISTCC" ]] && stop_distccd
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 ===
+
if [[ -n "$MANAGEPARTITION" ]]; then
Chroot into the new system:
+
umount -R -A -l "$MOUNTPOINT"
/etc/rc.d/arch32 start
+
else
xhost +SI:localuser:usernametogiveaccesstogoeshere
+
dirs=(/home /dev/pts /dev /tmp)
chroot /opt/arch32
+
[[ -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
 +
</nowiki>}}
  
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 {{ic|~/.bashrc}}.  In fact, the default Debian .bashrc prompt string contains appropriate logic to report whether the working directory is within a chroot.
+
Be sure to make the init script executable:
 +
# chmod +x /usr/local/bin/arch32
  
Before continuing, keep in mind that the file {{ic|/etc/pacman.conf}} from the 32-bit environment is the default one.  Make sure to uncomment some mirrors in {{ic|/etc/pacman.d/mirrorlist}}.
+
[[Start]] and optionally [[enable]] {{ic|arch32.service}}.
  
Fix possible locale issues:
+
== Configuration ==
/usr/sbin/locale-gen
+
  
Install the needed packages including apps, fonts, etc. for example:
+
Chroot into the new system:
  
  pacman -S acroread opera
+
  # /usr/local/bin/arch32 start
  pacman -S firefox
+
  $ xhost +SI:localuser:username_to_give_access_to
  pacman -S flashplugin
+
  # chroot /opt/arch32
pacman -S mplayer-plugin
+
  
Regain space by removing some unnecessary packages.
+
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 {{ic|~/.bashrc}}.  In fact, the default Debian .bashrc prompt string contains appropriate logic to report whether the working directory is within a chroot.
  
{{Warning| This cleanup is for the '''32-bit''' root environment and must then be done inside it NOT the native 64-bit environment!}}
+
=== First-time Setup ===
  
The following shows recommended packages for removal:
+
Fix possible locale problems:
  
  pacman -Rd linux mkinitcpio
+
  # /usr/bin/locale-gen
pacman -R dhcpcd ppp xfsprogs reiserfsprogs jfsutils syslog-ng logrotate lvm2 wpa_supplicant pcmciautils
+
  
Also consider regularly clearing out pacman's cache:
+
Initialize pacman:
pacman -Scc
+
  
== Install and Configure Schroot ==
+
# sed -i 's/CheckSpace/#CheckSpace/' /etc/pacman.conf
 +
# pacman-key --init && pacman-key --populate archlinux
  
Install "schroot" to the native '''64-bit''' installation:
+
== Schroot ==
pacman -S schroot
+
 
 +
[[Install]] {{Pkg|schroot}} to the native '''64-bit''' installation:
  
 
Edit {{ic|/etc/schroot/schroot.conf}}, and create an ''[Arch32]'' section.
 
Edit {{ic|/etc/schroot/schroot.conf}}, and create an ''[Arch32]'' section.
Line 179: Line 183:
 
  aliases=32,default
 
  aliases=32,default
  
Optionally edit {{ic|/etc/schroot/arch32/mount}} to match the mounts created within {{ic|/etc/rc.d/arch32}}.
+
Optionally edit {{ic|/etc/schroot/arch32/mount}} to match the mounts created within {{ic|/usr/local/bin/arch32}}.
  
== Using Schroot to run a 32-bit application ==
+
=== Using Schroot to run a 32-bit application ===
  
 
The general syntax for calling an application ''inside'' the chroot is:
 
The general syntax for calling an application ''inside'' the chroot is:
  
  schroot -p -- htop
+
  # schroot -p -- htop
  
 
In this example, htop is called from within the 32-bit environment.
 
In this example, htop is called from within the 32-bit environment.
  
==Troubleshooting==
+
== Troubleshooting ==
 +
 
 +
=== Compilation and installing ===
  
===Compilation and installing===
 
 
Ensure the desired options are set in the local {{ic|/etc/makepkg.conf}}.
 
Ensure the desired options are set in the local {{ic|/etc/makepkg.conf}}.
  
 
Some packages may require a {{ic|--host}} flag be added to the ./configure script in the PKBUILD:
 
Some packages may require a {{ic|--host}} flag be added to the ./configure script in the PKBUILD:
  ./configure --host="i686-pc-linux" ...
+
 
 +
  $ ./configure --host="i686-pc-linux" ...
 +
 
 
This is the case when the build makes use of values (for example, the output of the {{ic|uname}} command) inherited from your base system.
 
This is the case when the build makes use of values (for example, the output of the {{ic|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:
+
===Video problems===
chmod 666 /dev/null
+
  
===Video issues===
 
 
If you get:
 
If you get:
 +
 
  X Error of failed request: BadLength (poly request too large or internal Xlib length error)
 
  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.)===
+
while trying to run an application that requires video acceleration, make sure you have installed appropriate [[video drivers]] in your chroot.
 +
 
 +
=== Sound in Flash ===
  
 
To get sound from the flash player in Firefox, open a terminal and chroot inside the 32-bit system:
 
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:
+
# chroot /opt/arch32
pacman -S alsa-oss
+
 
 +
From there, install {{Pkg|alsa-oss}} as usual with [[pacman]].
  
 
Then type:
 
Then type:
  export FIREFOX_DSP="aoss"
+
 
 +
  $ 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.
 
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.
Line 224: Line 231:
 
For [[Wine]] this works the same way. The package alsa-oss will also install the alsa libs required by [[Wine]] to output sound.
 
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==
+
== Tips and tricks ==
===Java in a chroot===
+
See [[Java]] for installation instructions.
+
  
After installing, adjust the path to get Java working:
+
=== Java in a chroot ===
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 [http://bbs.archlinux.org/viewtopic.php?id=97629 on the forum] and [http://xyne.archlinux.ca/projects/arch32-light on the project page].
+
  
===Allowing 32-bit applications access to 64-bit Pulseaudio===
+
See [[Java]]. After installation, adjust the path:
  
Add these lines in {{ic|/etc/rc.d/arch32}}, above {{ic|add_daemon arch32}}:
+
  $ export PATH="/opt/java/bin/:$PATH"
  mount --bind /var/run /opt/arch32/var/run
+
mount --bind /var/lib/dbus /opt/arch32/var/lib/dbus
+
  
And above {{ic|rm_daemon arch32}}:
+
=== Allow 32-bit applications access to 64-bit PulseAudio ===
umount /opt/arch32/var/run
+
umount /opt/arch32/var/lib/dbus
+
  
More information is available at the [[Pulseaudio]] article, especially the section on [http://wiki.archlinux.org/index.php/PulseAudio#Pulseaudio_from_within_a_chroot_.28ex._32-bit_chroot_in_64-bit_install.29 Pulseaudio from within a chroot].
+
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 {{ic|/usr/local/bin/arch32}} script after the other bind-mount/umount commands. See [[PulseAudio/Examples#PulseAudio_from_within_a_chroot_.28e.g._32-bit_chroot_in_64-bit_install.29|PulseAudio from within a chroot]] for details
 +
 
 +
=== Sound in Firefox ===
 +
 
 +
Create {{ic|/usr/bin/firefox32}} as root:
  
===Enabling sound in Firefox===
 
Open a text editor and save the following in {{ic|/usr/bin/firefox32}} as root:
 
 
  #!/bin/sh
 
  #!/bin/sh
 
  schroot -p firefox $1;export FIREFOX_DSP="aoss"
 
  schroot -p firefox $1;export FIREFOX_DSP="aoss"
  
 
Make it executable:
 
Make it executable:
  sudo chmod +x /usr/bin/firefox32
+
 
 +
  # chmod +x /usr/bin/firefox32
  
 
Now you can make an alias for Firefox, if desired:
 
Now you can make an alias for Firefox, if desired:
 +
 
  alias firefox="firefox32"
 
  alias firefox="firefox32"
  
Add this to the end of file {{ic|~/.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.
+
Add this to {{ic|~/.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.
  
===Enabling 3D acceleration===
+
=== 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:
+
You need to install the corresponding package under your "native" arch for 3D support.
pacman -S xf86-video-ati libgl ati-dri
+
  
For more informations on how to set up your graphic adapter refer to:
+
For information on how to set up your graphic adapter refer to:
  
[[ATI]]
+
* [[ATI]]
 +
* [[Intel]]
 +
* [[NVIDIA]]
  
[[Intel]]
+
=== WINE ===
  
[[NVIDIA]]
+
{{Out of date|The ''wine-hacks'' package does not exist anymore.}}
  
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 [http://art.ified.ca/?page_id=40 PulseAudio] working. See also [https://aur.archlinux.org/packages.php?ID=19675 wine-hacks] from AUR.
 
In order to compile wine, you need a 32-bit system installed. Compiling wine is needed for applying patches in order to get [http://art.ified.ca/?page_id=40 PulseAudio] working. See also [https://aur.archlinux.org/packages.php?ID=19675 wine-hacks] from AUR.
  
 
Add the following alias to {{ic|~/.bashrc}}:
 
Add the following alias to {{ic|~/.bashrc}}:
 +
 
  alias wine='schroot -pqd "$(pwd)" -- wine'
 
  alias wine='schroot -pqd "$(pwd)" -- wine'
 +
 
The {{ic|-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 {{ic|-d}} instead of {{ic|-s}}.
 
The {{ic|-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 {{ic|-d}} instead of {{ic|-s}}.
 +
 +
=== Printing ===
 +
 +
{{Accuracy|The note below contains a link to this very page, making it very unclear.}}
 +
 +
{{note|If you have a 64-bit base installation with a [[Install_bundled_32-bit_system_in_Arch64|32-bit chroot environment]], explicit installation of CUPS is not necessary in the 32-bit environment.}}
 +
 +
To access installed CUPS printers from the chroot environment, one needs to bind the {{ic|/var/run/cups}} directory to the same (relative) location in the chroot environment.
 +
 +
Simply make sure the {{ic|/var/run/cups}} directory exists in the chroot environment and bind-mount the host {{ic|/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.

Latest revision as of 21:19, 13 December 2015

This article presents one way of running 32-bit applications, which may be of use to those who do not wish to install the lib32-* libraries from the multilib repository and instead prefer to isolate 32bit applications. The approach involves creating a "chroot jail" to handle 32-bit apps.

Tip: Xyne has created a package that installs a minimalist 32-bit chroot as described below. See [1] and [2] for details.

Installation

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' -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. Create the directory:

# mkdir -p /opt/arch32/var/{cache/pacman/pkg,lib/pacman}

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 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

Settings

Key configuration files should be copied over:

# 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.

Daemon 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

## 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

Be sure to make the init script executable:

# chmod +x /usr/local/bin/arch32

Start and optionally enable arch32.service.

Configuration

Chroot into the new system:

# /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.

First-time Setup

Fix possible locale problems:

# /usr/bin/locale-gen

Initialize pacman:

# sed -i 's/CheckSpace/#CheckSpace/' /etc/pacman.conf
# pacman-key --init && pacman-key --populate archlinux

Schroot

Install schroot to the native 64-bit installation:

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 /usr/local/bin/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.

Video problems

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.

Sound in 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

Java in a chroot

See Java. After installation, adjust the path:

$ export PATH="/opt/java/bin/:$PATH"

Allow 32-bit applications access to 64-bit 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

Sound in 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 acceleration

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

Tango-view-refresh-red.pngThis article or section is out of date.Tango-view-refresh-red.png

Reason: The wine-hacks package does not exist anymore. (Discuss in Talk:Install bundled 32-bit system in 64-bit system#)

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.

Printing

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: The note below contains a link to this very page, making it very unclear. (Discuss in Talk:Install bundled 32-bit system in 64-bit system#)
Note: If you have a 64-bit base installation with a 32-bit chroot environment, explicit installation of CUPS is not necessary in the 32-bit environment.

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.