# Install bundled 32-bit system in 64-bit system (简体中文)

注意: 这里的步骤不会试图改变 32 位目录之外的任何东西。要是发生了这样的事，那是糟糕的错误。

这个指南是写给那些确实需要运行 32 位程序并希望容易地安装它们的人。由于 Arch64 试图成为一个纯粹的 64 位发行版，开发者们不打算提供兼容库以便使系统干净些。现在虽然已经有了一些，但它们的 PKBGUILD 仅仅是下载 32 位二进制包并重新打包而成，并不是从源代码编译而来。所以，如果你想要重新编译这些包，你也需要这个32位子系统。

重要事项：如果你自定义了内核配置(config)，你需要确保“CONFIG_IA32_EMULATION=y”这个选项设置好。否则，该 64 位内核将不能访问这里的 32 位 chroot 环境。对原配的 Arch64 内核而言，这通常是默认选项。

## 安装基本的 32 位系统

首先创建 32 位子目录。

    mkdir /opt/arch32

生成供子系统使用的 pacman 配置文件。注意，这里是直接拷贝到 /opt/arch32 目录下，而不是 /opt/arch32/etc。后面安装pacman相关包的时候，这两个文件存在的话就会出错，所以我们使用一个临时的位置来存放它们。在安装完成之后，可以删除这两个文件，系统就干净了。

    sed -e 's/x86_64/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

在下面的 pacman 命令中使用了--root选项，这会使得/var/log/pacman.log、/var/lib/pacman/db.lck等文件创建在/opt/arch32目录下。这样，pacman 的日志文件将是/opt/arch32/var/log/pacman.log, 不会和64位的主系统混在一起。因此，并不需要在/opt/arch32/pacman.conf文件里添加LogFile指令，也不需要--logfile命令行选项，除非你想要把它们放在其它地方。

--cachedir选项用来设置包缓存的目录，默认是 /var/cache/pacman/pkg，现在要设置为 /opt/arch32/var/cache/pacman/pkg。对于有经验的用户，也可以使用外部的一个目录，这样在完成基本系统的安装后，/opt/arch32目录不会含有任何软件包，比较干净。今后要把 32 位子系统推倒重来的时候也比较方便，不需要重复下载软件包。

这两个目录需要预先创建，因此要执行：

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

--config选项设置 pacman 配置文件的位置，默认是 /etc/pacman.conf，现在要把它改为 /opt/arch32。

现在同步 pacman 数据库：

    pacman --root /opt/arch32 --cachedir /opt/arch32/var/cache/pacman/pkg --config /opt/arch32/pacman.conf -Sy

安装基本系统：

    pacman --root /opt/arch32 --cachedir /opt/arch32/var/cache/pacman/pkg --config /opt/arch32/pacman.conf -S base base-devel

如果不打算在chroot环境里面编译包，可以不安装base-devel组：

    pacman --root /opt/arch32 --cachedir /opt/arch32/var/cache/pacman/pkg --config /opt/arch32/pacman.conf -S base

注意：你可能需要在一条命令里更新pacman数据库并安装基本系统：

    pacman --root /opt/arch32 --cachedir /opt/arch32/var/cache/pacman/pkg --config /opt/arch32/pacman.conf -Sy base base-devel

现在可以删除临时的pacman配置文件了：

    rm /opt/arch32/{pacman.conf,mirrorlist}

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

## 配置新系统

### 配置文件

首先，从主系统链接/拷贝一些有用的配置文件:

    cd /opt/arch32/etc

    cp /etc/passwd* .
    cp /etc/shadow* .
    cp /etc/group* .
    cp /etc/sudoers .  # note: 创建此文件前请先安装 Sudo

    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 .

Be sure to include the "." character. .

### 配置 chroot

Chroot 到新系统:

    /etc/rc.d/arch32 start
    xhost +local:
    chroot /opt/arch32

强烈建议你在“32位chroot环境”里面使用一个特别的 bash 提示符，以便区分你的状况。比如，在PS1字符串前面添加ARCH32。你可以在“.bashrc”或者其它配置文件里设定。

处理区域设置

    /usr/sbin/locale-gen
    pacman -S ttf-bitstream-vera ttf-ms-fonts wqy-zenhei

注意: 至少需要一种字体，否则显示不出字来。如果不装中文字体，将不能在32位环境下使用中文。

同时，记住“/etc/pacman.conf”现在是 32 位环境下的默认配置文件。[community] 仓库现在也默认开启了。

在执行以上pacman命令前，确保你把“/etc/pacman.d/mirrorlist”下面至少一个镜像取消注释。如果全部都注释掉了，pacman会报告“未预期的错误”。

现在你可以装上你想要的任何应用程序了.

    pacman -S acroread opera
    pacman -S mozilla-firefox
    pacman -S libxmu flashplugin
    pacman -S mplayer-plugin

在我们的32位环境，基本系统里有很多包其实用不着。你可以把这些包清除，释放一些空间。这些清除工作必须在32位chroot环境下进行，且必须在chroot之后才能运行！ 以下是可以删除的包列表:

    pacman -Rd mkinitcpio
    pacman -R linux grub dhcpcd rp-pppoe ppp xfsprogs reiserfsprogs jfsutils hdparm hwdetect syslog-ng logrotate lvm2 dcron wpa_supplicant pcmciautils

### 考虑清除软件包缓存

注意: 这条命令需要运行不仅一次。由于软件包是累积的，为了释放 pacman 缓存你必须隔一段时间运行该命令一次：

    pacman -Scc

如果磁盘空间不是很紧张，建议不要清除它，而是把缓存备份到别处。这样，当32位子系统不够干净（充满了不需要的垃圾包）时，可以简单地删除整个目录，然后恢复缓存后重来。这样可以省下很多不必要的程序包下载。

## 在 64 位环境下运行 32 位应用程序

### 下载安装schroot

把来自 community 仓库的“schroot”包安装到 64 位系统上：

    pacman -S schroot

### 配置

Schroot 已经默认配置好可以运行在我们的 Arch32 chroot环境下，所以你只要检查一下 /etc/schroot.conf 文件的 [Arch32] 节是否和你的系统配置相符即可。

你可能还需要编辑 `/etc/schroot/mount-arch32` 文件，看看之前写在 Arch32 脚本里面的 mount 锚点是否都在。当应用程序通过schroot运行的时候，它是看不到不在 `/etc/schroot/mount-arch32` 中列出的目录的。

例如，对于前面提到的 pulseAudio 支持，需要在 `/etc/schroot/mount-arch32` 文件中添加

    /var/lib/dbus	/var/lib/dbus	none	rw,bind		0	0

这样一行。

### 运行 32 位应用程序

最后，要使用所安装的 32 位程序的话只要执行：

    schroot -p -- opera -notrayicon

这会在32位环境下运行 Opera， 且没有系统托盘图标。

### 显示问题

如果收到如下错误信息

    X Error of failed request: BadLength (poly request too large or internal Xlib length error)

先试试运行一些需要视频加速的应用程序，确保你已经在 chroot 环境下安装了适合的显示驱动。例如

    pacman -S nvidia

### 发声

最常用的 32 位应用程序是flash，比如说上 YouTube。

要让 firefox 里的 flash 播放器出声，打开一个终端并且 chroot 到 32 位子系统：

    chroot /opt/arch32

然后在那里装上 alsa-oss：

    pacman -S alsa-oss

然后输入：

    export FIREFOX_DSP="aoss"

每次进入 32 位系统均需要执行这一 export 命令。因此你应该考虑把它放进一个自动执行的脚本里面。

最后，运行 Firefox 就可以了。

### Firefox发声脚本示例

打开一个文本编辑器，另存以下内容为 /usr/bin/firefox32 （用超级用户，或者 sudo）：

    #!/bin/sh
    schroot -p firefox $1;export FIREFOX_DSP="aoss"

使该脚本可执行：

    sudo chmod +x /usr/bin/firefox32

现在，如果愿意你可以为firefox创建一个别名：

    alias firefox="firefox32"

把以上命令加入 $HOME/.bashrc 文件后面，然后在bash里运行一下就可以让它马上生效。或者你也可以把桌面环境所有启动器指向 firefox32，如果你仍然希望运行64位的firefox。

### wine 脚本示例

为了编译 wine, 你需要先装上 32 位系统。为了让PulseAudio能用也许需要打打补丁，这时必须编译 wine。

把 wine 别名加到 .bashrc （或者类似的文件）里： Add following to .bashrc (or similiar) alias for wine:

    alias wine='schroot -pqd $(pwd) -- wine'

注意 -q 参数使 schroot 运行于安静模式，效果就仿佛在运行真正的wine一样。

### 注意事项

如果你还在使用老的 dchroot 而不是这里介绍的schroot，你应该用-d选项而不是-s。

## 另类安装方法

在上面的安装过程中，我们把 base 组装在了目标系统。正如前面所看到的，有许多包其实没有必要装在子系统上。为了得到一个更干净、更精简的32位子系统，可以不在子系统内安装 pacman 及其相关包，而是依赖于64位系统的 pacman。但是，32位子系统必须拥有自己的软件包数据库。

首先还是要创建 32 位主目录

    mkdir /opt/arch32

然后生成配置文件。这一次，我们永久依赖这些文件来安装随后的软件，因此不要把它们删除。

    sed -e 's/x86_64/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

创建 pacman 所需的目录。如果你象我一样使用外部的 cache 目录，请自行修改一下此命令。

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

创建 pacman32 的别名（添加如下命令到 .bashrc 或者类似脚本里）：

    alias pacman32="pacman --root /opt/arch32 --cachedir /opt/arch32/var/cache/pacman/pkg --config /opt/arch32/pacman.conf"

同步 pacman 数据库

    pacman32 -Sy

安装 bash 以及一些必要软件

    pacman32 -S filesystem licenses bash sed coreutils gzip

然后参照前面所述，创建 /etc/rc.d/Arch32 脚本，拷贝配置文件，即可进入 chroot 环境。此后，所有 pacman 命令均需在64位系统下运行 pacman32 代替。

此方法的优点是无须担心删除无用的包，只有真正需要用到的包才会被安装。

Category:

- About Arch (简体中文)