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

From ArchWiki
Jump to: navigation, search
(Regain Space (Optional): Package is dropped.)
m (link to talk)
 
(79 intermediate revisions by 15 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-hans:Install bundled 32-bit system in 64-bit system]]
{{Article summary text|
+
{{Archive|1=https://www.archlinux.org/news/phasing-out-i686-support/|2=ArchWiki:Requests#Drop of i686 support}}
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}}
+
  
== Make the i686 Chroot ==
+
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.
===Install the Base 32-bit System===
+
  
1. Create the directory:
+
== Installation ==
mkdir /opt/arch32
+
  
2. Generate temporary [[pacman]] configuration files for chroot:
+
[[Install]] the {{pkg|arch-install-scripts}} package and create the chroot. Make sure to use a [[pacman]] configuration that does not use the {{ic|[multilib]}} repository.
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.
+
# mkdir /opt/arch32
*For this reason they must be put ''into'' a temporary location ({{ic|/opt/arch32}} is used here).
+
# linux32 pacstrap -C ''path/to/pacman.conf'' -di /opt/arch32 base base-devel
*Remember to delete/comment the multilib repo, if you have enabled it, in the {{ic|/opt/arch32/pacman.conf}} file
+
  
3. Create the directory:
+
=== Settings ===
mkdir -p /opt/arch32/var/{cache/pacman/pkg,lib/pacman}
+
  
4. Sync pacman:
+
{{Style|"Key" configuration files is subjective}}
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
 
 
===Configuration files===
 
 
Key configuration files should be copied over:
 
Key configuration files should be copied over:
  
  cd /opt/arch32/etc
+
  # cd /etc
   
+
  # for i in passwd* shadow* group* sudoers resolv.conf localtime locale.gen vimrc inputrc profile.d/locale.sh; do cp -p /etc/"$i" /opt/arch32/etc/; done
cp /etc/passwd* .
+
cp /etc/shadow* .
+
cp /etc/group* .
+
cp /etc/sudoers .
+
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/inputrc .
+
 
+
Be sure to include the "." character!
+
  
 
Remember to define the correct the number of MAKEFLAGS and other vars in {{ic|/opt/arch32/etc/makepkg.conf}} before attempting to build.
 
Remember to define the correct the number of MAKEFLAGS and other vars in {{ic|/opt/arch32/etc/makepkg.conf}} before attempting to build.
  
== Create an Arch32 Daemon Script and Systemd Service ==
+
== Configuration ==
{{hc|/etc/systemd/system/arch32.service|<nowiki>
+
[Unit]
+
Description=32-bit chroot
+
  
[Service]
+
# linux32 arch-chroot /opt/arch32
Type=oneshot
+
RemainAfterExit=yes
+
ExecStart=/usr/local/bin/arch32 start
+
ExecStop=/usr/local/bin/arch32 stop
+
  
[Install]
+
{{Note|If access to the [[Xorg]] server of the host is required, allow it for a given user with {{ic|xhost +si:localuser:''chroot_user''}}. See {{man|7|Xsecurity|url=https://www.x.org/releases/X11R7.7/doc/man/man7/Xsecurity.7.xhtml}} for details.}}
WantedBy=multi-user.target
+
</nowiki>}}
+
  
{{hc|/usr/local/bin/arch32|<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 {{ic|ARCH32}} string to the {{ic|PS1}} variable defined in {{ic|~/.bashrc}}.
#!/bin/bash
+
  
MOUNTPOINT=/opt/arch32
+
== Schroot ==
PIDFILE=/run/arch32
+
  
# Leave this blank if not using distccd from within the chroot.
+
[[Install]] {{Pkg|schroot}} to the native '''64-bit''' installation:
USEDISTCC=
+
DISTCC_SUBNET='192.168.0.0/24'
+
 
+
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"
+
 
+
  if [[ -z "$(pgrep distccd-chroot)" ]]; then
+
    linux32 chroot $MOUNTPOINT /bin/bash -c "/usr/bin/distccd-chroot --daemon ${DISTCC_ARGS}"
+
  else
+
    echo "/usr/bin/distccd-chroot seems to be running so doing nothing!"
+
  fi
+
}
+
 
+
stop_distccd() {
+
  if [[ -n "$(pgrep distccd-chroot)" ]]; then
+
    linux32 chroot $MOUNTPOINT /bin/bash -c "pkill -SIGTERM distccd-chroot"
+
  else
+
    echo "/usr/bin/distccd-chroot does NOT seems to be running so doing nothing!"
+
  fi
+
}
+
 
+
case $1 in
+
  start)
+
    # Only relevant for users with an arch32 chroot on a separate partition.
+
    # Edit to fit your system and take note of the corresponding unmount option in the stop function!
+
    # mountpoint -q $MOUNTPOINT || mount LABEL="arch32" $MOUNTPOINT
+
 
+
    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)
+
    dirs=(/home /dev/pts /dev /tmp)
+
    [[ -n "$USEDISTCC" ]] && stop_distccd
+
    umount $MOUNTPOINT/{sys,proc}
+
    for d in "${dirs[@]}"; do
+
      umount -l "$MOUNTPOINT$d"
+
    done
+
    # Only relevant for users with an arch32 chroot on a separate partition.
+
    # umount -l $MOUNTPOINT
+
    rm -f $PIDFILE
+
    ;;
+
  *)
+
    echo "usage: $0 (start|stop)"
+
    exit 1
+
esac
+
 
+
# vim:set ts=2 sw=2 et:
+
</nowiki>}}
+
 
+
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==
+
=== Configure the chroot ===
+
Chroot into the new system:
+
/usr/local/bin/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 {{ic|~/.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 issues:
+
/usr/sbin/locale-gen
+
 
+
Initialize pacman:
+
sed -i 's/CheckSpace/#CheckSpace/' /etc/pacman.conf
+
pacman-key --init
+
pacman-key --populate archlinux
+
 
+
=== Install Needed Packages ===
+
Install the needed packages including apps, fonts, etc. for example:
+
 
+
pacman -S firefox
+
pacman -S flashplugin
+
 
+
=== Regain Space (Optional) ===
+
{{Warning| This cleanup is for the '''32-bit''' root environment and must then be done inside it NOT the native 64-bit environment!}}
+
 
+
The following shows recommended packages for removal:
+
 
+
pacman -Rd linux mkinitcpio dhcpcd xfsprogs reiserfsprogs jfsutils logrotate lvm2 pcmciautils netctl 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 {{ic|/etc/schroot/schroot.conf}}, and create an ''[Arch32]'' section.
 
Edit {{ic|/etc/schroot/schroot.conf}}, and create an ''[Arch32]'' section.
Line 194: Line 51:
 
  aliases=32,default
 
  aliases=32,default
  
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===
+
===Video problems===
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:
+
If you get:
./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.
+
  
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)
 
  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.
  
To get sound from the flash player in Firefox, open a terminal and chroot inside the 32-bit system:
+
=== Sound in Flash ===
chroot /opt/arch32
+
  
From there, install alsa-oss:
+
[[Install]] the {{Pkg|alsa-oss}} package inside the chroot, and export the {{ic|FIREFOX_DSP}} [[environment variable]] before launching [[Firefox]]:
pacman -S alsa-oss
+
  
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 requires this environment variable.
  
Finally, launch Firefox.
+
For [[Wine]] this works the same way. The alsa-oss package will also install the alsa libraries 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 ===
===Java in a chroot===
+
See [[Java]] for installation instructions.
+
  
After installing, adjust the path to get Java working:
+
See [[Java]]. After installation, adjust the path:
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 [https://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===
+
$ export PATH="/opt/java/bin/:$PATH"
  
Add these lines in {{ic|/usr/local/bin/arch32}}, before the daemon is started:
+
=== Allow 32-bit applications access to 64-bit PulseAudio ===
mount --bind /var/run /opt/arch32/var/run
+
mount --bind /var/lib/dbus /opt/arch32/var/lib/dbus
+
  
And before the daemon is stopped:
+
Additional paths have to be bind-mounted to the chroot environment:
umount /opt/arch32/var/run
+
umount /opt/arch32/var/lib/dbus
+
  
More information is available at the [[Pulseaudio]] article, especially the section on [[PulseAudio#Pulseaudio_from_within_a_chroot_.28ex._32-bit_chroot_in_64-bit_install.29|Pulseaudio from within a chroot]].
+
# mount --bind /var/run /opt/arch32/var/run
 +
# mount --bind /var/lib/dbus /opt/arch32/var/lib/dbus
  
===Enabling sound in Firefox===
+
Unmount them when leaving the environment:
Open a text editor and save the following in {{ic|/usr/bin/firefox32}} as root:
+
 
#!/bin/sh
+
# umount /opt/arch32/var/run
schroot -p firefox $1;export FIREFOX_DSP="aoss"
+
# 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
  
Make it executable:
+
=== Sound in Firefox ===
sudo chmod +x /usr/bin/firefox32
+
  
Now you can make an alias for Firefox, if desired:
+
Create {{ic|/usr/bin/firefox32}} as root:
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.
+
#!/bin/sh
 +
schroot -p firefox $1;export FIREFOX_DSP="aoss"
  
===Enabling 3D acceleration===
+
Make it executable:
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:
+
# chmod +x /usr/bin/firefox32
  
* [[ATI]]
+
=== Printing ===
* [[Intel]]
+
* [[NVIDIA]]
+
  
===Script for wine===
+
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.
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}}:
+
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:
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}}.
+
  
===Printing===
+
# mkdir /opt/arch32/var/run/cups
 +
# mount --bind /var/run/cups /opt/arch32/var/run/cups
  
For accessing CUPS printers intalled in the base system from the chroot environment, see [[CUPS#Installing_CUPS_a_32_bit_chroot_environment|the applicable section]] of the [[CUPS|Arch CUPS Wiki page]].
+
and printers should be available from 32-bit chroot applications immediately.

Latest revision as of 08:59, 8 February 2017

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.

Installation

Install the arch-install-scripts package and create the chroot. Make sure to use a pacman configuration that does not use the [multilib] repository.

# mkdir /opt/arch32
# linux32 pacstrap -C path/to/pacman.conf -di /opt/arch32 base base-devel

Settings

Tango-edit-clear.pngThis article or section needs language, wiki syntax or style improvements.Tango-edit-clear.png

Reason: "Key" configuration files is subjective (Discuss in Talk:Install bundled 32-bit system in 64-bit system#)

Key configuration files should be copied over:

# cd /etc
# for i in passwd* shadow* group* sudoers resolv.conf localtime locale.gen vimrc 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.

Configuration

# linux32 arch-chroot /opt/arch32
Note: If access to the Xorg server of the host is required, allow it for a given user with xhost +si:localuser:chroot_user. See Xsecurity(7) for details.

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.

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

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

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

Install the alsa-oss package inside the chroot, and export the FIREFOX_DSP environment variable before launching Firefox:

$ export FIREFOX_DSP="aoss"

Every chroot into the 32-bit system requires this environment variable.

For Wine this works the same way. The alsa-oss package will also install the alsa libraries 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

Printing

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 /opt/arch32/var/run/cups
# mount --bind /var/run/cups /opt/arch32/var/run/cups

and printers should be available from 32-bit chroot applications immediately.