Hurd系统源代码搭建手册(从Linux到Hurd)
——Hurd from source(Linux to Hurd)
作者:孙海勇
更新日志2008年2月16日 本文正式版本发布2007年12月2日 本文预览版发布1 前言 本文涉及的Hurd是GNU自行开发的基于Mach微内核的内核,提供完整的源代码,Hurd可以同GNU提供的大量工具组合成一个可以使用的操作系统。
我本人也对Hurd颇感兴趣,于是想利用Hurd及相关软件包的源代码打造一个Hurd为核心的系统。
本文利用gnu提供的hurd及其工具的源代码在Linux的环境下建立了一个Hurd系统,目的是为满足希望能近距离接触的用户提供一种建立和了解的途径,希望为今后的Hurd应用提供一些有用的知识。
本文许多软件包的选取及编译参数参考了LFS和CLFS-sysroot手册,但根据Hurd系统的要求和特点进行了修改。
更新: 由于篇幅比较长所以难免出现一些错误或者笔误,而且版本会进行更新,因此可能加入新内容,难免会进行修正或增删一些内容,如果本文被转载可以在本人的Blog中查看最新版本。 我的Blog:http://youbest.cublog.cn 如须转载请注明作者为孙海勇,并提供转载出处。2 创建环境 本文所述系统的建立过程需要一个可以正常使用且不算太“陈旧”的Linux系统来作为宿主系统,但完成的系统并不会依赖该宿主系统,当然制作Hurd系统并不是非要Linux系统,其它的系统包括Hurd系统本身都是可以完成的。
2.1 创建用户 在开始制作Hurd系统前,先建立一个普通用户,以保证制作过程中不会因为意外而破坏现存的系统。
groupadd hfs
useradd -s /bin/bash -g hfs -m -k /dev/null hfs
passwd hfs
2.2 创建一个分区用于建立Hurd系统 请先划分出一个未用的磁盘空间来用于Hurd系统的编译和制作过程,比如已经建立好了一个/dev/hda1的未用分区,我们先格式化成Hurd能够识别的文件系统。
(注意:因为ext2文件系统的原因,分区大小应该限制在2G以内,否则可能导致引导失败。)
mkfs.ext2 -b 4096 -o hurd /dev/hda1
建立一个目录用于挂载刚刚建立的分区。
mkdir /hfs
mount /dev/hda1 /hfs
建立build用于编译使用,建立download目录用于存放从网络上下载的各个软件的源代码包。
export TARGET_DIR="/hfs"
mkdir –pv ${TARGET_DIR}/{build,download}
chown –Rv hfs ${TARGET_DIR}
3 软件源代码下载 3.1 软件包列表 gnumach
hurd
mig
binutils
glibc
gcc
bash
sed
grep
coreutils
make
diffutils
gawk
gzip
tar
patch
bzip2
findutils
ncurses
ftp://invisible-island.net/ncurses/ncurses-5.6.tar.gz gettext
texinfo
Berkeley db
iana-etc
e2fsprogs
m4
bison
libtool
zlib
perl
readline
autoconf
automake
file
flex
groff
inetutils
less
man-db
mktemp
psmisc
shadow
vim
grub
wget
3.2 补丁包下载 3.3 软件及补丁打包下载 为了配合本文的实践,我准备了相关的LiveCD下载,LiveCD中包含本文所提到的各个软件包及补丁,并可以直接做为制作过程的主系统,详细下载地址见:
http://youbest.cublog.cn中《LiveCD 下载地址》一文
http://blog.chinaunix.net/u/13265/showart.php?id=479342 3.4 关于软件包版本 本文所使用的软件包是在开始写本文是最新软件包的正式发布版本(hurd内核及相关的几个包除外),写作到发布本文时时间较长,文中个别软件包的版本可能已经更新,在建立系统时候可以按照本文的版本来制作,也可以尝试使用最新的版本,本文也会在后面的更新中逐渐更新软件包的版本。
关于glibc的版本,我试了几个版本的glibc,似乎2.4及以上的版本编译hurd版本似乎问题较多,所以这里使用2.3.6的版本,编译过程比较顺利,如果你有兴趣也可以尝试2.4以上版本,在写本文的实验过程曾经编译通过glibc-2.5,不过本文目前还是推荐使用2.3.x的版本。
3.5 软件包及其补丁的使用 为了能方便这些软件包的使用,同时方便文章关于使用这些软件包或补丁的命令使用,建议将所有软件包及补丁存放到${TARGET_DIR}/download目录下
如果你使用的是配合本文的LiveCD,那么你可以使用下面的命令
cp -a /sources/* ${TARGET_DIR}/download
4 系统介绍 4.1 系统制作过程 系统由一个带有常规编译工具的Linux作为宿主平台,在其上建立一个微型的可以启动且能够“自我发展”的Hurd系统(“自我发展”的系统即不依赖其它系统的帮助就可以完成软件的编译来不断扩充系统自身的功能)
通过该微型系统来启动计算机,并在该系统下完成一组常用的软件包,来搭建一个相对简洁的Hurd系统环境。
4.2 常用参数介绍 --prefix 通常用于指定软件包安装的根目录的位置,对于hurd系统,通常使用--prefix=或者--prefix=/来定义该参数。
4.3 Hurd系统主要构成 本文建立的Hurd系统,由Mach+Hurd+glibc+一组常规软件包搭建
/boot 用于存放启动内核
/bin 常用命令存放目录
/sbin 管理员相关命令存放目录
/include 编译软件包时默认的头文件存放目录
/hurd hurd专用命令存放目录,用来存放hurd系统的内核服务层的命令
/dev 设备文件存放目录
/home 用户目录
/etc 各类配置文件存放目录
/lib 动态或静态库存放目录
/libexec 存放一些启动相关的脚本或者命令
/servers 存放内核服务层处理相关的文件
5 构建基础系统 现在我们开始构建一个可以“自我发展”且可以启动的微型系统。
5.1 设置用户环境 进入hfs用户,开始整个Hurd系统制作之旅。
su – hfs
建立用户启动脚本,以方便设置创建环境变量
cat > ~/.bash_profile << "EOF"
exec env –i HOME=${HOME} TERM="${TERM}" PS1='\u:\w\$ ' /bin/bash
EOF
cat > ~/.bashrc << "EOF"
set +h
umask 022
export TARGET_DIR="/hfs"
export LC_ALL=POSIX
export BUILD_DIR="${TARGET_DIR}/build"
export DOWNLOAD_DIR="${TARGET_DIR}/download"
export BUILD_TARGET=i686-pc-gnu
export BUILD_HOST=${MACHTYPE}
export PATH=${TARGET_DIR}/tools/bin:/bin:/usr/bin
unset CFLAGS
unset CXXFLAGS
EOF
source ~/.bash_profile
5.2 创建目录 pushd ${TARGET_DIR}
mkdir -pv {bin,boot,dev,{etc/,}opt,home,lib,libexec,mnt}
mkdir -pv {hurd,include,sbin,servers/socket,share}
mkdir -pv share/{info,doc}
mkdir -pv share/man/man{1..8}
ln -sv share/{man,doc,info} $dir
install -dv -m 0750 root
install -dv -m 1777 {var/{run,log,lib},tmp}
cd boot
ln -svf . boot
touch ${TARGET_DIR}/servers/exec
popd
5.3 gnumach-headers 安装gnumach的头文件
mkdir -v ../gnumach-build
cd ../gnumach-build
../gnumach.patch/configure --build=${BUILD_TARGET} --prefix=
make install-data prefix=${TARGET_DIR}
5.4 hurd-headers 安装hurd的头文件
mkdir -v ../hurd-build
cd ../hurd-build
MIG=true ../hurd/configure --build=${BUILD_HOST} --host=${BUILD_TARGET} \
--prefix= --disable-profile
make version.h
make install-headers no_deps=t prefix=${TARGET_DIR}
5.5 mig 这是一个hurd上使用的头文件生成工具
aclocal
automake -a
autoconf
mkdir -v ../mig-build
cd ../mig-build
CC="gcc -I/${TARGET_DIR}/include" ../mig/configure --prefix=${TARGET_DIR}/tools
make
make install
5.6 binutils (临时工具) 汇编相关命令组合包。
mkdir –v ../binutils-build
cd ../binutils-build
CC="gcc" AR="ar" ../binutils-2.18/configure --prefix=${TARGET_DIR}/tools --build=${BUILD_HOST} --target=${BUILD_TARGET} \
--with-sysroot=${TARGET_DIR} --disable-nls --enable-shared --disable-multilib
make configure-host
make
make install
5.7 glibc-headers 安装glibc的头文件
patch -Np1 -i glibc-2.3.6-udeps-1.patch
mkdir -v ../glibc-build
cd ../glibc-build
CC="gcc -I${TARGET_DIR}/include" ../glibc-2.3.6/configure --prefix= --host=${BUILD_TARGET} --build=${BUILD_HOST} \
--with-headers=${TARGET_DIR}/include --without-tls
make install-headers install_root=${TARGET_DIR}
cp -v bits/stdio_lim.h ${TARGET_DIR}/include/bits
touch ${TARGET_DIR}/include/gnu/stubs.h
5.8 gcc (临时工具) 编译一个gcc工具,并使用sysroot参数让其编译时默认使用目录下的环境。
patch -Np1 -i ${DOWNLOAD_DIR}/gcc-4.2.2-cross_search_paths-1.patch
patch -Np1 -i ${DOWNLOAD_DIR}/gcc-4.2.2-hurd_fix-1.patch
mkdir -v ../gcc-build
cd ../gcc-build
../gcc-4.2.1/configure --prefix=${TARGET_DIR}/tools --host=${BUILD_HOST} \
--target=${BUILD_TARGET} --with-sysroot=${TARGET_DIR} --disable-nls \
--disable-shared --disable-threads --disable-multilib --enable-languages=c
make all-gcc
make install-gcc
5.9 mig (目标系统工具) 重新编译一个mig工具,用于处理hurd系统使用的一些头文件
aclocal
automake -a
autoconf
mkdir ../mig-cross
cd ../mig-cross
../mig/configure --prefix=${TARGET_DIR}/tools --build=${BUILD_HOST} --target=${BUILD_TARGET}
make
make install
5.10 gnumach 编译一个可以启动的mach微内核
mkdir ../gnumach-build
cd ../gnumach-build
CC="gcc" ../gnumach.patch/configure --build=${BUILD_HOST} --host=${BUILD_TARGET}
make
${BUILD_TARGET}-strip --strip-all gnumach
gzip -9 gnumach
cp gnumach.gz ${TARGET_DIR}/boot/
5.11 glibc patch -Np1 -i ${DOWNLOAD_DIR}/glibc-2.3.6-hurd-1.patch
patch -Np1 -i ${DOWNLOAD_DIR}/glibc-2.3.6-local-1.patch
patch -Np1 -i ${DOWNLOAD_DIR}/glibc-2.3.6-cross-1.patch
mkdir -v ../glibc-build
cd ../glibc-build
echo "install_root=${TARGET_DIR}" > configparms
BUILD_CC="gcc" CC="${BUILD_TARGET}-gcc" AR="${BUILD_TARGET}-ar" RANLIB="${BUILD_TARGET}-ranlib" \
../glibc-2.3.6/configure \
--prefix= --host=${BUILD_TARGET} --build=${BUILD_HOST} \
--disable-profile --without-tls \
--with-binutils=${TARGET_DIR}/tools/bin --with-headers=${TARGET_DIR}/include
make
make install
make localedata/install-locales
cat > ${TARGET_DIR}/etc/nsswitch.conf << “EOF”
passwd: files
group: files
shadow: files
hosts: files dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
EOF
cp -v --remove-destination ${TARGET_DIR}/share/zoneinfo/Asia/Shanghai \
${TARGET_DIR}/etc/localtime
创建一个必要的链接
ln -s ld.so.1 ${TARGET_DIR}/lib/ld.so
5.12 hurd 编译hurd,包括一组hurd专用的命令集合。
patch -Np0 -i hurd-pfinet_-fno-strict-aliasing.patch
patch -Np0 -i hurd-pfinet_dhcp.patch
patch -Np1 -i hurd-runsystem-1.patch
mkdir -v ../hurd-build
cd ../hurd-build
../hurd/configure --build=${BUILD_HOST} --host=${BUILD_TARGET} --disable-profile --prefix=
make
切换到root用户(这里必须以root身份的用户来安装)
su
export PATH=${TARGET_DIR}/tools/bin:$PATH
make install prefix=${TARGET_DIR}
chmod +s /bin/login
sed -i "s@libcrt_nonshared.a@libcrt_nonshared.a /lib/libpthread.so@g" ${TARGET_DIR}/lib/libc.so
sed -i "s@libhurduser.a@libhurduser.a libpthread.a@g" ${TARGET_DIR}/lib/libc.a
重新进入hfs用户
exit
5.13 binutils 目标系统使用的binutils
mkdir -pv ../binutils-build
cd ../binutils-build
../binutils-2.18/configure \
--prefix= --build=${BUILD_HOST} --host=${BUILD_TARGET} \
--enable-shared --disable-multilib
make configure-host
make tooldir=
make DESTDIR=${TARGET_DIR} tooldir= install
cp -v ../binutils-2.18/include/libiberty.h ${TARGET_DIR}/include
5.14 gcc 目标系统使用的gcc
cp libiberty/Makefile.in{,.orig} &&
sed 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in.orig \
> libiberty/Makefile.in
cp gcc/gccbug.in{,.orig} &&
sed 's/@have_mktemp_command@/yes/' gcc/gccbug.in.orig > gcc/gccbug.in
cp gcc/Makefile.in{,.orig} &&
sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in
patch -Np1 -i gcc-4.2.2-hurd-fix-1.patch
patch -Np1 -i gcc-4.2.2-tmake_file-1.patch
patch -Np1 -i gcc-4.2.2-makefile_fix-1.patch
mkdir -v ../gcc-build
cd ../gcc-build
../gcc-4.2.2/configure --prefix= \
--libexecdir=/lib --build=${BUILD_HOST} --host=${BUILD_TARGET} \
--target=${BUILD_TARGET} --enable-shared --enable-threads=posix \
--enable-__cxa_atexit --enable-c99 --enable-long-long \
--enable-clocale=gnu --enable-languages=c --disable-multilib
make
make DESTDIR=${TARGET_DIR} install
ln -sv ../bin/cpp ${TARGET_DIR}/lib
ln -sv gcc ${TARGET_DIR}/bin/cc
5.15 bash (临时工具) patch -Np1 -i ${DOWNLOAD_DIR}/bash-3.2-fixes-5.patch
echo "bash_cv_sys_named_pipes=yes" > config.cache
./configure --build=${BUILD_HOST} --host=${BUILD_TARGET} \
--prefix=${TARGET_DIR}/tools --without-bash-malloc
make
make install
ln -s /tools/bin/bash ${TARGET_DIR}/bin/bash
ln -s bash ${TARGET_DIR}/bin/sh
5.16 sed ./configure --build=${BUILD_HOST} --host=${BUILD_TARGET} \
--prefix= --bindir=/bin --enable-html
make
make DESTDIR=${TARGET_DIR} install
5.17 grep patch -Np1 -i ${DOWNLOAD_DIR}/grep-2.5.1a-redhat_fixes-2.patch
./configure --build=${BUILD_HOST} --host=${BUILD_TARGET} \
--prefix= --bindir=/bin --disable-perl-regexp
make
make DESTDIR=${TARGET_DIR} install
5.18 coreutils patch -Np1 -i ${DOWNLOAD_DIR}/coreutils-6.9-suppress_uptime_kill_su-1.patch
patch -Np1 -i ${DOWNLOAD_DIR}/coreutils-6.9-uname-1.patch
sed -i "s/futimens/gl_&/" $(grep -lr futimens *)
touch man/uname.1 man/touch.1
echo "fu_cv_sys_stat_statfs2_bsize=yes" > config.cache
./configure --build=${BUILD_HOST} --host=${BUILD_TARGET} --prefix= --cache-file=config.cache
make
make DESTDIR=${TARGET_DIR} install
mv -v ${TARGET_DIR}/bin/chroot ${TARGET_DIR}/sbin
5.19 make ./configure --build=${BUILD_HOST} --host=${BUILD_TARGET} --prefix=
make
make DESTDIR=${TARGET_DIR} install
5.20 diffutils touch man/diff.1
./configure --build=${BUILD_HOST} --host=${BUILD_TARGET} --prefix=
make
make DESTDIR=${TARGET_DIR} install
5.21 gawk patch -Np1 -i ${DOWNLOAD_DIR}/gawk-3.1.5-segfault_fix-1.patch
./configure --build=${BUILD_HOST} --host=${BUILD_TARGET} --prefix= --libexecdir=/lib
cat >> config.h << "EOF"
#define HAVE_LANGINFO_CODESET 1
#define HAVE_LC_MESSAGES 1
EOF
make
make DESTDIR=${TARGET_DIR} install
5.22 gzip sed -i "s/futimens/gl_&/" $(grep -lr futimens *)
./configure --build=${BUILD_HOST} --host=${BUILD_TARGET} --prefix= --bindir=/bin
make
make DESTDIR=${TARGET_DIR} install
5.23 tar ./configure --build=${BUILD_HOST} --host=${BUILD_TARGET} --prefix=
make
make DESTDIR=${TARGET_DIR} install
5.24 grub patch -Np1 -i ${DOWNLOAD_DIR}/grub-0.97-disk_geometry-1.patch
./configure --build=${BUILD_HOST} --host=${BUILD_TARGET} --prefix=
make
make DESTDIR=${TARGET_DIR} install
mkdir -v ${TARGET_DIR}/boot/grub
cp -v ${TARGET_DIR}/lib/grub/i386-pc/stage{1,2} ${TARGET_DIR}/boot/grub
5.25 去除调试符 i686-pc-gnu-strip --strip-all ${TARGET_DIR}/{bin,sbin,hurd}/*
i686-pc-gnu-strip --strip-all ${TARGET_DIR}/lib/*.so*
i686-pc-gnu-strip --strip-debug ${TARGET_DIR}/lib/*.a
5.26 创建必要的文件 touch ${TARGET_DIR}/dev/tty
touch ${TARGET_DIR}/dev/null
touch ${TARGET_DIR}/dev/console
cat > ${TARGET_DIR}/etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
EOF
cat > ${TARGET_DIR}/etc/group << "EOF"
root:x:0:
EOF
touch ${TARGET_DIR}/var/run/utmp ${TARGET_DIR}/var/log/{btmp,lastlog,wtmp}
chmod -v 664 ${TARGET_DIR}/var/run/utmp ${TARGET_DIR}/var/log/lastlog
5.27 使hurd系统可以启动 cat > ${TARGET_DIR}/boot/grub/menu.lst << "EOF"
default 0
timeout 30
color green/black light-green/black
title Hurd
root (hd0,0)
kernel /boot/gnumach.gz root=device:hd0s1 -s
module /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)
module /lib/ld.so.1 /hurd/exec $(exec-task=task-create)
EOF
这里我们可以利用Linux的grub来使系统系统可以启动
grub
root (hd0,0)
setup (hd0)
quit
5.27 重新启动系统进入hurd 重新启动计算机,并从grub中选择启动刚刚建立Hurd系统。
5.28 创建设备文件 cd /dev
./MAKEDEV std
./MAKEDEV tty{1..6}
chown -R root:root /
5.29 设置环境变量 export PS1='\u:\w\$ '
export DOWNLOAD_DIR="/download"
6 建立相对完整的系统意外情况处理:
如果在编译过程中发生意外的死机或者断电情况,有可能导致Hurd启动后自动设置磁盘为只读模式,这个时候可以使用
fsysopts / --writable
来设置为可写模式,然后继续未完成的编译即可。
6.1 patch ./configure --prefix=
make
make install
6.2 bzip2 patch -Np1 -i ${DOWNLOAD_DIR}/bzip2-1.0.4-install_docs-1.patch
make -f Makefile-libbz2_so
make clean
make
make PREFIX=/ install
cp -v bzip2-shared /bin/bzip2
cp -av libbz2.so* /lib
ln -sv ../../lib/libbz2.so.1.0 /lib/libbz2.so
rm -v /bin/{bunzip2,bzcat}
ln -sv bzip2 /bin/bunzip2
ln -sv bzip2 /bin/bzcat
6.3 findutils ./configure --prefix= --libexecdir=/lib/findutils --localstatedir=/var/lib/locate
make
make install
sed -i -e 's/find:=${BINDIR}/find:=\/bin/' /bin/updatedb
6.4 gcc (bootstrap) patch -Np1 -i gcc-4.2.2-tmake_file-1.patch
patch -Np1 -i gcc-4.2.2-hurd-fix-1.patch
sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in
sed -i 's/@have_mktemp_command@/yes/' gcc/gccbug.in
mkdir -v ../gcc-build
cd ../gcc-build
../gcc-4.2.2/configure
--prefix= \
--libexecdir=/lib --enable-shared \
--enable-threads=posix --enable-__cxa_atexit \
--enable-clocale=gnu --enable-languages=c,c++
make bootstrap
make install
6.5 ncurses patch -Np1 -i ${DOWNLOAD_DIR}/ncurses-5.6-coverity_fixes-1.patch
patch -Np1 -i ${DOWNLOAD_DIR}/ncurses-5.6-bash_fix-1.patch
./configure --prefix= --includedir=/include --with-shared --without-debug --enable-widec
make
make install
chmod -v 644 /lib/libncurses++w.a
ln -sfv libncursesw.so.5 /lib/libncursesw.so
for lib in curses ncurses form panel menu ; do \
rm -vf /lib/lib${lib}.so ; \
echo "INPUT(-l${lib}w)" >/lib/lib${lib}.so ; \
ln -sfv lib${lib}w.a /lib/lib${lib}.a ; \
done
ln -sfv libncurses++w.a /lib/libncurses++.a
rm -vf /lib/libcursesw.so
echo "INPUT(-lncursesw)" >/lib/libcursesw.so
ln -sfv libncurses.so /lib/libcurses.so
ln -sfv libncursesw.a /lib/libcursesw.a
ln -sfv libncurses.a /lib/libcurses.a
6.6 gettext ./configure --prefix=
make
make install
6.7 texinfo patch -Np1 -i ${DOWNLOAD_DIR}/texinfo-4.9-multibyte-1.patch
patch -Np1 -i ${DOWNLOAD_DIR}/texinfo-4.9-tempfile_fix-1.patch
./configure --prefix=
make
make install
make TEXMF=/share/texmf install-tex
6.8 Berkeley db patch -Np1 -i ${DOWNLOAD_DIR}/db-4.5.20-fixes-1.patch
cd build_unix
../dist/configure --prefix= --enable-compat185 --enable-cxx
make
make docdir=/share/doc/db-4.5.20 install
chown -Rv root:root /share/doc/db-4.5.20
6.9 iana-etc make
make install
6.10 e2fsprogs mkdir -v build
cd build
../configure --prefix=/ --with-root-prefix="" \
--enable-elf-shlibs --disable-resizer
make
make install
make install-libs
6.11 m4 ./configure --prefix=
make
make install
6.12 bison ./configure --prefix=
echo '#define YYENABLE_NLS 1' >> config.h
make
make install
6.13 libtool ./configure --prefix=
make
make install
6.14 zlib ./configure --prefix= --shared --libdir=/lib
make
make install
make clean
./configure --prefix=
make
make install
chmod -v 644 /lib/libz.a
6.15 perl cp makedepend.SH{,.orig}
sed 's/
//g' makedepend.SH.orig > makedepend.SH
./configure.gnu --prefix=/ \
-Dman1dir=/share/man/man1 \
-Dman3dir=/share/man/man3 \
-Dpager="/bin/less -isR"
make
make install
6.16 readline
sed -i '/MV.*old/d' Makefile.in
sed -i '/{OLDSUFF}/c:' support/shlib-install
patch -Np1 -i ${DOWNLOAD_DIR}/readline-5.2-fixes-3.patch
./configure --prefix= --libdir=/lib
make SHLIB_LIBS=-lncurses
make install
ln -sfv libreadline.so.5 /lib/libreadline.so
ln -sfv libhistory.so.5 /lib/libhistory.so
6.17 autoconf
./configure --prefix=
make
make install
6.18 automake
./configure --prefix=
make
make install
6.19 bash
tar xvf ${DOWNLOAD_DIR}/bash-doc-3.2.tar.gz
sed -i "s|htmldir = @htmldir@|htmldir = /share/doc/bash-3.2|" \
Makefile.in
patch -Np1 -i ${DOWNLOAD_DIR}/bash-3.2-fixes-5.patch
./configure --prefix= --bindir=/bin \
--without-bash-malloc --with-installed-readline
make
make install
exec /bin/bash --login +h
6.20 file
patch -Np1 -i file-4.21-hurd-1.patch
./configure --prefix=
make
make install
6.21 flex
./configure --prefix=
make
make install
ln -sv libfl.a /lib/libl.a
cat > /bin/lex << "EOF"
#!/bin/sh
exec /bin/flex -l "$@"
EOF
chmod -v 755 /bin/lex
6.22 groff
patch -Np1 -i ${DOWNLOAD_DIR}/groff-1.18.1.4-debian_fixes-1.patch
sed -i -e 's/2010/002D/' -e 's/2212/002D/' \
-e 's/2018/0060/' -e 's/2019/0027/' font/devutf8/R.proto
PAGE=A4 ./configure --prefix= --enable-multibyte
make
make install
ln -sv eqn /bin/geqn
ln -sv tbl /bin/gtbl
6.23 inetutils
patch -Np1 -i ${DOWNLOAD_DIR}/inetutils-1.5-no_server_man_pages-2.patch
./configure --prefix= --libexecdir=/sbin \
--sysconfdir=/etc --localstatedir=/var \
--disable-servers --enable-syslogd --enable-inetd
make
make install
cat > /etc/syslog.conf << "EOF"
# Begin /etc/syslog.conf
auth,authpriv.* -/var/log/auth.log
*.*;auth,authpriv.none -/var/log/sys.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
*.emerg *
# End /etc/syslog.conf
EOF
6.24 less
./configure --prefix= --sysconfdir=/etc
make
make install
6.25 man-db
sed -i 's,\*_\*,??,' man/Makefile.in
sed -i -e '\%\t/man%d' -e '\%\t/local/man%d' src/man_db.conf.in
./configure --prefix= --enable-mb-groff --disable-setuid
make
make install
cat >> convert-mans << "EOF"
#!/bin/sh -e
FROM="$1"
TO="$2"
shift ; shift
while [ $# -gt 0 ]
do
FILE="$1"
shift
iconv -f "$FROM" -t "$TO" "$FILE" >.tmp.iconv
mv .tmp.iconv "$FILE"
done
EOF
install -m755 convert-mans /bin
6.26 mktemp
patch -Np1 -i ${DOWNLOAD_DIR}/mktemp-1.5-add_tempfile-3.patch
./configure --prefix= --with-libc
make
make install
make install-tempfile
6.27 psmisc
patch -Np1 -i ${DOWNLOAD_DIR}/psmisc-22.5-hurd-1.patch
./configure --prefix= --exec-prefix=""
make
make install
ln -sv killall /bin/pidof
6.28 shadow
patch -Np1 -i ${DOWNLOAD_DIR}/shadow-4.0.18.1-useradd_fix-2.patch
patch -Np1 -i ${DOWNLOAD_DIR}/shadow-4.0.18.1-hurd-1.patch
./configure --prefix= --libdir=/lib --sysconfdir=/etc --enable-shared \
--without-selinux
sed -i -e 's/groups$(EXEEXT) //' -e 's/login$(EXEEXT) //' src/Makefile
find man -name Makefile -exec sed -i 's/groups\.1 / /' {} \;
sed -i -e 's@#MD5_CRYPT_ENAB.no@MD5_CRYPT_ENAB yes@' \
-e 's@/var/spool/mail@/var/mail@' etc/login.defs
make
make install
rm -v /lib/libshadow.so
ln -sfv libshadow.so.0 /lib/libshadow.so
pwconv
grpconv
useradd -D -b /home
sed -i 's/yes/no/' /etc/default/useradd
passwd root
6.29 vim
patch -Np1 -i ${DOWNLOAD_DIR}/vim-7.1-fixes-1.patch
patch -Np1 -i ${DOWNLOAD_DIR}/vim-7.1-mandir-1.patch
echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
./configure --prefix=/ --enable-multibyte
make
make install
ln -sv vim /bin/vi
for L in "" fr it pl ru; do
ln -sv vim.1 /share/man/$L/man1/vi.1
done
ln -sv ../vim/vim71/doc /share/doc/vim-7.1
cat > /etc/vimrc << "EOF"
" Begin /etc/vimrc
set nocompatible
set backspace=2
syntax on
if (&term == "iterm") || (&term == "putty")
set background=dark
endif
" End /etc/vimrc
EOF
6.31 wget
./configure --prefix=
make
make install
7 Hurd配置
7.1 系统相关配置
echo "hfs" > /etc/hostname
echo "127.0.0.1 localhost hfs" > /etc/hosts
echo "/dev/hd0s1 / ext2" > /var/run/mtab
7.2 建立fstab文件
cat > /etc/fstab << "EOF"
/dev/hd0s1 / ext2 defaults 0 0
EOF
7.3 用户配置脚本
echo "export PS1='\u:\w\$ '" > /etc/profile
配置/etc/inputrc
cat > /etc/inputrc << "EOF"
set horizontal-scroll-mode Off
set meta-flag On
set input-meta On
set convert-meta Off
set output-meta On
set bell-style none
"\eOd": backward-word
"\eOc": forward-word
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[3~": delete-char
"\e[2~": quoted-insert
"\eOH": beginning-of-line
"\eOF": end-of-line
"\e[H": beginning-of-line
"\e[F": end-of-line
EOF
8 重新设置grub
cat > ${TARGET_DIR}/boot/grub/menu.lst << "EOF"
default 0
timeout 30
color green/black light-green/black
title Hurd
root (hd0,0)
kernel /boot/gnumach.gz root=device:hd0s1
module /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)
module /lib/ld.so.1 /hurd/exec $(exec-task=task-create)
EOF
好了,到现在我们重新启动,并选择Hurd,将进入一个全新的Hurd系统,当然目前这个系统还比较“粗糙”,不过我们已经具备了基本的扩展环境,在现在的系统上可以继续扩展不同的软件包来达到不同的功能。
9 结束语
与Linux内核相比较,Hurd还非常的不完善,Hurd还处于开发中,尚不能用于生产环境。当然随着Hurd的不断发展会不断完善,让我们拭目以待。
(转载请保持文章的完整性,请注明作者和出处)
作者:孙海勇
Email:youbest@sina.com
2008年2月16日
完成本文后的Hurd系统启动画面