最近弄了台二手龙芯 All-in-one PC。介绍在这里:英文、中文。
型号 9S2A
自认为轻车熟路,之前龙芯上网本就安装过 OpenBSD。依样画葫芦做一遍,定能顺利安装好。
没想到还是折腾了一番。
- 从清华的mirror下载所有文件。
- 将U盘格式化为FAT32,把openbsd文件复制到U盘
- 通过U盘将文件复制到linux上
- 格式化U盘为ext2格式(参见下面),再把文件复制回U盘
找一台 Linux 机器,用 fdisk + mkfs.ext2 将U盘格式化为 ext 格式。
用 mkfs.ext2 格式化出来的U盘,只能识别为 disk,但没有 partition。
lynloong 启动时,无法识别此U盘
正好 lynloong 还带在 ubuntu,默认 root 密码是:loongson。Lucky,这台机器 root 密码没被改过。
将U盘插到 ubuntu 上,fdisk -l 看一下:(/dev/sdb 是U盘识别出来的 disk)
# fdisk -l /dev/sdb
...
Disk /dev/sdb doesn't contain a valid partition table
# mkfs.ext2 /dev/sdb1
参考
这里有个坑,参见 坑2。
1. loongson 的 bios 使用的 PMON,默认有个启动菜单,用 c 进入命令行 PMON> 模式
2. PMON> boot -k /dev/fs/ext2@usb0/bsd.rd,进入安装程序,按步骤安装
3. 安装完毕,reboot,启动时按 Del 进入 PMON>
3.1 PMON> set moresz 30
3.2 PMON> set bsd /bsd
3.3 PMON> set ShowBootMenu no
3.4 PMON> set al /dev/fs/ext2@wd0/boot/boot
4. 断电,重启。
参见 坑3
理想状态是按上面的步骤,可以进入安装界面的。但 boot -k 之后,蓝屏了 :-(
搞不定了。放弃 =_=!。
最开始我用 win32diskimager 将 miniboot.fs 写入U盘。然后U盘大小被改写了(变成8M了)。导致 base64.tgz 等文件没法复制进去。
需要低格(low level format)才能恢复。好在我的百度网盘里面保存了一个低格工具。=_=!
最早打算在 windows 下用 cygwin 做 fdisk + mkfs.ext2。但 fdisk 在 cygwin 下是用不了的。然后我做了:
# /usr/sbin/mkfs.ext2 /dev/sdb
导致一个没有 partition 的 disk。
下面步骤不要用:
安装cygwin
- 安装 cygwin,mirror:http://mirrors.163.com/cygwin/
- 记得选 e2fsprogs, util-linux 包,我们需要 mkfs.ext2 命令
- http://www.cygwin.com/cygwin-ug-net/using-specialnames.html
格式化U盘
$ cat /proc/partitions
major minor #blocks name win-mounts
...
8 33 9184 sdc1 F:\
$ df
文件系统 1K-块 已用 可用 已用% 挂载点
...
F: 9184 6476 2708 71% /cygdrive/f
$ /usr/sbin/mkfs.ext2 /dev/sdc1
将安装文件复制到U盘
- 从清华的mirror下载所有文件。
- windows 上,安装 ext2fsd,就可以访问 ext2 格式的U盘
- 然后把其它文件都复制到U盘
即使有了 /dev/sdc1,ext2fsd 写文件还是有问题的。
通过 PMON 启动,居然碰到不支持的硬件?WTF。。。
This kernel doesn't support model "LM9013-1.5.9".
找 kernel 代码
# cd /usr/src/sys/ # find . -name "*.c" | xargs grep "support model"
./arch/loongson/loongson/machdep.c: pmon_printf("This kernel doesn't support model \"%s\"." "\n", version);
只是这种型号的硬件,没有写上去。
const struct bonito_flavour bonito_flavours[] = {
#ifdef CPU_LOONGSON2
...
/* Lemote Lynloong all-in-one computer */
{ "LM9001", &lynloong_platform },
#endif
修改下 LM9001 这里就可以了。不过要重新 build kernel,有点麻烦。
There is always another way to make things done.
>>> f = open('bsd.rd', 'rb')
>>> data = f.read()
>>> f.close()
>>> i = data.find('LM9001')
>>> data[i:i+6]
LM9001
>>> data2 = data[:i] + 'LM9013' + data[i+6:]
>>> assert len(data) == len(data2)
>>> data2[i:i+6]
LM9013
>>> f = open('bsd.rd', 'wb')
>>> f.write(data2)
>>> f.close()
玩 *nix 系统,就是要折腾。:-)