最近对 archlinux 更新,最先出现的问题是:
error: failed to commit transaction (conflicting files)
filesystem: /bin exists in filesystem
filesystem: /sbin exists in filesystem
filesystem: /usr/sbin exists in filesystem
Errors occurred, no packages were upgraded.
上网一查,才,知道,最新版本的 arch 改动很大,需要一部分手动配合跟更新,将所有非官方包中 /bin, /sbin 或者 /usr/sbin 目录下的文件移动到 /usr/bin 下。 https://www.archlinux.org/news/binaries-move-to-usrbin-requiring-update-intervention/ 于是呼就照做了,万幸,更新 OK,万幸中的不幸,当重新启动时:
Error: Root device mounted successfully, but /sbin/init does not exist.
Bailing out, you are on your own. Good Luck
[rootfs /]#
但是查看时他是软连接到 busybox 的:
[rootfs /]# ls -la /sbin/init
=> /sbin/init -> busybox
google 了很多,结果:
To make the change permanent, modify the /etc/default/grub file, 首先我是在 rootfs 下,不能进行任何操作,又不能安装 systemd-sysvcompat, 因为 the systemd-sysvcompat package installed, which provides /usr/bin/init (which is symlinked by /sbin/init). In the meantime, set your init= kernel parameter to /usr/lib/systemd/systemd.
只能选择零时的:edit the grub entry in the grub menu, 我选择的方式在启动 Grub 的时候 press "e“进去 grub 的编辑状态,在 linux 那一行 追加”init=/usr/lib/systemd/systemd“
但万万都很不幸,问题没有解决。初步猜想是在更新的时候可能没有跟新或者安装 the systemd-sysvcompat package
也有人说,从新从一个安装系统中 chroot 引导进去,然后安装需要的东西。但是这个稍微太复杂了点,还没有安装盘........ 难不成真的要重新装?
最近有遇到同样问题的朋友没?求分享 ^_^
【更新,解决方案】:
问题反思: 之所以会出现这样的问题,是因为 安照官网的步骤去升级,中间有一步好像说”|”这个符号有问题,我 pass 了,最后升级 filesystem 的时候就提示 error,升级不了。然后点重启,不能,按复位键,就进不去了。 这个步骤就是:
# $ paclist <repo> | awk ' { print $1 } ' | pacman -Ql - | grep ' /s\?bin/\| /usr/sbin/'
只所以会出现提示“|”这个符号有问题,是我们习惯性的,粘贴 copy 过去,而忽略了 应该把「」换成你的第三方源的名字……
解决思路:用启动盘 chroot 进入本地系统重新更新一次。也就是从新找个镜像 挂载当前系统,chroot 进去,按照官方的教材一步一步在更新一次
方案:
# mount /dev/sda1 /mnt
创建 bash 的软连接 (也可以不做下面的软连接,直接在后面跟上 bash 的途径,我的是:chroot /mnt /usr/bin/bash)
# ln -s /mnt/usr/bin/bash /mnt/bin/bash
(因为我的系统默认使用 zsh,所以再创建 zsh 的软连接,没有的忽略此步)
# ln -s /mnt/usr/bin/zsh /mnt/bin/zsh
# chroot /mnt
# pacman -Qqo /bin /sbin /usr/sbin | pacman -Qm
以上这一步骤很重要,如果/bin /sbin /usr/sbin 这些目录里面还有软件,系统是不能更新的,把这些包记下来,统统卸载掉,更新完整后你再装上。
# paclist <repo> | awk ' { print $1 } ' | pacman -Ql - | grep ' /s\?bin/\| /usr/sbin/'
这个也是,查询好记下来然后卸载掉。换成非官方源,没有的忽略此步。(不要忘记替换)
确保/etc/pacman.conf 的 IgnorePkg 或 IgnoreGroup 里的包没有文件在/bin, /sbin, or /usr/sbin,有的话记下来然后处理好。
确保/bin /sbin /usr/sbin里没有任何遗漏的文件(除了了自己建立的/bin/bash,/bin/zsh之外):
# find /bin /sbin /usr/sbin -exec pacman -Qo -- {} + >/dev/null
4,由于是 chroot 进入系统,所以更新时会提示 mtab 文件错误。 执行如下命令:
# mv /etc/mtab /etc/mmmtab
# cp /etc/fstab /etc/mtab
更新完毕后再
# mv mmmtab mtab
即可。
5,更新时会提示签名错误。 编辑/etc/pacman.conf,在每个源下都加入 SigLevel = Never。过后可以删除。(这个一定要做,不然要提示签名错误)
6 最后 更新系统
# pacman -Su --ignore filesystem,bash
# pacman -S bash
# pacman -Su
7,删除 bin 目录,然后建立软链接
# rm -rf /bin
# ln -s /usr/bin /bin
# pacman -S systemd-sysvcompat
# mkinitcpio -p linux
不然会报错:Error:devise UUID not fond, Skipping fsck.
9,可以选做(退出 chroot 后运行),
# pacstrap /mnt base base-devel
9,reboot~ 之后重新 yaourt -Syu 一次,结束。