# Enhancing Arch Linux Stability (简体中文)

这篇文章的目的在于提供一些怎样使 Arch Linux 系统尽可能稳定的建议。由于 Arch 的滚动发行方式和快速的软件包更新机制，虽然开发人员和可信用户尽最大努力发布高质量的软件包，Arch Linux 系统可能还是不适合用于运行关键任务的商业生产环境中。

但是，由于 Arch 坚持简洁的配置，拥有快速的 Bug 提交/修复周期，以及使用未打过补丁的上游代码的原因，系统本身具有内在的稳定性。因此，按照如下的配置与维护的建议，用户应该可以运行一个相当稳定的系统。另外，这里还提供了在系统产生严重的不正常行为时，能简化系统修复工作的建议。

Arch Linux 能够有多稳定？从 Arch 论坛中有很多经验丰富的系统管理员将 Arch 配置为生产用服务器的例子，Archlinux.org 就是其中一个。在桌面应用中，合理的配置与维护下 Arch 能提供极高的稳定性。

# 设置 Arch

第一次安装和配置Arch Linux的时候，用户在配置，软件和驱动方面有广泛的选择。这些选择会影响整个系统的稳定性。

## 对于 Arch 特定的建议

### 建立一个大的 /var 分区并保留旧软件包

安装系统设置分区时，请确保留给 /var 一个足够大的、独立的分区。一个 /var 分区通常应该有6~8GB大小——有一些服务运行时应该留有更大的空间。Pacman 把所有以前安装过的软件包归档在/var/cache/pacman/pkg文件夹内，而这需要相当大的硬盘空间。保留这些软件包是有必要的。当最近的一次软件包升级导致系统不稳定时，就可以将软件降级到一个旧的软件包。参看以下部分Revert Package Upgrades That Cause Instability。

### 使用推荐配置

在 Arch Linux 详细的安装与配置的文档中，对于系统某一特定方面通常会有很多种不同的配置方式。建议在配置系统时选择默认或是推荐的内容。推荐及默认的配置对一般的应用都是最有效的，可以使得系统稳定性更佳，且有利于系统维护。

### 谨慎使用非官方或测试不足的软件包

避免使用 testing 软件仓库，或者从 testing 仓库中获得的独立软件包。这些实验性的软件包是用于开发和测试的，并不适合用于稳定的系统。

在使用 AUR 中的软件包时应有预防措施。AUR 中的大部分软件包都是由用户提供的。因此它们或许并不能和官方软件仓库中拥有相同的质量。在编译和安装 AUR 中的软件包之前，务必检查软件包的 PKGBUILD 确保其中不含有错误或恶意的代码。

谨慎使用 AUR helpers ，他们简化了 AUR 中的软件包的安装过程但可能会是用户编译和安装具有包含错误和恶意代码的 PKGBUILD 的软件包。在编译且/或安装这些软件包之前一定要对 PKGBUILD 进行完整性检查。

最后，使用任何 AUR helpers 都是极其不明智的。使用 root 用户运行 makepkg 同样如此。

只在绝对必要的情况下使用第三方的软件仓库，或者你知道你在做什么。务必使用来自可信任的源的第三方软件仓库。

### 使用更新及时的源镜像

使用经常从主 Arch FTP 服务器上进行最新软件包更新的稳定的镜像。从 Arch 镜像检查页面来验证所使用的镜像是否是最新的。使用最新更新的镜像能确保在日常维护的过程中，系统总是能获得最新的软件包和软件包数据库。

另外，如果使用了镜像，编辑 /etc/pacman.d 中的镜像列表文件。使得使用的镜像位于列表的顶端。参考 Enabling your favorite mirror 来获得更详细的信息，比如安装 rankmirror 脚本来启用最快的镜像。这些步骤确保系统使用最快的且最可靠的镜像。

在更改用于更新的镜像服务器后，使用 pacman -Syu 来确保你的系统是最新的。

### 避免开发版软件包

安装开发版的软件包很有可能造成系统的严重破坏。因此对于 AUR 中的包以及部分 community 中的包需要一些谨慎，这些开发中的包是直接从上游开发版分支中获取到的，通常会在包的名字上注有：dev, devel, svn, cvs, git, hg, 或是 darcs 的信息。

特别强调，诸如内核（kernel）和 C 库(glibc) 之类与系统运行密切相关的包不应该去尝试安装 testing 或是 community 源中的开发版版本。

如果通过 makepkg 来自行编译安装包，需要确认 PKGBUILD 是否包含了相应条目，是否符合 Arch packaging standards 规范。可以使用 namcap 来检查 PKGBUILD 文件或是编译出的 .tar.gz 文件的合法性。

### 安装 linux-lts 软件包

linux-lts 是 Arch 官方提供的基于 Linux kernel 3.0 的长期支持内核。内核上游开发者针对此版本提供了长期支持，包括安全补丁和功能 backports。适用于需要长期支持的服务器环境用户，也可以将此内核作为新内核升级的后备内核。

    # pacman -S linux-lts

需要编辑 GRUB2 或 LILO 的启动加载项。

## 通用最佳方案

#### 使用包管理器安装软件

软件包管理(in Arch: pacman) 比起你记录你安装的文件能更好的管理软件包. 如果你手动地安装软件，你会过了一会就不知道你到底安装了什么，到底安装在哪里，安装导致的那些冲突，是否安装在了错误的地方，等等问题.

站在一个稳定的角度上你应该避免安装不支持的软件包和自定义的软件包,但是你如果真的需要这样的软件包比你手动编译安装更好.

    你也应该让make install 命令无作用(这是一个典型的许多问题的开始) 在 /root/.bashrc
     make() {
       [ "$1" == 'install' ] &&
         echo -e "WARNING:\nDON'T INSTALL SOFTWARE MANUALY\nDON'T USE unset make TO OVERRIDE" &&
         echo "Tip: It's easy to make own custom package see: man PKGBUILD makepkg" &&
         return 1;
       /usr/bin/make $@;
     }

### 使用历练过的、主流的软件包

安装成熟的、被测试过的、主流的软件包，这样可以避免那些仍然有bug的最新的软件包。此外，尽量避免安装那些“点0”更新，也就是x.y.0版本。例如，等到Foobar2.5.1发布再更新而不是安装Foobar 2.5.0版本。直到被证明是稳定的，再安装新开发的软件。比如，PulseAudio的早期版本有问题。那些需要最好的稳定性能的用户就会去用ALSA。最后一点，使用那些仍在开发状态中的软件。

### 选择开源驱动

尽可能地选择开源驱动。避免私有驱动。大多数时候，开源驱动比私有驱动更加稳定可靠。 开源驱动的bugs修改起来比较容易快速，但同时私有驱动提供更多的特性和性能，不过也可能带来稳定性的代价。为了避免这个两难选择，可以选择已知的有很好的开源驱动支持的硬件。关于硬件和开源Linux驱动的信息可以在这里找到：linux-drivers.org.

# 维护 Arch

In addition to configuring Arch for stability, there are steps one can take during maintenance which will enhance stability. Paying attention to a few SysAdmin details will help to ensure continued system reliability.

## Arch 具体建议

### 以合理的频率升级整个系统

很多Arch用户频繁的更新系统，甚至每天都使用pacman -Syu来升级他们的系统。如此频繁的更新是不必要的，应该以比较合理的间隔来更新系统使用最新的bug修正和安全更新，一周或者两周更新一次是个好主意。

如果系统中有来自AUR的包，使用 yaourt -Syu --aur来更新所有AUR包。注意这样的更新可能会比调用pacman -Syu或yaourt -Syu的正常更新使用更多的时间。

### 在升级系统前阅读

在升级Arch前, 一定要阅读Arch News来查看是否有主要的软件更改和最新软件包的是否配置文件的更改. 在更新如：内核，xorg和库文件到一个新版本等重要软件之前, 仔细查看论坛看是否有被报告的出错等问题.

### 注意升级过程中的警告

当升级系统时， 请一定要注意pacman输出的注意信息。 如果有需要用户手动操作的，请一定要立即搞定。 如果不明白pacman输出的信息， 请去论坛搜索或者看Arch Linux首页的新闻。

### 及时处理 .pacnew， .pacsave，和 .pacorig 文件

When pacman removes a package that has a configuration file, it normally creates a backup copy of that config file and appends .pacsave to the name of the file. Likewise, when pacman upgrades a package which includes a new config file created by the maintainer differing from the currently installed file, it writes a .pacnew config file. Occasionally, under special circumstances, a .pacorig file is created. Pacman provides notice when these files are written.

Users must deal with these files promptly when pacman creates them, in order to ensure optimum system stability. Users are referred to the Pacnew and Pacsave files wiki page for detailed instructions.

### 考虑使用 Pacmatic

Pacmatic 是pacman的一个包装器在升级前自动检查Arch的更新新闻. Pacmatic也能保证pacman本地数据库和在线镜像正确的保持同步更新,这样就避免了笨拙地使用pacman -Sy更新数据库发生的潜在在错误. Finally, it provides more stringent warnings about updated or obsolete config files. Pacmatic is available from the AUR. To use pacmatic with yaourt, edit the /etc/yaourtrc file so that the PacmanBin line reads:

    PacmanBin /usr/bin/pacmatic

### 避免特定的 Pacman 命令

Arch being a rolling release distribution, it can be dangerous to refresh pacman databases without doing a full system upgrade immediately after. Avoid using pacman -Sy Package-Name to install a package, but always use pacman -S Package-Name instead. And upgrade your system regularly with pacman -Syu.

Avoid using the -f option with pacman, ESPECIALLY in commands such as pacman -Syuf involving more than one package. The --force option ignores file-conflict and can even cause file loss when files are relocated between different packages! In a properly maintained system, it should never need to be used.

Do not use pacman -Rd Package-Name. Using the -d flag skips dependency checks during package removal. As a result, a package providing a critical dependency could be removed, resulting in a broken system.

Never run pacman -Scc unless there is a desperate need for the disk space, and little or no need for archived package files. It is safer to keep older packages available in the cache archives in the event a package upgrade causes problems, requiring a package reversion. Instead, just use the following command to clean out the archived packages in the pacman cache, of packages previously removed from the pacman database:

    pacman -Sc

Make sure to only use this command if there is no intention of re-installing recently removed packages. If such packages are re-installed after this command has been executed, there will be no older, archived versions of the packages in the pacman cache.

In the event that /var disk space becomes scarce, move all archived packages to the home directory using the fdup-archpkg script. Use the fduppkg script to move all but the last previously installed package versions in the pacman cache archives, to the home directory.

### 还原导致不稳定的软件包升级

如果某个特定的软件的升级导致了系统不稳定，请使用以下命令来安装本地缓存中那个软件的上一个稳定版本：

    pacman -U /var/cache/pacman/pkg/Package-Name.pkg.tar.gz

更多关于还原旧版本软件包的细节，请看 Downgrading Packages (简体中文)。

当就版本本还原后，暂时将它加入 pacman.conf文件中的忽略升级部分， 直到之前的问题得到解决。 具体建议可以查看Arch Wiki或论坛求助， 如果有必要可以提交bug。

### 定期备份已安装软件包的列表

At regular intervals, create a list of installed packages and store a copy on one or more offline media, such as a USB stick, external hard drive, or CD-R. Use the following command to create a pkglist:

定期使用一下命令创建已安装软件列表并储存在一个或多个介质上，比如U盘，移动硬盘，CD等等：

    $ pacman -Qqne > /path/to/chosen/directory/pkg.list

一旦系统崩溃需要重装，可以使用以下命令很快地恢复：

    # pacman -S --needed $(< /path/to/chosen/directory/pkg.list )

### 定期备份 Pacman 数据库

At regular intervals - possibly before each system upgrade, using yaourt, execute the following command to backup the local pacman database:

    yaourt -B /path/to/chosen/directory/

Yaourt can be used to restore the backup pacman database file with the following command:

    yaourt -B /path/to/chosen/directory/Name-of-Backup-File.tar.bz2

The following command will accomplish the same task, and can be run as a cronjob:

    tar -cjf /path/to/chosen/directory/pacman-database.tar.bz2 /var/lib/pacman/local

Store the backup pacman database file on one or more offline media, such as a USB stick, external hard drive, or CD-R.

Restore the backup pacman database file by moving the pacman-database.tar.bz2 file into the / directory and executing the following command:

    tar -xjvf pacman-database.tar.bz2

If the pacman database files are corrupted, and there is no backup file available, there exists some hope of rebuilding the pacman database. Consult the Arch wikipage, How To Restore Pacman's Local Database.

## 通用最佳方案

### 订阅 NVD/CVE 警告并且仅针对安全警告升级

Subscribe to the Common Vulnerabilities and Exposure Security Alert updates, made available by National Vulnerability Database, and found on the NVD Download webpage. Only update the Arch system when a security alert is issued for a package installed on that particular system.

This is the alternative to upgrading the entire system frequently. It ensures that security problems in various packages are resolved promptly, while keeping all the rest of the packages frozen in a known, stable configuration. However, reviewing the frequent CVE Alerts to see if any apply to installed Arch packages can be tedious and time consuming.

### 在非关键系统上测试升级

如果可能的话，可以在非关键系统上来对更改的配置文件进行测试，或检查更新软件包后是否会出现异常。确认不会影响正常工作后再对关键系统进行相应操作。

### 在编辑配置文件前备份

Before editing any configuration file, always back up a known working version of that config file. In the event that changes in the config file cause problems, one can revert to the previous stable config file. Do this from a text editor by first saving the file to a backup copy before making any alterations; or execute the following command:

    cp Config-File Config-File.bak

Using .bak will ensure there is a readily distinguishable human-made backup conf file if pacman creates a .pacnew, .pacsave, or .pacorig file using the active config file.

### 定期备份 /etc, /home, /srv, 和 /var 目录

由于/etc, /home, /srv and /var 目录包括重要的系统文件和配置文件，所以有规律的每隔一段时间备份这些文件夹是一个明智的选择.下面提供一些简单的备份指导.

- /etc: 用root权限写一个计划任务备份/etc目录，命令如下:

    tar -cjf /path/to/chosen/directory/etc-backup.tar.bz2 /etc

把/etc目录的备份文件存储在一个或者多个离线的介质中,例如U盘，外接硬盘，或者CD-R. Occasionally verify the integrity of the backup process by comparing original files and directories with their backups.

Restore corrupted /etc files by extracting the etc-backup.tar.bz2 file in a temporary working directory, and copying over individual files and directories as needed. To restore the entire /etc directory with all its contents, move the etc-backup.tar.bz2 files into the / directory. As root, execute the following command:

    tar -xvjf etc-backup.tar.bz2

- /home: At regular intervals, backup the /home directory to an external hard drive, Network Attached Server, or online backup service. Occasionally verify the integrity of the backup process by comparing original files and directories with their backups.

- /srv: Server installations should have the /srv directory regularly backed up.

- /var: Additional directories in /var, such a /var/spool/mail or /var/lib, which also require backup and occasional verification.

If you want to backup much faster (using parallel compression, SMP), you should use pbzip2 (Parallel bzip2). The steps are slightly difference, but not by much.

First we will backup the files to a plain tarball with no compression:

    tar -cvf /path/to/chosen/directory/etc-backup.tar /etc

Then we will use pbzip2 to compress it in parallel (Make sure you install it with pacman -S pbzip2)

    pbzip2 /path/to/chosen/directory/etc-backup.tar.bz2

and that's it. Your files should be backing up using all of your cores.

Category:

- System administration (简体中文)