Linux 用 Arch linux 的进来看看,最近更新系统你们遇到过这个问题没有?[更新,解决方案]

ginchenorlee · 2013年12月01日 · 最后由 ginchenorlee 回复于 2013年12月03日 · 7790 次阅读

最近对 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 进去,按照官方的教材一步一步在更新一次

方案:

  1. 用 arch 启动盘登陆(没有启动盘的从新在官网下载个镜像刻录到 U 盘,从 U 盘启动) 挂载你原来装 linux 的分区到 mnt(sda1 换成你本地系统根目录所在分区)
# 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
  1. 现在可以 chroot 入本地系统了
# chroot /mnt
  1. 清理 /bin /sbin /usr/sbin 非官方源的包查询:
# 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
  1. 这个时候要做
# 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 一次,结束。

我的博客: http://www.ginchenorlee.com/?p=492

太久没更新,步子迈太大了

扯到蛋了

每天都必 yaourt -Syua 下……升级强迫症……

这是半年前的更新了吧。。。我在 5 个 Arch 上做了这个更新……有一个明显的少做一步……也变这样了……当时还没找到解决方案……直接果断重装了……

其实只要用安装镜像引导应该就可以 chroot 然后修改了……用别的系统做个启动 U 盘吧……

这个地方确实比较坑爹,我在生产环境中都遇见一回,还好我提前看到公告了,按步骤做就搞定了

/sbin/init 是链接到 /lib/systemd/systemd 的,不在/usr 下,先试试 init=/lib/systemd/systemd 如果不行,最好的办法是用安装盘启动,然后 pacman 装上 systemd-sysvcompat,这个不复杂的,不需要 chroot 挂载 root 到/mnt 联网,改下/etc/pacman.d/mirrorlist 然后pacstrap /mnt systemd-sysvcompat 和重新安装差不多,只不过不需要格式化 root,也不是装 base。pacstrap 什么都能装的,重新装一下 base 也可以。修复系统最方便就是这样了

用了 manjaro 后,一切就清静了 ;)

#3 楼 @yakczh 每天更新,牛逼

#5 楼 @Kabie 对,就是少做了一步,才变成这样,唉

#7 楼 @reus 看来就只有这样了,我现在试试

Arch 中文的帖子跑到 Ruby 中文来了吗?

哈哈哈哈哈哈哈哈~

每周更新两次,自写开机通知 shell 脚本

WEEK=$(date +%w)

if [ $WEEK = 1 ] || [ $WEEK = 4 ]; then
    notify-send -t 60000 "系统更新提示" "需要运行pacman更新系统了"
fi

#7 楼 @reus 做了,重新引导了一下,就好了 ^_^

需要 登录 后方可回复, 如果你还没有账号请 注册新账号