过年的时候一直没开 Arch Linux, 回到学校才更新。更新的过程不太顺利,因为这次 pacman 是大升级,然后内核又有什么升级,所以造成各种冲突。结果我在更新时加入了“强制执行”命令,也就是执行了 pacman -Syuf 这样的命令,重启后就没法再启动了。提示信息:

Unable to find root device /dev/...

后来还是去 Arch Linux 论坛上找,才找到解决方案。大概的思路,是要用 Arch Linux 安装光盘启动,然后 chroot 到硬盘上的系统,再更新 udev, mkinitcpio 之类的东西,才能再次启动。

首先从 Arch Linux 的官方网站上,我选择的不是网络安装版,不知道网络安装版能不能用,没试过。由于是在学校机房下载的,我选择了教育网镜像。

我是打算用 U 盘启动的,学校机房的电脑又是 Windows, 所以就下载了一个 Cygwin, 使用 dd 把镜像刷到 U 盘里:

~ # dd if=archlinux.iso of=/dev/sdb

如果不能确定 U 盘是哪个设备,可以用如下命令查看有什么分区(似乎 fdisk -l 在 Cygwin 下没用):

~ # cat /proc/partitions

在那台电脑上启动 U 盘的 Arch Linux 系统,然后用 fdisk -l 查到你原来装有 Arch Linux 硬盘是哪个设备(本文假设是 /dev/sda1):

/mnt/arch # mkdir /mnt/arch
/mnt/arch # mount /dev/sda1 /mnt/arch
/mnt/arch # cd /mnt/arch
/mnt/arch #
mount -t proc proc proc/
/mnt/arch #
mount -t sysfs sys sys/
/mnt/arch #
mount -o bind /dev dev/

如果你的启动分区不是独立分区,那么下面这个步骤不用做。我的启动分区是 /dev/sda2, 要将其挂载到 boot/ 上:

/mnt/arch # mount /dev/sda2 boot/

然后开始 chroot 到当前目录(/mnt/arch):

/mnt/arch # chroot . /bin/bash
/ #
source /etc/profile

之后的步骤需要连接到网络。我是直接连在路由器上,就开 DHCP 客户端就可以了,其它的上网方式需要其它的设置。

/ # dhcpcd eth0

然后,最重要的步骤来了,重装 udev 然后重建镜像:

/ # pacman -Syy
/ # pacman -Syu
/ #
pacman -S udev
/ #
pacman -S mkinitcpio
/ #
mkinitcpio -p linux
/ # reboot

重启之后一般可以看到久违的的画面了。这个时候我是重装了所有的软件包,这样一些其它的错误也修复了:

/ # comm -23 <(pacman -Qeq) <(pacman -Qmq) | pacman -S -
/ #
comm -23 <(pacman -Qdq) <(pacman -Qmq) | pacman -S --asdeps -

原创文章,转载请注明来源: