# Arch64 FAQ (简体中文)

下面是关于Arch64的问答列表。

## 我如何确定我的处理器是否支持 x86_64?

### Linux 用户

运行下面的命令：

    $ less /proc/cpuinfo

查找 `flags` 条目。如果你看见 `lm` 标志，那么你的处理器是支持 x86_64 的。

或者你可以运行以下命令：

    $ grep "^flags.*\blm\b" /proc/cpuinfo

### Windows 用户

使用免费软件 CPU-Z，可以确定CPU是否支持64位。

带有 AMD 的 "AMD64" 指令集或者英特尔的 "EM64T" 指令集的 CPU 兼容 x86_64 发行版和二进制包。

## 我应该使用32位还是64位版本的 Arch?

如果你的处理器支持 x86_64，你应该使用 Arch64。

## 如何安装Arch64？

使用官方安装iso光盘.

## 移植完整吗？

目前的移植已经可以应付日常的桌面和服务器环境的使用。

## 是否拥有所有32位 Arch 环境下的软件包？

仓库已经被移植，并且可喜的是完全可以正常工作。

有很少部分 AUR 中的包只列出了 `'i686'`，但是大部分包都可以在64位环境工作，只需要添加 `'x86_64'`。

## 为什么使用64位?

64位系统(大多数情况下)更快，而且更安全。更安全是由于拥有 Address space layout randomization (ASLR) 、 Position-independent code (PIC) 特性，以及 NX Bit (它在i686内核中由于禁用了PAE而无法使用)。如果你的计算机在运行4GB或者更多的内容，应该使用64位系统，因为多余的内存无法被32位系统分配。

编程人员也更加倾向于不关心32位系统，因为新的x86 CPU通常都支持64位扩展。

还有许多其他的理由让我们不使用32位系统，但是在内核、用户空间和单独的程序中我们没有办法列出所有的64位比32位做得好的地方。

## 如何提交bug？

请用Arch的 flyspray 错误跟踪系统提交。但是如果你认为这是和移植有关的问题，请在标题里注明x86_64！

## 我该设置哪个仓库给pacman使用？

所有仓库都支持移植。

## 我该如何修补已有的PKGBUILD使它可以在Arch64下使用？

我们在所有移植了的包里加入这个变量：

    arch=('i686' 'x86_64')

直接修补source和md5sum区域使得可以使用完全不同的来源：

    [ "$CARCH" = "x86_64" ] && source=(${source[@]} 'other source')
    [ "$CARCH" = "x86_64" ] && md5sums=(${md5sums[@]} 'other md5sum')

在build区域可以这样打补丁：

    [ "$CARCH" = "x86_64" ] && (patch -Np0 -i ../foo_x86_64.patch || return 1)

或者你需要更大的修改：

    if [ "$CARCH" = "x86_64" ]; then
        configure/patch/sed      # for x86_64
      else configure/patch/sed   # for i686
    fi

## Arch64缺少什么？

实际上，没有。现在基本上所有的程序都支持64位，或者正在过渡到兼容64位。

最大的问题是一些包或者是闭源的，或者包含一些x86的汇编代码，很难移植到64位中(尤其是模拟器)。

下列应用程序原本是有问题的，现在可以在AUR 中得到，并且工作很好：

- Acrobat Reader 现在没有 64 位版本，但是你也可以在兼容模式中运行32位版本。有一些开源替代可以用来阅读 PDF 文件。

其他的一切都运行的很好。如果你发现某个Arch32软件包可以在x86_64下编译而又没有移植，（也许你在其他的64位发行版中发现了原生包），请联系开发人员或在论坛请求新软件包。

## 我能否在Arch64里运行32-bit应用程序？

可以！

- 你可使用 multilib 软件仓库中的 `lib32-*` 库。添加下面几行到 `/etc/pacman.conf` 启用该软件仓库：

    [multilib]
    Include = /etc/pacman.d/mirrorlist

现在(2011年12月)，它包含 wine 和 skype。另外，还包含一个 multilib 编译器。

- 或者你可以创建另一个使用32位系统的 chroot (参考 Arch64 Install bundled 32bit system):

启动到Arch64，startx，打开一个终端：

    $ xhost +local:
    $ su
    # mount /dev/sda1 /mnt/arch32
    # mount --bind /proc /mnt/arch32/proc
    # chroot /mnt/arch32
    # su your32bitusername
    $ /usr/bin/command-you want # or eg: /opt/mozilla/bin/firefox

某些32-bit应用程序（例如OpenOffice）可能需要其它绑定。下面几行可以放到rc.local里以确保满足所有32-bit应用程序的需要（假设fstab里已经挂载/mnt/arch32于）：

    mount --bind /dev /mnt/arch32/dev
    mount --bind /dev/pts /mnt/arch32/dev/pts
    mount --bind /dev/shm /mnt/arch32/dev/shm
    mount --bind /proc /mnt/arch32/proc
    mount --bind /proc/bus/usb /mnt/arch32/proc/bus/usb
    mount --bind /sys /mnt/arch32/sys
    mount --bind /tmp /mnt/arch32/tmp
    #如果你不使用同一个home文件夹的话，可以注释掉下面这行
    mount --bind /home /mnt/arch32/home

然后在终端里输入：

    $ xhost +localhost
    $ sudo chroot /mnt/arch32 su your32bitusername /opt/openoffice/program/soffice

## 我可以在Arch64下编译给i686用的32-bit软件包吗？

可以。你可以使用：

- 从multilibC仓库中使用相关包的 multilib 版本，或者
- 一个 i686 chroot。

### Multilib 仓库 - Multilib_Project

想要使用 multilib 仓库，编辑 `/etc/pacman.conf` 添加下面内容：

    [multilib]
    Include = /etc/pacman.d/mirrorlist

升级系统：

    # pacman -Syu

然后安装 gcc-multilib 及其依赖。

    pacman -S gcc-multilib gcc-libs-multilib binutils-multilib libtool-multilib lib32-glibc

注意: 如果系统安装了 `base-devel` ，用户必须按照下面的说明用 [multilib] 版本替换 [extra] 版本。
注意: gcc-multilib 能够编译32位和64位代码。你可以在 x86_64 系统中安全的安装 `multilib-devel` 然后移除 `base-devel`。参见 https://bbs.archlinux.org/viewtopic.php?id=102828 获取更多信息。

    # pacman -S gcc-multilib gcc-libs-multilib binutils-multilib libtool-multilib lib32-glibc
    resolving dependencies...
    warning: dependency cycle detected:
    warning: lib32-gcc-libs will be installed before its gcc-libs-multilib dependency
    looking for inter-conflicts...
    :: gcc-libs-multilib and gcc-libs are in conflict. Remove gcc-libs? [y/N] y
    :: binutils-multilib and binutils are in conflict. Remove binutils? [y/N] y
    :: gcc-multilib and gcc are in conflict. Remove gcc? [y/N] y
    :: libtool-multilib and libtool are in conflict. Remove libtool? [y/N] y

    Remove (4): gcc-libs-4.6.1-1  binutils-2.21.1-1  gcc-4.6.1-1  libtool-2.4-4

    Total Removed Size:   87.65 MB

    Targets (7): lib32-glibc-2.14-4  lib32-gcc-libs-4.6.1-1  gcc-libs-multilib-4.6.1-1  binutils-multilib-2.21.1-1
                 gcc-multilib-4.6.1-1  lib32-libtool-2.4-2  libtool-multilib-2.4-2

    Total Download Size:    25.04 MB
    Total Installed Size:   108.27 MB

    Proceed with installation? [Y/n]

在 x86_64 系统上编译 i686 程序，只需要简单的添加下面的几行到 `~/.makepkg.conf`

    CARCH="i686"
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-m32 -march=i686 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
    CXXFLAGS="${CFLAGS}"

然后通过下面的命令调用 makepkg

    $ linux32 makepkg -src

记得编译完成 i686 包之后移除或更改 `~/.makepkg.conf`。

### Chroot

想要使用 i686 chroot (推荐在Arch64里使用i686 iso的"quickinstall"来安装，或者参考 Arch64 Install bundled 32bit system)。从current仓库安装"linux32" 封装包，使得chroot象一个真正的i686系统。然后用这个脚本以root身份登录到chroot环境：

    #!/bin/bash
    mount --bind /dev /path-to-your-chroot/dev
    mount --bind /dev/pts /path-to-your-chroot/dev/pts
    mount --bind /dev/shm /path-to-your-chroot/dev/shm
    mount -t proc none /path-to-your-chroot/proc
    mount -t sysfs none /path-to-your-chroot/sys
    linux32 chroot /path-to-your-chroot

如果你在x86_64宿主系统里保留了源码，你可以在脚本里再加入

    "mount --bind /path-to-your-stored-sources /path-to-your-chroot/path-to-your-stored-sources"

使得宿主可以共享源码给chroot系统，使得可以在 `/etc/makepkg.conf` 中用来创建软件包。

## 我可以无需重新安装将我的系统从i686升级/切换到x86_64吗？

不可以。但是有一个帖子说明了如果成功的从32位迁移到64位而不损失任何配置/设置/数据。注意：需要用一个大的外置硬盘来完成迁移

然而，你也可以用Arch64安装光盘启动系统，挂载磁盘，备份所有你希望保留的非32-bit二进制文件（例如/home和/etc，然后开始安装。

你也许需要阅读 Migrating Between Architectures Without Reinstalling。

Category:

- Arch64 (简体中文)