本文旨在提供一个简单而无痛的取得安装Debian的介绍。
它基于Neal H. Walfield的The Hurd Installation Guide更改。感谢Neal的贡献。
注意,由于耗费时间过多并且可能出问题,本文中的有些方法多有不便。你可能更喜欢从制作好的CD镜像中安装,尤其当你是一个初学者时。即使它们是老旧的版本,它们通常更稳定。之后你可以选择在线更新。
1. 概览
Debian GNU/Hurd发布版本,与其他操作系统的发布不同,目前尚没有一个完善的安装程序。总有一天它会有的,并且你就有可能是它的设计和实现者;可是,直到今天,安装Debian GNU/Hurd还需要使用其他操作系统,并且是一个类似于Unix(Unix-like)的系统。用户已经报道了使用各种GNU/Linux版本的系统和BSD系统一样可以成功安装它。自动引导操作系统的最低要求是:创建ext2文件系统、将该系统从tar压缩包里解压到磁盘上、并且安装GNU Grub。
GNU和所有类Unix系统(Unix-like system)类似:登陆后,用户操作的是一个shell和熟悉的Unix VFS。尽管GNU竭力去遵守POSIX标准,但是它不是Unix。GNU/Hurd是在Unix哲学的基础上构建的,并且通过增加新的功能和改进原来设计的缺陷两个渠道来扩展它。最大的区别来自转译器(translator)、以及和VFS相互影响的用户磁盘管理程序(user space programs)。这些文件系统不在内核之中并且也不需要在启动时被加载;它们只需要访问文件备份和挂载点。另一个区别就是那些进程,和早期为单用户设计时不同,定义了进程互不干涉的令牌(这里不知道翻译得对不对),也就是说,它们可以被加上适当的许可来授权或结束。
对Unix环境熟悉(尤其是GNU的系统,流行的变体例如GNU/Linux),是让你觉得它容易上手的极其重要的因素。有使用Debian工具的经验被证明是会使配置和维护一个GNU/Hurd的工具受益无数。
这个教程努力让安装GNU/Hurd的过程尽可能的无痛。如果下面有错误,它们最有可能是作者的失误。请向作者报告它们,并且附带一些意见和建议,这些都将被愉快地接受。
2. 原封不动还是重新开始
如果你没有一个可用的分区或者另一块硬盘,这将会是步骤最长的。如果是这样,你需要对硬盘重新分区。一个解决方法是使用GNU的分区工具,Parted。它不仅有基本的分区功能更能重新制定分区大小和移动分区。它的说明手册非常完备并且附带很多教程。
Hurd支持很多ext2fs文件系统的扩展。首先是被动转译器(passive translator)和为未知用户(未定义的用户—不是另一个用户)开设的第四种用户设定。要使用这些扩展功能,这些分区的用户必须被设定在hurd.mke2fs中,除非特别地在命令行下越过这些设置,否则无论核心在什么状态下用户类型都不能随意更改(这句翻译也没有把握,可能我理解错了)。由于Hurd会始终遵照这些设定,用户必须小心合理地设定它们否则Hurd会敏感地出错。注意,即使一个文件系统是被一个特定的内核所有的,其他内核也可能在使用它;只是它们没有使用这样的扩展。
创建文件系统,使用mke2fs并执行它:
?b 4096 ?o hurd
为新的文件系统指派用户,举例来说,假定分区是/dev/hda2:
# mke2fs ?b 4096 ?o hurd /dev/hda2
3. 启动引导程序
GNU系统的启动引导程序是Grub,全称the Grand Unified Boot loader,它本来就是设计被用来启动GNU系统核心(Mach 和 the Hurd)的。尽管理论上说任何支持多重启动标准的启动引导程序都可以用来加载Mach和Hurd,但是目前为止(就我们所知),GNU Grub是唯一支持这样的标准的启动引导程序。
概括地讲Grub。不像传统的x86上的启动引导程序,例如LILO,Grub功能非常强大。它有一个命令行形式的操作界面,bootp,有虚拟终端支持和许多其他功能。补充一句,它几乎可以启动所有内核。如果你曾经启动过alpha或者sparc,你就会明白Grub可以做什么。因此,不要恐慌:Grub更好。你会喜欢它。你不会再回头。
如果你在安装Hurd之前安装Grub可能会更好,可以肯定的是你之后也总能在你的硬盘上装上它。
4. 交叉安装
下一个步骤就是取得一个基本的系统。你有很多选择,如果你就有一个Debian系统你可以使用安装包crosshurd。或者你可以从这个列表取得一个升级过的基本系统的tarball:http://wiki.debian.org/DebianPorts/Mirrors。
这个tarball被设定成解压所有的文件到当前目录。在文件系统被挂载后,存档可以被解压。假定文件系统在/dev/hda2,挂载点是/gnu并且文件在当前目录下,只要执行以下命令:
# mount ?t ext2 /dev/hda2 /gnu
# cd /gnu
# tar ??same?owner ?xvjpf ~/gnu.tar.bz2
5. 启动GNU/Hurd
现在一切准备妥当要首次启动GNU/Hurd了。确定Grub在启动盘上后,重新启动,如果一切顺利,会显示一个Grub菜单或一个命令行。如果显示的是菜单,按c来进入命令行。
首先,GNU Mach需要被载入。这需要了解文件系统和到GNU Mach的路径。Grub使用的分区表是与Linux和Hurd都不同的:IDE和SCSI驱动器都被命名为(hdN,M)。N是驱动器被BIOS枚举的编号(从0开始)。那就是,Grub在操作IDE和SCSI上没有区别。M定义该驱动器上的分区编号。它也是一个从0开始的索引。如果这些听起来让人困惑,放松:Grub还是有用的。
在确定哪个分区上有某一特定的文件上,Grub提供了find工具。当键入这个命令和一个文件名,Grub会从每个文件系统搜索指定的文件并且告诉用户在哪里找到了这些文件。例如,查找内核,/boot/gnumach.gz:
grub> find /boot/gnumach.gz
(hd0, 0)
这里,Grub检测到/boot/gnumach.gz在(hd0, 0)上。
在载入内核之前,至少有一个选项,根分区(root partition),必须在命令行下被定义。它将会被Hurd使用(也就是说,不是Grub使用)。因此,它必须被列出以让Hurd明白。
GNU Mach从0开始枚举磁盘。IDE驱动命名的前缀是hd,而SCSI前缀是sd。就像Linux,驱动器按照它们在控制器上的位置排序。举例来说,主驱动器是hd0,而第二个辅驱动器是hd3。使用BSD程序片的分区通过命名追加一个sM来指定一个给出的分区(这句翻译不确定)。注意M是从1开始的索引,而不是0。程序片编号很容易计算:只要在使用Grub的时候累加1。
因为Hurd还没有被配置过,它必须由单一用户模式启动。只要加上一个
?s
到内核命令行里。
假定第一个驱动器(也就是说,(hd0))是次要控制器上的主驱动器,我们就有:
grub> kernel (hd0, 0) /boot/gnumach.gz root = device:hd2sl ?s
[Multiboot?elf, …]
下一步,根文件系统的服务和exec服务必须被加载。这些是由Grub的启动模块的功能来做的。GNU Mach充满了${var}。这个参数被Hurd用来指定将提供什么样的信息。因为ext2fs命令行很长,在通常的Unix传统中它会因为丢失新一行的字母而坏掉。确认在每行结尾的斜杠后没有空格,并且注意区分{ and }和( and )。
grub> module (hd0,0)/hurd/ext2fs.static --multiboot-command-line=${kernel-command-line} --host-priv-port=${host-port} --device-master-port=${device-port} --exec-server-task=${exec-task} -T typed ${root} $(task-create) $(task-resume)
[Multiboot-module 0x1c4000, 0x2cfe6a bytes]
grub> module (hd0,0)/lib/ld.so.1 /hurd/exec $(exec-task=task-create)
[Multiboot-module 0x494000, 0x27afe bytes]
一旦Hurd运行了,进程就能自动加入适当的命令到Grub的/boot/grub/menu.lst配置文件里。
GNU/Hurd现在可以启动了:
grub> boot
如果GNU/Hurd启动失败,这可能是因为共享了IRQ:GNU Mach在这里表现得不好。你可以依据你自己的情况来查看,例如,GNU/Linux下的/proc/interrupts文件。而且,因为GNU Mach不支持可加载的内核模块,这些驱动器中的很多都是直接编译进默认内核的。如果你使用旧的外设,这可能是一个问题:一个设备试图检测另一个完全不相关的设备时可能会造成错误的响应并因此造成死机。编译一个只包含所需的设备驱动的内核通常可以解决此问题。GNU Mach交叉编译起来很简单。如果你使用的是Debian系统,安装mig包,你系统中的gcc可以做到。
如果这样没用,去适当的邮件列表问。
6. 本地安装
一旦你面对着一个shell提示,并且在Hurd在单用户模式的任何时候,你很有必要设定终端种类:
# export TERM = mach
注意CONTROL-C和这一类的在单用户模式没有用。
我们现在可以运行native-install脚本。这将会配置包并且设定几个重要的转译器:
# ./native-install
在脚本终止前,它会指出它将运行一小段时间。跟着它的提示并且用reboot指令重启系统。然后,再次进入单用户模式运行./native-install。
7. 配置
7.1 网络
要配置网络,必须先配置pfinet转译器。我们通过settrans指令来连接一个转译器到一个给出的文件系统节点。当程序访问这个节点的时候,比如说发送一个RPC请求,操作系统就随之启动相关服务来处理这个请求。
# settrans ?fgap /servers/socket/2 /hurd/pfinet ?I eth0 ?a a.b.c.d ?g e.f.g.h ?m i.j.k.l
这里,settrans通过了几个选项,前两个,fg,强制任何存在的转译器离开。接着的两个,ap,建立主动和被动转译器(不确定的翻译)。将转译器置为主动,我们可以从stderr流中看到所有的错误信息。后者记录了转译器名称和该节点中的冲突以便它可以被显性地重新启动(也就是说使它在重启中保留设定的参数)。这个选项跟随在节点后面来指出联接哪个要运行的转译器,之后是程序,并且向它传递参数。-i选项使界面pfinet开始监听,-a是IP地址,-g是gateway地址并且,-m是子网掩码。
确认添加服务名到你的/etc/resolv.conf文件里:
nameserver 192.168.1.1
要测试当前配置,ping ?c2 gateway。限制ping指令的次数很重要;要撤销该指令,CONTROL-C在单用户模式下不起作用。
DHCP目前还不能在Hurd下工作。这是由于pfinet的局限导致的:它是基于Linux的TCP/IP的代码的并且不能监听0.0.0.0。
settrans的帮助可以由下面指令开启
--help
某一特定转译器的帮助可以在命令行下用相同参数得到,例如:
# /hurd/pfinet ?help
考虑到输出可能有很多行,可以考虑分页显示。
7.2 其他文件系统
然后,编辑/etc/fstab来添加除了swap空间之外的任何可添加的文件系统(filesystems)。很重要的一点是swap(交换空间)空间被使用,Hurd系统会稳定得多。注意Hurd可以敏感地和Linux共享一个swap空间但是会非常容易指向包括未被格式化的分区的任何设备,比如你的home分区(不确定的翻译)。默认的,nano是唯一被基本发行版安装的编辑器。
下面是一个/etc/fstab文件的例子:
#
/dev/hd2s1 / ext2 rw 0 1/dev/hd2s2 /home ext2 rw 0 2/dev/hd2s3 none swap sw 0 0记住用MAKEDEV命令创建所有设备:
# cd /dev
# ./MAKEDEV hd2s1 hd2s2 hd2s3
要挂载一个nfs文件系统,将使用/hurd/nfs转译器。当在非root目录下运行时,转译器将会用1023以上的端口连接到服务器上。默认地,GNU/Linux会拒绝这个请求。要告诉GNU/Linux接受来自未被保留的端口的连接,加上
insecure
选项到输出表。这里有个例子,/etc/exports文件假定客户端IP地址是192.168.1.2:
/home 192.168.1.2 (rw, insecure)
将这个挂载到GNU的平台上并且假定nfs服务器的IP地址时192.168.1.1:
# settrans ?cgap /mount/point /hurd/nfs 192.168.1.1:/home
7.3 重启
最后,重启进入多用户模式,即,在载入内核的时候用像进入单用户模式一样的方法,只不过不要
-s
选项。要了解更多,看第五章,启动GNU/Hurd。
玩得高兴!
8. 结语
8.1 Grub菜单
总是手动载入内核会很无聊。编辑/boot/grub/menu.lst并适当地裁减它;启动会变得更快更简单。
8.2 添加设备
默认状态下,只有很少一部分设备创建在/dev目录下。使用MAKEDEV脚本来创建任何需要的设备节点。
8.3 安装更多软件包
有很多方法来添加软件包。你可以下载并且用dpkg ?i但是这很不方便。最简单的方法是使用apt-get。编辑/etc/apt/sources.list增加下面的一个入口http://wiki.debian.org/DebianPorts/Mirrors:
deb http://ftp.debian-ports.org/debian unreleased main
http://ftp.debian-ports.org/以及其镜像站点有大量解包或包装过的安装包没有被包含进Debian。
还有unstable版本在Debian镜像中的之一(详细请看http:///www/debian.org/mirror/list)有这样的结构:
deb http://ftp.de.debian.org/debian unstable main
如果你的网卡不支持GNU Mach或者你在用调制解调器上网,你将只能先下载再安装它们。最简单的做这些的方法是使用离线apt指令。完整描述请查看/usr/share/doc/apt-doc/offline.text.gz。
8.4 Hurd控制台
除了你在安装中遇到的Mach控制台,GNU/Hurd也有一个强大的用户态控制台提供虚拟终端。目前,你必须用下列命令手动启动Hurd控制台:
# console ?d vga ?d pc_mouse --repeat=mouse ?d pc_kdb --repeat=kdb ?d generic_speaker ?c /dev/vcs
在Hurd终端里,你可以通过ALT+F1,ALT+F2等等来切换虚拟终端。ALT+CTRL+BACKSPACE退出Hurd控制台退回Mach控制台,这样你可以重新上面的命令。
8.5 X.Org
X.Org已经被移植过来并支持所有的视频卡,它不需要内核模块的支持就能工作。
你需要在Hurd控制台重复执行上面8.4指出的步骤。因为X.Org中使用/deb/kdb硬编码作为键盘设备,你要自己做一个字符映射(翻译可能不正确):
# cd /dev
# ln -s cons/kbd kbd# ln -s cons/mouse mouse你可能需要几个X系统的包。X-window-system-core,rxvt和twm,fvwm或者wmaker是一个好的入门。
Debconf可以用来配置X.Org,但是Hurd并不能觉察到并且配置文件需要被修改。在配置过后,将指针部分改成:
Section “Pointer”
Protocol “osmouse”
Device “dev/mouse”
EndSection
Emulate3Buttons
和
ZAxisMapping
必须被关闭。
最后,运行startx。
还有几点要说明的,update-menu还没有被移植过来。因此,没有好的Debian的菜单。尽管一个pthreads已经完成但是不是所有的pthread包都被移植好:不要指望Gnome和KDE可以用。