Too young, too simple. Sometimes, naive & stupid

 解决某厂交换机无法“can’t load kernel”的问题

故障现象描述

  1. 尝试升级交换机版本(这里应该因为某种原因导致升级失败)。

  2. 尝试进入所谓的recover模式 ,也就是FreeBSDloader,并尝试使用install --format将已有的文件系统重写(也叫格式化安装)。

  3. 这时候会得到如下错误:

    1
    2
    panic: free: guard1 fail @ 0x45c40 from /.amd/svl-engdata1vs1/occamdev/build/freebsd/head/20160518.183540_fbsd-builder_head.327854/src/lib/libstand/dosfs.c:248
    --> Press a key on the console to reboot <--

交易过程

此处省略砍价过程…

我:你文档是盲流子文档,有没有官方文档。

K:这就是官方文档。

我:肯定不是,我自己找吧。


十分钟后,我确实遇到同样的错误,再次扯皮。

我:你这包不对吧?

K:肯定对。

我:你有没有别的,img格式的。

K:下载中。


这时基本是确定了包不对,文档也不是解决这个问题的文档,使用Google大法。基本定位是loader模式的状态下,并没有从USB设备引导,由于对BSD不熟悉,但是应该原因类似GRUB引导设备不对差不了多少😂。


我:拿到IMG包。

名词描述

load模式

这个就是FreeBSD内核引导的最后阶段,会检测控制台和磁盘,识别从哪块盘引导。

currdev

选择默认设备。

include

处理脚本文件。依次读取每个文件进入内存,然后将其中的每一行传递。

dd

convert and copy a file。

开搞

  • 首先将img.gz包解压,并将其写入到usb设备(win直接解压就好):

    1
    gzip -d xxx.img.gz
  • 确定USB是哪个,此处仅写Mac上的方法:

    1
    2
    diskutil list # 找到你的usb,我这是disk2
    diskutil umountDisk /dev/disk2 # 卸载
  • 将img镜像写入usb设备(其他刻录软件也可):

    1
    dd if=/path/to/file.img of=/dev/disk2 bs=1m
  • 拔掉USB。

  • 接到某厂坏了的交换机。

  • 插上什么console线。

  • 通过COMx连上。

  • 执行reboot(主要为了重新识别USB设备)。

  • 进入loader模式后。

    1
    2
    set currdev="disk1s1a"   # 设置引导设备为disk1s1a
    include /boot/loader.rc # 执行/boot/loader.rc脚本文件

结束

等待重写完成,就可以通过默认用户名:root,密码:空,进入系统。