转载

FreeBSD升级失败的处理

手里有几台机器跑着FreeBSD,有实体机也有VPS,因为都是前几年安装的,所以基本上都是跑着10.0或10.1,这两个版本现在都已经停止支持了,只是一直懒得去动,所以凑和用着。

结果没想到最近一次升级pkgng以后,pkg不能用了,搜了一下所有的解决方案都是说要升级系统,看来必须要升级了。但是一直出抽不出空来,只能用pkg-static扛着,不太方便。

好不容易等到春节放假有点时间,决定一次搞定。

先在家里的实体机试了一把——万一搞崩实体机也好弄。结果果然不顺利,第一步执行:

freebsd-update -r 10.3-RELEASE upgrade

就出错,说是找不到update.freebsd.org,但是nslookup、ping、curl试过这个域名都是通的,最后只能用IP地址连才总算成功:

freebsd-update -s 204.9.55.80 -r 10.3-RELEASE upgrade

之后就是 freebsd-update install ,重启,再 freebsd-update install 即可。

第二台是VPS,结果这个前两步倒是顺利,到了重启后再次运行 freebsd-update install 时,出现大量的错误:

segmentation fault (core dumped)

中断升级发现所有的命令都不可用——虽然SSH还正常连接着,但是新的连接已经不行。放狗一搜,说是因为旧的系统文件已经在升级过程中被删除,但是新版的文件没找到……

然后才想起来我用了ZFS,估计新文件在ZFS里,但是因为旧文件被删除,ZFS无法mount,所以无法找到新文件……

然而我在升级前并没有做备份……

再次重启系统——已经无法启动了。差点要重装系统的时候被我搜到 这篇 里的一个回复介绍了手工修复的方法:

In my case I restored system libraries with a FreeBSD 10.1-RELEASE memory stick using a similar procedure.

Boot from USB stick and exit to Live CD.

Mount the damaged FreeBSD installation on /mnt (/, /usr, /var)

Back up manually modified files from /mnt/etc to the USB stick.

Code:

# cd /usr/freebsd-dist; for file in base.txz lib32.txz kernel.txz src.txz ; do (cat $file | tar --unlink -xvpJf - -C /mnt); done

Reboot in current restored system.

Mount the USB stick and restore the backup to /etc.

这简直是大救星啊。当然也幸好用的是Vultr的VPS,可以外挂ISO启动,不然也是没得救。

当即下载了10.3的ISO文件并上传,然后用这个盘重启了系统,mount上root盘和ZFS盘,把/etc备份到ZFS里,最后从系统盘里恢复系统文件。

中间还出了个问题是mount root盘失败,最后是用fsck修复的。

fsck -y /dev/vtbd0p2

重启,果然成功进入系统,然后赶紧恢复/etc……

杯具的是恢复完etc又挂掉了,貌似因为rc之类目录下的东西也被删除了很多,/etc/group也变成空文件……

得,重来一遍再说。

因为/etc不能完全恢复备份,就只能手工恢复了。首先是rc.conf, pf.conf等,然后是用户系统的恢复(从 这个贴子 里找到方法):

If you still have the full /etc/master.passwd, you can recreate /etc/passwd using pwd_mkdb(8) (-p). If not, see if /var/backups/master.passwd fits your needs and use that. And before the entire forum says what it always says, and with good reason: make backups.

从备份里恢复 master.passwd 后执行:

pwd_mkdb -p /etc/master.passwd

至于/etc/group,只能手工恢复了,还好东西不多。

升级第三个的时候就有经验了,反正先做个备份总是没错的。

结果备份完重启准备升级的时候叕有新的状况:

网络无法连通……

DigitalOcean这是闹哪套?

后来是在 这里 看到一个可能的原因,一查果然是这个 /etc/rc.digitalocean.d/droplet.conf symbol link丢了。

但是手工补上重启还是不通,最后只能自己在rc.conf里把IP和路由配置写死进去才终于可以。

之后整个升级过程就很成功了。

原文  http://blog.csdn.net/raptor/article/details/54883352
正文到此结束
Loading...