# Install from Existing Linux (简体中文)

此指南合并和更新了 Wiki 上三个已经存在的相似安装指南，用于指导所有希望通过已有 Linux 安装 Arch Linux 的用户。已有 Linux 可以是 LiveCD 也可以是以前安装的其它发行版。

## 概述

Archlinux 的 pacman 可以通过 -r 选项配置成在任意目录下工作，运行时指定的目录成为“根目录”。

在从其他发行版的 Live CD 或安装的系统构建 Arch Linux 的过程中，这一功能很有用。另外，它还可以用来在 主机 上建立 chroot 环境，维护一个开发和发行时使用的 "golden-master"，以及其他有趣的主题，例如在 NFS 或无盘工作站上建立 rootfs。

如果是一台 x86_64 主机，甚至可以使用i686-pacman来构建一个32为的 chroot 环境。参见 Arch64 Install bundled 32bit system.

在这个指南中，我们将通过/dev/sdxx 指定磁盘。它们代表系统上的目标分区所对应的 dev 项。规范是：

    Drive 1, Partition 1:  /dev/sda1
    Drive 1, Partition 2:  /dev/sda2
    Drive 2, Partition 1:  /dev/sdb1

等等...

一般会用 /dev/sdxx 表示，在您的系统上，可能需要替换为 /dev/sdxx。

在本文中，

主机
  指执行安装的机器.

目标机
  指您要安装 Arch 的机器.

它们可能是同一机器。主机不需要是 Arch 系统 -- 它可以是 Debian 或 Redhat 系统。章节"安装主机系统" 解释如何在主机上安装 pacman。 随后的章节"架设目标系统" 解释如何使用主机上的 pacman 在目标机器上安装 Arch。所以如果主机已经运行了 Arch，您可以跳到 "设置目标系统"。

## 设置主机系统

在主机 Linux 系统中安装 pacman。此外还需要一个 pacman 镜像列表以下载可用软件包的数据和软件包本身。

### 获取需要的软件包

需要获取主机系统需要的软件包，这里假设您使用 i686 环境 如果您运行的是 64bit linux，请将 "i686" 替换为 "x86_64"。

这里给出的所有版本号都可能发生变化，请先检查软件包的版本号并记录下来。版本号可以在如下地址找到：

- pacman
- pacman-mirrorlist

确定版本号后就可以下载它们(更改 ARCH 以满足您的要求):

    ARCH=i686
    mkdir /tmp/archlinux
    cd /tmp/archlinux

现在下载需要的软件包：

    wget https://www.archlinux.org/packages/core/$ARCH/pacman/download/  --no-check-certificate
    wget https://www.archlinux.org/packages/core/any/pacman-mirrorlist/download/  --no-check-certificate

注意: 如果 wget 无法获得下载文件名，请尝试使用 --trust-server-names. 提示: 可以使用别名:

    alias wget='wget --trust-server-names'

注意: 如果你下载 pacman-mirrorlist 遇到问题，使用下面的命令：

     wget http://mirrors.kernel.org/archlinux/core/os/x86_64/pacman-mirrorlist-20101223-1-any.pkg.tar.gz

pacman 需要一些库才能正常运行：

    wget https://www.archlinux.org/packages/core/$ARCH/libarchive/download/
    wget https://www.archlinux.org/packages/core/$ARCH/openssl/download/
    wget https://www.archlinux.org/packages/core/$ARCH/xz/download/
    wget https://www.archlinux.org/packages/core/$ARCH/expat/download/

解压所有需要的包：

    for f in *.tar.gz ; do tar xzvf $f ; done

准备运行 pacman 之前，不要忘记编辑 `/tmp/archlinux/etc/pacman.conf` 让其指向 `/tmp/archlinux/etc/pacman.d/mirrorlist` 并选择您常用的镜像。为了方便，(假设您使用 `bash` 或 `zsh`)，可以设置环境变量

    export PATH=/tmp/archlinux/usr/bin:$PATH
    export LD_LIBRARY_PATH=/tmp/archlinux/usr/lib:$LD_LIBRARY_PATH
    alias pacman="pacman --config /tmp/archlinux/etc/pacman.conf"

### 在主机上安装需要的文件

#### 解压软件包

如果不介意主机文件的放置位置，可以把所有下载的压缩包解压到根目录，以 root 权限运行：

    cd /
    for f in /tmp/archlinux/pacman-*pkg.tar.gz ; do
      tar xzf $f
    done

#### 不同发行版的安装方式

- 如果是从 Ubuntu 9.10's LiveCD (或其他版本)安装，除了 pacman 文件 (共享库)之外，还需要别的文件才能运行。请用 Lucky's 位于[这里] 的脚本获取/安装它们。

- 此外，您可以使用 alien 工具把压缩包转化为发行版使用的软件包，查看软件的手册以获得详细帮助。生成的软件包可以用主机发行版的常用软件包管理工具安装。这种方式与主机系统的整合最好。以基于 Debian 的软件包系统为例：

    cd /tmp/archlinux
    alien -d pacman-3.3.3-1-i686.pkg.tar.gz
    alien -d pacman-mirrorlist-20101223-1-any.pkg.tar.gz

注意: RPM based systems will need to replace the parameter "-d" with "-r". These distribution packages can then get installed using the normal package management tools of the host linux environment.

- 在 Fedora 12 中，我唯一成功安装 pacman 的方法为使用 https://bbs.archlinux.org/viewtopic.php?pid=734336#p734336 提供的脚本，工作的很好。

- 在 Gentoo 中: 在`/etc/portage/package.keywords` 中添加 `sys-apps/pacman` unmask pacman. 然后运行 `emerge -av pacman`.
  这里有一个 更详细的指南.

### 配置主机系统

根据喜好配置 /etc/pacman.conf 并删除 /etc/pacman.d/mirrorlist 中多余的镜像。同时，至少启用一些镜像，因为有些可能暂时无法访问。如果未设置镜像，同步时会出错。可以在 /etc/pacman.d/mirrorlist 中手动解析 DNS，因为 i686 的 pacman 可能无法在 x68_64 系统上获取地址信息。

如果是从 LiveCD 安装，而且系统的内存和交换分区的组合比较小(< 1 GB)，请务必将 /etc/pacman.conf 中的 cachedir 设置为 Arch 的新分区(即 `/newarch/var/cache/pacman/pkg`)。 否则可能在下载安装软件包的过程中耗尽内存。

## 安装目标系统

### 准备好安装 Arch 的分区

Arch 不是必须位于单独的分区中。可以在一个普通文件夹建立根文件系统，然后从中生成主压缩包或通过网络传输。

然而，大部分用户都会选择将 Arch 安装到独立的分区中。

准备所有需要的分区和文件系统，如果主机包含图形工具，例如 gparted, cfdisk 或者 mandrakes diskdrake 请自行选择使用。

要把一个分区格式化成 ext3 ，你可以使用（假设你的分区是 /dev/sdxx）：

    mkfs.ext3 /dev/sdxx

要格式化成带日志和dir_index 的 ext3：

    mkfs.ext3 -j -O dir_index /dev/sdxx

格式化为 reiserfs:

    mkreiserfs /dev/sdxx

格式化交换分区并启用：

    mkswap /dev/sdxx
    swapon /dev/sdxx

其他分区格式可以使用相应的 mkfs 工具，可以用 tab 自动补全查看。可用的文件系统由主机系统决定。

设置好了你的文件系统，就可以挂载了。本文挂载位置是 /newarch，你可以挂载到任意地方。

    mkdir /newarch
    mount /dev/sdxx /newarch

### 安装核心系统

更新 pacman，需要先创建 `/newarch/var/lib/pacman` 目录(参见上面的 #设置主机系统):

    mkdir -p /newarch/var/lib/pacman
    pacman -Sy -r /newarch

Note: (在 64 位主机上运行时出现的问题)如果运行 pacman 时碰到 `/tmp/archlinux/usr/bin/pacman: No such file or directory` 请建立到 ld-linux-x86-64.so.2 的符号链接： `ln -s /lib64/ld-linux-x86-64.so.2 /lib/`

安装 'base' 软件包组：

    pacman -S base -r /newarch

警告: -r 选项不会更改 Pacman 的缓存目录。如果不想让 Pacman 在主机系统创建缓存，请通过 --cachedir 或者 pacman.conf 配置文件指定，参见 #设置主机系统。

修改主机 pacman.conf 的例子：

    pacman --cachedir /newarch/var/cache/pacman/pkg -S base -r /newarch

### 准备 /dev 节点

首先，保证为 udev 创建了正确的 /dev 节点：

    ls -alF /newarch/dev

将生成类似如下内容的列表：

    crw-------  1 root root 5, 1 2008-12-27 21:40 console
    crw-rw-rw-  1 root root 1, 3 2008-12-27 21:42 null
    crw-rw-rw-  1 root root 1, 5 2008-12-27 21:40 zero

删除并重建包含错误权限( crw-... 和两个 root )和主次设备号(日期前的两个数字)的文件。

    cd /newarch/dev
    rm console ; mknod -m 600 console c 5 1
    rm null ; mknod -m 666 null c 1 3
    rm zero ; mknod -m 666 zero c 1 5

所有的节点都应该创建完毕，您不需要再重新创建它们。

### Chroot

现在将chroot 到新 Arch 系统。

为了让 DNS 正确工作，需要编辑 `/newarch/etc/resolv.conf` 或者使用现有系统 resolv.conf 替换：

    cp /etc/resolv.conf /newarch/etc/

同时，为新系统创建正确的 mirrorlist：

    cp /etc/pacman.d/mirrorlist /newarch/etc/pacman.d

为新系统挂载需要的文件系统：

    mount -t proc proc /newarch/proc
    mount -t sysfs sys /newarch/sys
    mount -o bind /dev /newarch/dev

如果有单独的 `/boot` 分区，可能也要挂载它，详情参见 Change Root。

都准备完毕后，chroot 到新系统：

    chroot /newarch /bin/bash

### 安装剩余部分

安装你喜欢用的kernel，以及其他你想要安装的包。例如要安装默认内核(已经安装过了)，请使用：

    pacman -S linux

如果还需要安装别的软件包，使用下面的命令：

    pacman -S 包名

### 配置新系统

编辑 `/etc/fstab`，记得添加 /, swap 和其他希望使用的分区。

按需要编辑 `/etc/rc.conf`，`/etc/hosts` 和 `/etc/mkinitcpio.conf`。如果要安装到 U 盘，不要忘了在 `/etc/mkinitcpio.conf` 中增加 `usb` 钩子然后重新编译initcpio 镜像:

    mkinitcpio -p linux

编辑 `/etc/locale.gen`，取消希望添加 locale 前的注释，然后重建 locale：

    locale-gen

### 设置 Grub

要在 chroot 后使用 GRUB，请更新 `/etc/mtab`：

    grep -v rootfs /proc/mounts > /etc/mtab

现在可以运行：

    grub-install /dev/sdx

如果 grub-install 失败，需要手动安装：

    grub
    grub> find /boot/grub/stage1     (如果一切正常，这里应该有显示，否则请检查安装步骤。)
    grub> root (hd0,X)
    grub> setup (hd0)
    grub> quit

再次检查 `/boot/grub/menu.lst`，根据主机的不同，可能需要将 hda 修改为 sda 并增加 /boot 前缀。

#### 手动恢复 GRUB 库

如果 `*stage*` 文件配置在位于 `/boot/grub`，而系统安装的时候并没有安装启动加载程序或者分区/文件系统损坏，误删除等，可以手动安装 grub 库：

    # cp -a /usr/lib/grub/i386-pc/* /boot/grub

注意: 如果 boot 分区是独立的，不要忘记挂载它!上面假定 boot 分区位与根文件系统内或者挂载到了 /boot !
警告: 如果有单独的 `/boot` 分区并准备使用 grub2，请确保 chroot 后挂载 `/boot`。如果在 chroot 前挂载 `/boot` grub2 会认为 `/boot` 和 root 位于相同分区，不能正确更新。

此 wiki 上包含 GRUB, GRUB2, LILO, Burg 和 Syslinux 的详细页面。参见 Category:Boot loaders。

### 安装完毕

阅读 新手指南：配置系统，可以忽略 2.11，但是其它部分应作为安装后配置的参考。

离开 chroot:

    exit
    umount /newarch/boot   # if you mounted this or any other separate partitions
    umount /newarch/{proc,sys,dev}
    umount /newarch

重启到新 Arch 系统！

## Troubleshooting

### Kernel Panic

启动时如果遇到下面的错误信息：

    kinit: couldn't open console, no such file...

那么可能是因为没有创建必要的设备文件，按照上面的步骤创建设备即可。

### 根设备 '/dev/sd??' 不存在

如果重启时遇到如下错误信息：

    Root device '/dev/sda1' doesn't exist, attempting to create it... etc.

意味着设备命名成立 "hda1" 而不是 "sda1"，需要更改 GRUB 或 LILO 设置以使用 "hd??" 或者：

编辑 /etc/mkinitcpio.conf 将"HOOKS=" 一行中的 "ide" 改成 "pata" 并重新生成 initrd。 (请先进入 chroot 系统。)

    mkinitcpio -p linux

如果使用 LVM，请在 HOOKS 行添加 "lvm2"，并重新生成 initrd。

如果系统需要 PATA ，请将其放置在mkinitcpio.conf 的 autodetect 钩子之前。

如果根分区是 USB 设备，需要在“HOOKS=” 行最前面添加 “usb”，要放在 “base” 之前。

# 另一个方法：利用 Arch 镜像从已有 Linux 系统安装

### 准备安装环境

从 Arch 下载页面下载安装镜像然后挂载： 以 i686 CD 镜像为例:

    $ mkdir -v /mnt/image
    $ mount -o loop archlinux-2011.08.19-core-i686.iso /mnt/image

创建镜像解压目录和 chroot 环境

    $ mkdir -v /mnt/extract
    $ mkdir -pv /mnt/archlinux/lib/modules
    $ mkdir -pv /mnt/archlinux/usr/share
    $ mkdir -pv /mnt/archlinux/repo/core/{i686,any}

解压镜像内容:

    $ cd /mnt/image/arch/i686/

    # root-image
    $ unsquashfs -dest /mnt/extract/root root-image.fs.sfs
    $ mount -t ext4 /mnt/extract/root/root-image.fs /mnt/archlinux

    # lib-modules
    $ unsquashfs -dest /mnt/extract/modules lib-modules.fs.sfs
    $ mount -t ext4 /mnt/extract/modules/lib-modules.fs /mnt/archlinux/lib/modules

    # repo-core-i686
    $ mount -o loop -t squashfs repo-core-i686.sfs /mnt/archlinux/repo/core/i686

    $ cd /mnt/image/arch/any/

    # usr-share
    $ unsquashfs -dest /mnt/extract/share usr-share.fs.sfs
    $ mount -t ext4 /mnt/extract/share/usr-share.fs /mnt/archlinux/usr/share

    # repo-core-any
    $ mount -o loop -t squashfs repo-core-any.sfs /mnt/archlinux/repo/core/any

执行完后，新的 archlinux 目录中已经包含了一个 Arch 系统。

### 从新环境安装

chroot 到新系统：

    $ mount -t proc /proc /mnt/archlinux/proc
    $ mount -t sysfs /sys /mnt/archlinux/sys
    $ mount -o bind /dev /mnt/archlinux/dev
    $ chroot /mnt/archlinux /bin/bash

现在，继续运行 Arch 的 aif 安装程序!

    $ aif -p interactive

这样就能从 CD 或互联网正常安装，只需注意：

- 目标分区不能被主机系统使用

从 chroot 环境安装 Arch 后，需要卸载 aif 在安装过程中挂载的分区

    $ umount /mnt/boot,home...
    $ exit
    $ umount /mnt/archlinux/{dev,sys,proc}
    $ umount /mnt/archlinux/lib/modules
    $ umount /mnt/archlinux/usr/share
    $ umount /mnt/archlinux/repo/core/{i686,any}
    $ umount /mnt/archlinux
    $ umount /mnt/image
    $ rm -r /mnt/{archlinux,extract}

在离开 chroot 环境前卸载，否则无法卸载 chroot 分区。

### 通过 chroot 从 主机系统更新和安装软件包

在主机系统或 Arch 新安装的 Grub 的 menu.lst 中添加入口，将 Arch 文件系统加入 /boot/grub/menu.lst 。

现在重启或 chroot 到 Arch 的分区并安装后续软件包：

    $ mkdir /mnt/arch
    $ mount /dev/sdxx /mnt/arch
    $ mount -t proc proc /mnt/arch/proc
    $ mount -t sysfs sys /mnt/arch/sys
    $ mount -o bind /dev /mnt/arch/dev
    $ chroot /mnt/arch /bin/bash

升级安装软件包：

    # pacman -Syu

Categories:

- 简体中文
- Getting and installing Arch (简体中文)