在GoFlex Home设备上进行Arch Linux ARM更新遇到不少挫折,折腾了周末两天时间,主要遇到的困难有:

  • 更新包filesystem反复出现文件冲突,而glibcfilesystem是依赖关系,必须同时更新。如果--ignorefilesystem会导致不更新glibc。这会引起一大批软件无法更新。
  • Arch Linux ARM的镜像网站太少了,国内的镜像网站已经无法访问,导致下载非常缓慢
  • Arch Linux对包的管理似乎不如debian和red hat(仅从个人使用经验来看,不一定准确),下载错误的软件包可能会忽略或者安装后缺少文件(也可能和Arch Linux ARM版本有关)

总之,折腾。。。

最初采用标准更新命令

pacman -Syu

在下载完所有更新包进行软件包校验时提示filesystem存在文件冲突

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.

这个问题我在尝试了多次重装和google搜索以后,得到了如下经验

如果出现文件冲突,例如 /bin () 目录文件冲突,则使用如下命令检查哪些文件是系统更新不需要的文件,删除这些文件在进行升级:

find /bin -exec pacman -Qo -- {} +

可以先清理缓存 pacman -Scc (所有问题都回到yes)

然后使用 pacman -Syyuf 命令强制更新系统 (注意:这里先不要使用 --ignore filesystem 否则会导致 glibc 因为依赖关系不更新)

上述命令更新失败,就尝试忽略 filesystem 进行更新 pacman -Syyuf --ignore filesystem

此时由于没有更新 filesystem ,会出现任何命令都无法执行,例如 ls 命令会出现报错 -bash: /usr/bin/ls: No such file or directory ,但是可以通过加载 /usr/lib/ld-2.18.so 来执行命令

/usr/lib/ld-2.18.so /usr/bin/ls

所以可以通过建立软链接来恢复环境

/usr/lib/ld-2.18.so /usr/bin/ln -s /usr/lib /lib

不过,此时还会发现 ssh 无法登录,需要重新安装一次 glibcfilesystem

pacman -S --force glibc filesystem

重新安装了 glibc 和 filesystem 之后,也能够ssh登录了。

另外,还发现,虽然 pacman -Syu 显示所有的软件包都已经更新到最新版本,但实际上安装的软件包是存在文件确实的。例如 wget 命令无法执行, mkfs.xfs 命令也类似,都是缺乏库文件支持。可以通过 pacman -Qo 文件名 来找到包含文件的软件包名字

pacman -Qo /usr/lib/libuuid.so.1

最终,重新安装一遍所有软件包(参考 ArchLinux的pacman命令详解

pacman -Scc
pacman -S $(pacman -Qq | grep -v "$(pacman -Qmq)")

最后,为保险起见,又重新下载和运行 U-Boot installer

wget http://archlinuxarm.org/os/armv5te/boot/goflexhome/goflexhome.sh
chmod +x goflexhome.sh

./goflexhome.sh

完整的更新Arch Linux ARM过程

清理缓存

pacman -Scc

更新系统

pacman -Syyuf

此时会出现更新失败(filesystem文件冲突)

忽略 filesystem 包进行一次更新

pacman -Syyuf --ignore filesystem

更新完成后千万不可重启,不可退出当前ssh会话

此时任何命令都因为库文件加载路径问题无法执行,例如 ls 命令会出现报错 -bash: /usr/bin/ls: No such file or directory

修复 /lib 软链接,恢复命令执行功能

/usr/lib/ld-2.18.so /usr/bin/ln -s /usr/lib /lib

此时已经登录ssh的会话中,命令执行恢复正常,但是远程ssh无法登录,所以 此时千万不可重启,不可退出当前ssh会话

重新安装一次 glibcfilesystem

pacman -S --force glibc filesystem

重新安装了 glibcfilesystem 之后,ssh恢复登录

注意:此时还不能重启,因为系统安装包其实还有很多文件缺失

全面重新安装一次系统所有软件包

pacman -Scc
pacman -S $(pacman -Qq | grep -v "$(pacman -Qmq)")

保险起见,又重新下载和运行 U-Boot installer

wget http://archlinuxarm.org/os/armv5te/boot/goflexhome/goflexhome.sh
chmod +x goflexhome.sh

./goflexhome.sh

最终的解决方法

最终发现,原来最新版本的Arch Linux ARM版本已经不能使用以前的 U-Boot 了,这也是我反复失败的原因之一。即,当前版本的Arch Linux ARM需要匹配当前版本的U-Boot。我这两天尝试过程中,已经有升级过Arch Linux ARM,但是没有更新U-Boot导致无法启动。

  • 最终的解决方法

首先更新 U-Boot (此时操作系统还是两年前的旧版本 Arch Linux ARM)

wget http://archlinuxarm.org/os/armv5te/boot/goflexhome/goflexhome.sh
chmod +x goflexhome.sh
./goflexhome.sh

由于我有两台GoFlex Home设备,更新其中一台 U-Boot 之后,把这台磁盘取下来,通过USB接口挂载到另外一台尚未更新的GoFlex Home设备上,然后下载最新的Arch Linux ARM软件包解包更新

mount /dev/sdb1 /mnt
wget http://archlinuxarm.org/os/pogoplug/bsdtar
chmod +x bsdtar
wget http://archlinuxarm.org/os/ArchLinuxARM-kirkwood-latest.tar.gz
./bsdtar -xpf ArchLinuxARM-kirkwood-latest.tar.gz -C /mnt
umount /mnt

最后,把这个通过tgz包更新的磁盘再安装回已经更新过U-Boot的GoFlex Home设备启动就可以了。启动后,设备默认是使用DHCP取得IP地址,可以通过家用路由器的web管理界面找到分配的IP地址,再 ssh 的登录设备,设置静态IP地址