Difference between revisions of "32-bit Chroot"

From Funtoo
Jump to navigation Jump to search
m (instructions for Steam)
m (additions and changes following a read-through)
Line 23: Line 23:
Similar to a Funtoo [[Install/Download_and_Extract_Stage3|installation]] an appropriate Stage3 tarball must be downloaded and extracted. This will provide the directories, files and links necessary for the 32-bit chroot.
Similar to a Funtoo [[Install/Download_and_Extract_Stage3|installation]] an appropriate Stage3 tarball must be downloaded and extracted. This will provide the directories, files and links necessary for the 32-bit chroot.


'''Please refer to the [[Subarches]] page for an appropriate 32-bit Stage3.'''
'''Please refer to the [[Subarches]] page for an appropriate 32-bit Stage3.''' The following x86-32bit builds would be appropriate on an x86-64bit host
 
The following are appropriate on an x86-64bit host


{{TableStart}}
{{TableStart}}
Line 35: Line 33:
{{TableEnd}}
{{TableEnd}}


You should choose a 32-bit subarch with features and CPU_FLAGS that are compatible with the subarch and CPU of the x86-64bit host. '''If in doubt, choose 'Generic 32'.'''
You should choose a 32-bit subarch with features and CPU_FLAGS that are compatible with the subarch and CPU of your x86-64bit host. '''If in doubt, choose 'Generic 32'.'''


Copy the download link address for the '''1.3-release-std''' build and paste it into your terminal to download using {{c|wget}}.
Copy the download link address for the '''1.3-release-std''' build and paste it into your terminal to download using {{c|wget}}.
Line 47: Line 45:
}}
}}


Instead of having duplicate portage trees, this 32-bit chroot will use the meta-repo of the host. To further eliminate duplicate downloads the 32-bit chroot will be set up to use the Portage local sourcefile directory on the host (see 'DISTDIR' in {{c|emerge --info}}). Package source files already fetched by the host will be available inside of the chroot environment. To achieve this you must first create the necessary directories inside of the 32-bit chroot folder. Later the host folders will bind-mount onto these empty directories.
Instead of having duplicate portage trees, this 32-bit chroot will instead use the meta-repo of the 64-bit host. To further eliminate duplicate downloads you can also use the local Portage sourcefile directory on the host inside of the chroot (see 'DISTDIR' in {{c|emerge --info}}). Package source files already fetched by the host will then be available for use by Portage inside of the chroot.
 
To achieve this you must first create the necessary directories inside of the 32-bit chroot folder. Later the host folders will bind-mount onto these empty directories.
{{console|body=
{{console|body=
##r##localhost##!r## /path/to/chroot/directory # ##i##mkdir -p var/git/meta-repo
##r##localhost##!r## /path/to/chroot/directory # ##i##mkdir -p var/git/meta-repo
Line 53: Line 53:
}}
}}


{{package|sys-apps/portage}} and other packages must only see the environment variables of the 32-bit chroot and '''not those of the 64-bit host'''. The Gentoo guide requires users to execute {{c|env-update}} each time you enter the 32-bit chroot environment. The following will set this up to occur automatically.
{{package|sys-apps/portage}} and other packages must only see the environment variables of the 32-bit chroot and not those of the 64-bit host. The Gentoo guide requires users to execute {{c|env-update}} each time you enter the 32-bit chroot environment. The following configuration will set this to occur automatically.


Create and edit the file {{f|.bash_profile}} inside of the directory {{f|/part/to/chroot/directory/root/}} to include the following
Create and edit the file {{f|.bash_profile}} inside of the directory {{f|/part/to/chroot/directory/root/}} to include the following
Line 66: Line 66:
As the last step you should configure {{package|app-shells/bash}} to display a modified command prompt while inside of the chroot environment. This will help you to identify when you are issuing commands inside of the 32-bit chroot as opposed to the x86-64bit host.
As the last step you should configure {{package|app-shells/bash}} to display a modified command prompt while inside of the chroot environment. This will help you to identify when you are issuing commands inside of the 32-bit chroot as opposed to the x86-64bit host.


Add the following line at the end of the file {{f|/profile}} inside of the directory {{f|/part/to/chroot/directory/etc/}}
Add the following line at the end of the file {{f|profile}} inside of the directory {{f|/part/to/chroot/directory/etc/}}
{{console|body=
{{console|body=
##r##localhost##!r## /path/to/chroot/directory # ##i##nano etc/profile
##r##localhost##!r## /path/to/chroot/directory # ##i##nano etc/profile
Line 76: Line 76:
fi
fi


# ADD THE FOLLOWING LINE FOR YOUR 32-BIT CHROOT ENVIRONMENT
# ADD THE FOLLOWING LINE TO IDENTIFY YOUR 32-BIT CHROOT ENVIRONMENT
PS1="(32-bit chroot) ${PS1}"
PS1="(32-bit chroot) ${PS1}"


Line 87: Line 87:


= OpenRC Configuration =
= OpenRC Configuration =
Following the Gentoo guide you will create an OpenRC service to automatically handle mounts and file copies from your host to the 32-bit chroot. This file in {{f|/etc/init.d}} will include additional mounts for Meta-Repo and the Portage DISTDIR.
You can create an {{Package|sys-apps/openrc}} service named '''chroot32''' to automatically copy files and mount directories prior to accessing the 32-bit chroot environment. This service will include additional mounts for Meta-Repo and the Portage DISTDIR.


{{note|The following file mounts Funtoo portage tree /var/git/meta-repo as read-only. The Portage DISTDIR (/var/cache/portage/distfiles) is mounted read-write.}}
{{note|The following file mounts Funtoo portage tree /var/git/meta-repo as read-only. The Portage DISTDIR (/var/cache/portage/distfiles) is mounted read-write.}}


Create and edit the file {{f|/etc/init.d/chroot32}}, setting chroot_dir to equal {{f|/path/to/chroot/directory}}.
{{console|body=
{{console|body=
##r##localhost##!r## /path/to/chroot/directory # ##i##nano /etc/init.d/chroot32
##r##localhost##!r## /path/to/chroot/directory # ##i##nano /etc/init.d/chroot32
Line 139: Line 140:
}}
}}


To set up the 32-bit chroot mounts ready for access you start the service.
Start the {{c|chroot32}} service to prepare the 32-bit environment.
{{console|body=
{{console|body=
##r##localhost##!r## /path/to/chroot/directory # ##i##rc-service chroot32 start##!i##
##r##localhost##!r## /path/to/chroot/directory # ##i##rc-service chroot32 start##!i##
Line 146: Line 147:
}}
}}


{{tip|If you would like the necessary files copied and folders mounts at '''startup''' run the following
{{tip|If you would like this service to run during host startup issue the following command
{{console|body=
{{console|body=
##r##localhost##!r## /path/to/chroot/directory # ##i##rc-update add chroot32 default##!i##
##r##localhost##!r## /path/to/chroot/directory # ##i##rc-update add chroot32 default##!i##
Line 169: Line 170:
}}
}}


{{important|The switch '''-l''' tells bash to source /etc/profile within the chroot environment and not from the host. Without this switch you must manually issue the command {{c|source /etc/profile}}.}}
{{important|The switch '''-l''' tells bash to source /etc/profile within the chroot environment and not from the host. Without this switch you must manually issue the command {{c|source /etc/profile}} each time you enter the 32-bit environment.}}


Confirm that you are now in a 32-bit environment
Confirm that you are now in a 32-bit environment
Line 199: Line 200:
If necessary now is a good point to set up [[Funtoo_Linux_Localization|Localization]]. Similarly, changes to {{f|/etc/portage/make.conf}} within the 32-bit environment can be made.
If necessary now is a good point to set up [[Funtoo_Linux_Localization|Localization]]. Similarly, changes to {{f|/etc/portage/make.conf}} within the 32-bit environment can be made.


Currently you are the '''root''' user inside of the 32-bit environment. To change to the host user account '''localuser''' you must first create a home directory for localuser inside the 32-bit environment. ({{f|/home/localuser}} on the host is not mounted inside of this chroot environment.)
Currently you are the '''root''' user inside of the 32-bit environment. To change to the host user account '''localuser''' you must first create a home directory for localuser inside the 32-bit environment. ({{f|/home/localuser}} '''on the host''' is not mounted inside of this chroot environment.)
{{console|body=
{{console|body=
(32-bit chroot) ##r##localhost##!r## / # ##i##cp -r /etc/skel /home/localuser##!i##
(32-bit chroot) ##r##localhost##!r## / # ##i##cp -r /etc/skel /home/localuser##!i##
Line 212: Line 213:
== Updating Funtoo Meta-Repo ==
== Updating Funtoo Meta-Repo ==


The 32-bit chroot environment accesses {{f|/var/git/meta-repo}} from the x86-64bit host.
{{warning|Please be aware of this.}}


Issuing {{c|ego sync}} is not necessary within the 32-bit chroot environment.
The 32-bit chroot environment uses the Meta-Repo ({{f|/var/git/meta-repo}}) of the 64bit host. Issuing {{c|ego sync}} is not necessary within the 32-bit chroot environment.


{{important|To keep Meta-Repo up-to-date first issue {{c|ego sync}} on the x86-64bit host '''before''' entering the 32-bit chroot environment.}}
You must update Meta-Repo on the x86-64bit host ''before'' entering the 32-bit environment.


== Exiting ==
== Exiting the 32-bit Chroot ==
{{console|body=
{{console|body=
(32-bit chroot) ##r##localhost##!r## / # ##i##exit
(32-bit chroot) ##r##localhost##!r## / # ##i##exit
Line 233: Line 234:
(32-bit chroot) ##r##localhost##!r## / # ##i##emerge -av foobar
(32-bit chroot) ##r##localhost##!r## / # ##i##emerge -av foobar
}}
}}
{{tip|Depending on your use case it may be beneficial to change flavor and add mix-ins within the 32-bit environment.}}


== Wine (32-bit only) ==
== Wine (32-bit only) ==
Line 241: Line 244:
##r##localhost##!r## # ##i##xhost local:localhost}}
##r##localhost##!r## # ##i##xhost local:localhost}}


'''This will allow X11 applications inside of the 32-bit environment to display on the host.'''
'''This will allow X11 applications inside of the 32-bit environment to display on the host X session.'''
}}
}}


Line 249: Line 252:
}}
}}


Instead of running wine as the '''root''' user, run as '''localuser'''. Configure Wine with {{c|winecfg}}.
Instead of running wine as the '''root''' user, run as '''localuser'''. Switch to 'localuser' and configure Wine with {{c|winecfg}}. An X window should display.
Switch to 'localuser'
{{console|body=
{{console|body=
(32-bit chroot) ##r##localhost##!r## / # ##i##su localuser -l
(32-bit chroot) ##r##localhost##!r## / # ##i##su localuser -l
Line 257: Line 259:


== Steam ==
== Steam ==
{{important|64-bit Games and Applications available through Steam '''will not run''' in this 32-bit environment.}}
=== Local Steam Repository ===
=== Local Steam Repository ===
Start by cloning the Gentoo Linux git repository of Steam client ebuilds.
Start by cloning the Gentoo Linux git repository of Steam client ebuilds.
Line 266: Line 269:
}}
}}


Copy and edit the necessary configuration file to indicate the presence of this local repository to Portage.
Copy and edit the necessary configuration file to indicate the presence of this local repository to Portage: 'location' should be set to {{f|/var/git/steam-overlay}}.
{{console|body=
{{console|body=
##r##localhost##!r## /var/git # ##i##cp steam-overlay/steam-overlay.conf /etc/portage/repos.conf/
##r##localhost##!r## /var/git # ##i##cp steam-overlay/steam-overlay.conf /etc/portage/repos.conf/

Revision as of 02:47, December 19, 2018

The x86 Instruction Set Architecture includes 64-bit registers which have been implemented in processors from AMD, Intel and others starting in 2003 (AMD Opteron). Since then most new and existing applications have been written to make use of x86-64bit architecture. Fewer applications require 32-bit support. In the past x86-64bit arch on Funtoo Linux has provided support for 64 and 32-bit applications and libraries simultaneously ('multilib').

The 1.3-release of Funtoo Linux depreciates support for 32-bit applications and libraries on x86-64bit arch: https://forums.funtoo.org/topic/1866-important-13-release-to-beta-and-removal-of-multilib/

Users needing to run 32-bit programs on x86-64bit hardware have two options:

The first option is to install a second separate instance of Funtoo Linux using x86-32bit arch builds.

An alternative to this is to install an x86-32bit arch instance of Funtoo Linux on an x86-64bit host. Users then chroot into the 32-bit chroot environment using the linux32 (i.e. setarch) command provided by [Package:sys-apps/util-linux]. This guide will detail the setup and use of this second scenario.

Acknowledgement

The information published here is based on steps detailed on the Gentoo Linux Wiki: https://wiki.gentoo.org/wiki/Project:AMD64/32-bit_Chroot_Guide (CC BY-SA 3.0).

Installation

This guide describes a 32-bit chroot installed into a new directory on existing storage.

root ##g##localuser@localhost##!g## $ su -
root ##i##Password:
root ##r##localhost##!r## # mkdir -p /path/to/chroot/directory
root ##r##localhost##!r## # cd /path/to/chroot/directory

Similar to a Funtoo installation an appropriate Stage3 tarball must be downloaded and extracted. This will provide the directories, files and links necessary for the 32-bit chroot.

Please refer to the Subarches page for an appropriate 32-bit Stage3. The following x86-32bit builds would be appropriate on an x86-64bit host

SubarchCPU Family
Generic 3232-bit Processors (PC-Compatible, Generic)
I68632-bit Processors (PC-Compatible, Generic)
Atom 3232-bit Intel Processors
Pentium432-bit Intel Processors

You should choose a 32-bit subarch with features and CPU_FLAGS that are compatible with the subarch and CPU of your x86-64bit host. If in doubt, choose 'Generic 32'.

Copy the download link address for the 1.3-release-std build and paste it into your terminal to download using wget.

root ##r##localhost##!r## /path/to/chroot/directory # wget https://build.funtoo.org/1.3-release-std/x86-32bit/generic_32/2018-12-13/stage3-generic_32-1.3-release-std-2018-12-13.tar.xz

Extract the Stage3 tarball, preserving permissions.

root ##r##localhost##!r## /path/to/chroot/directory # tar -xpf stage3-generic_32-1.3-release-std-2018-12-13.tar.xz

Instead of having duplicate portage trees, this 32-bit chroot will instead use the meta-repo of the 64-bit host. To further eliminate duplicate downloads you can also use the local Portage sourcefile directory on the host inside of the chroot (see 'DISTDIR' in emerge --info). Package source files already fetched by the host will then be available for use by Portage inside of the chroot.

To achieve this you must first create the necessary directories inside of the 32-bit chroot folder. Later the host folders will bind-mount onto these empty directories.

root ##r##localhost##!r## /path/to/chroot/directory # mkdir -p var/git/meta-repo
root ##r##localhost##!r## /path/to/chroot/directory # mkdir -p var/cache/portage/distfiles

sys-apps/portage and other packages must only see the environment variables of the 32-bit chroot and not those of the 64-bit host. The Gentoo guide requires users to execute env-update each time you enter the 32-bit chroot environment. The following configuration will set this to occur automatically.

Create and edit the file .bash_profile inside of the directory /part/to/chroot/directory/root/ to include the following

root ##r##localhost##!r## /path/to/chroot/directory # nano root/.bash_profile
   .bash_profile - /root/.bash_profile inside of /path/to/chroot/directory/
#run env-update on 32-bit chroot login
env-update

As the last step you should configure app-shells/bash to display a modified command prompt while inside of the chroot environment. This will help you to identify when you are issuing commands inside of the 32-bit chroot as opposed to the x86-64bit host.

Add the following line at the end of the file profile inside of the directory /part/to/chroot/directory/etc/

root ##r##localhost##!r## /path/to/chroot/directory # nano etc/profile
   profile - /etc/profile inside of /path/to/chroot/directory/
# understand sequences such as \h, don't put anything special in it.
        PS1="${USER:-$(whoami 2>/dev/null)}@$(uname -n 2>/dev/null) \$ "
fi

# ADD THE FOLLOWING LINE TO IDENTIFY YOUR 32-BIT CHROOT ENVIRONMENT
PS1="(32-bit chroot) ${PS1}"

for sh in /etc/profile.d/*.sh ; do
        [ -r "$sh" ] && . "$sh"
done
unset sh

OpenRC Configuration

You can create an sys-apps/openrc service named chroot32 to automatically copy files and mount directories prior to accessing the 32-bit chroot environment. This service will include additional mounts for Meta-Repo and the Portage DISTDIR.

   Note

The following file mounts Funtoo portage tree /var/git/meta-repo as read-only. The Portage DISTDIR (/var/cache/portage/distfiles) is mounted read-write.

Create and edit the file /etc/init.d/chroot32, setting chroot_dir to equal /path/to/chroot/directory.

root ##r##localhost##!r## /path/to/chroot/directory # nano /etc/init.d/chroot32
   chroot32 - /etc/init.d/chroot32 on x86-64bit host
#!/sbin/openrc-run

chroot_dir=/path/to/chroot/directory

depend() {
   need localmount bootmisc
}

start() {
    ebegin "Mounting 32-bit chroot directories"
    mount --rbind /dev "${chroot_dir}/dev" >/dev/null
    mount --rbind /sys "${chroot_dir}/sys" >/dev/null
    mount -t proc none "${chroot_dir}/proc" >/dev/null
    mount -o bind /tmp "${chroot_dir}/tmp" >/dev/null
    mount -o bind,ro /var/git/meta-repo "${chroot_dir}/var/git/meta-repo/" >/dev/null
    mount -o bind /var/cache/portage/distfiles "${chroot_dir}/var/cache/portage/distfiles/" >/dev/null
    mount -t tmpfs -o nosuid,nodev,noexec,mode=755 none "${chroot_dir}/run" > /dev/null
    eend $? "An error occured while attempting to mount 32bit chroot directories"
    ebegin "Copying 32bit chroot files"
    cp -pf /etc/resolv.conf /etc/passwd /etc/shadow /etc/group \
           /etc/gshadow /etc/hosts "${chroot_dir}/etc" >/dev/null
    cp -Ppf /etc/localtime "${chroot_dir}/etc" >/dev/null
    eend $? "An error occured while attempting to copy 32 bits chroot files."
}

stop() {
    ebegin "Unmounting 32-bit chroot directories"
    umount -fR "${chroot_dir}/dev" >/dev/null
    umount -fR "${chroot_dir}/sys" >/dev/null
    umount -f "${chroot_dir}/proc" >/dev/null
    umount -f "${chroot_dir}/tmp" >/dev/null
    umount -f "${chroot_dir}/var/git/meta-repo/" >/dev/null
    umount -f "${chroot_dir}/var/cache/portage/distfiles/" >/dev/null
    umount -f "${chroot_dir}/run"
    eend $? "An error occured while attempting to unmount 32bit chroot directories"
}

Set this file to be executable.

root ##r##localhost##!r## /path/to/chroot/directory # chmod +x /etc/init.d/chroot32

Start the chroot32 service to prepare the 32-bit environment.

root ##r##localhost##!r## /path/to/chroot/directory # rc-service chroot32 start
root ##bl##chroot32##!bl##        | * Mounting 32-bit chroot directories...                        [ ok ]
root ##bl##chroot32##!bl##        | * Copying 32bit chroot files...                                [ ok ]
   Tip

If you would like this service to run during host startup issue the following command

root ##r##localhost##!r## /path/to/chroot/directory # rc-update add chroot32 default
 * service chroot32 added to runlevel default

The 32-bit chroot environment is now ready for access.

root ##r##localhost##!r## /path/to/chroot/directory # exit
root ##g##user@localhost##!g## $

Enter 32-bit Chroot

Enter the 32-bit chroot environment with the following commands

root ##g##user@localhost##!g## $ su -
root ##i##Password:
root ##r##localhost##!r## # linux32 chroot /path/to/chroot/directory /bin/bash -l
>>> Regenerating /etc/ld.so.cache...
(32-bit chroot) localhost / #
   Important

The switch -l tells bash to source /etc/profile within the chroot environment and not from the host. Without this switch you must manually issue the command source /etc/profile each time you enter the 32-bit environment.

Confirm that you are now in a 32-bit environment

(32-bit chroot) localhost / # uname -m
i686
(32-bit chroot) localhost / # epro show

=== Enabled Profiles: ===

        arch: x86-32bit
       build: current
     subarch: generic_32
      flavor: core
     mix-ins: (not set)


=== Python kit: ===

      branch: 3.7-release

=== All inherited flavor from core flavor: ===

                         minimal (from core flavor)

First Steps

If necessary now is a good point to set up Localization. Similarly, changes to /etc/portage/make.conf within the 32-bit environment can be made.

Currently you are the root user inside of the 32-bit environment. To change to the host user account localuser you must first create a home directory for localuser inside the 32-bit environment. (/home/localuser on the host is not mounted inside of this chroot environment.)

(32-bit chroot) localhost / # cp -r /etc/skel /home/localuser

Switch to 'localuser'

(32-bit chroot) localhost / # su localuser -l
(32-bit chroot) localuser@localhost ~ $

Updating Funtoo Meta-Repo

   Warning

Please be aware of this.

The 32-bit chroot environment uses the Meta-Repo (/var/git/meta-repo) of the 64bit host. Issuing ego sync is not necessary within the 32-bit chroot environment.

You must update Meta-Repo on the x86-64bit host before entering the 32-bit environment.

Exiting the 32-bit Chroot

(32-bit chroot) localhost / # exit
root ##g##localuser@localhost##!g## ~ $

Emerging Packages

Enter the 32-bit chroot environment and install packages normally.

root ##g##user@localhost##!g## $ su -
root ##i##Password:
root ##r##localhost##!r## # linux32 chroot /path/to/chroot/directory /bin/bash -l
>>> Regenerating /etc/ld.so.cache...
(32-bit chroot) localhost / # emerge -av foobar
   Tip

Depending on your use case it may be beneficial to change flavor and add mix-ins within the 32-bit environment.

Wine (32-bit only)

   Important

Before entering the 32-bit environment run the following command

root ##g##localuser@localhost##!g## $ su -
root ##i##Password:
root ##r##localhost##!r## # xhost local:localhost

This will allow X11 applications inside of the 32-bit environment to display on the host X session.

Install Wine inside of the 32-bit environment (example, No results)

(32-bit chroot) localhost / # emerge -av wine-vanilla

Instead of running wine as the root user, run as localuser. Switch to 'localuser' and configure Wine with winecfg. An X window should display.

(32-bit chroot) localhost / # su localuser -l
(32-bit chroot) localuser@localhost ~ $ winecfg

Steam

   Important

64-bit Games and Applications available through Steam will not run in this 32-bit environment.

Local Steam Repository

Start by cloning the Gentoo Linux git repository of Steam client ebuilds.

root ##g##localuser@localhost##!g## $ su -
root ##i##Password:
root ##r##localhost##!r## # cd /var/git
root ##r##localhost##!r## /var/git # git clone https://github.com/anyc/steam-overlay.git

Copy and edit the necessary configuration file to indicate the presence of this local repository to Portage: 'location' should be set to /var/git/steam-overlay.

root ##r##localhost##!r## /var/git # cp steam-overlay/steam-overlay.conf /etc/portage/repos.conf/
root ##r##localhost##!r## /var/git # nano /etc/portage/repos.conf/steam-overlay.conf
   steam-overlay.conf
[steam-overlay]

# Gentoo overlay for Valve's Steam client and Steam-based games.
# Maintainer: anyc (https://github.com/anyc)

location = /var/git/steam-overlay
sync-type = git
sync-uri = https://github.com/anyc/steam-overlay.git
priority = 50
auto-sync = Yes
root ##r##localhost##!r## /var/git # emerge --sync

Install

Install Steam inside of the 32-bit environment

(32-bit chroot) localhost / # emerge -av steam-meta