Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1148741
  • 博文数量: 32
  • 博客积分: 8054
  • 博客等级: 中将
  • 技术积分: 892
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-19 14:47
个人简介

感谢大家!

文章分类

全部博文(32)

文章存档

2011年(2)

2010年(1)

2009年(3)

2008年(7)

2007年(8)

2006年(11)

分类:

2007-12-02 13:53:57

Hurd系统源代码搭建手册(从Linux到Hurd 预览版)

                  ——Hurd from source(Linux to Hurd)

作者:孙海勇
 
  注意:本文目前还处于预览版阶段,其后可能会对内容进行一定程度的增加和修改,如果你对此感兴趣,可以随时关注最新的修改,并欢迎您提出宝贵意见。
 
1 前言

  本文涉及的Hurd是GNU自行开发的基于Mach微内核的内核,提供完整的源代码,Hurd可以同GNU提供的大量工具组合成一个可以使用的操作系统。
  我本人也对Hurd颇感兴趣,于是想利用Hurd及相关软件包的源代码打造一个Hurd为核心的系统。
  本文利用gnu提供的hurd及其工具的源代码在Linux的环境下建立了一个Hurd系统,目的是为满足希望能近距离接触的用户提供一种建立和了解的途径,希望为今后的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/hda2的未用分区,我们先格式化成Hurd能够识别的文件系统。
    mkfs.ext2 -b 4096 -o hurd /dev/hda2
    建立一个目录用于挂载刚刚建立的分区。
    mkdir /hfs
    mount /dev/hda2 /hfs
    建立build用于编译使用,建立download目录用于存放从网络上下载的各个软件的源代码包。
    export TARGET_DIR="/hfs"
    mkdir –pv ${TARGET_DIR}/{build,download}
    chown –Rv hfs ${TARGET_DIR}
3 软件源代码下载
  3.1  软件包列表
  3.2  补丁包列表
  3.3  软件及补丁打包下载
  3.4  关于软件包版本
    本文所使用的软件包是在开始写本文是最新软件包的正式发布版本(hurd内核及相关的几个包除外),写完后一直未发表,到发布本文时时间已经过去2个月,文中个别软件包的版本可能已经更新,在建立系统时候可以按照本文的版本来制作,也可以尝试使用最新的版本,本文也会在后面的更新中逐渐更新软件包的版本。
    关于glibc的版本,我试了几个版本的glibc,似乎2.4以上的版本编译hurd版本似乎问题较多,所以这里使用2.3.6的版本,编译过程比较顺利,如果你有兴趣也可以尝试2.4以上版本,在写本文的实验过程曾经编译通过过glibc-2.5,不过本文目前还是推荐使用2.3.x的版本。
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专用命令存放目录
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的头文件
      ../gnumach/configure --build=${BUILD_TARGET} --prefix=
      make install-data prefix=${TARGET_DIR}
  5.4  hurd-headers
      安装hurd的头文件
      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 ../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 ../glibc-build
      cd ../glibc-build
      CC="gcc -I${TARGET_DIR}/include" ../glibc-2.3.6.headers/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.1-cross_search_paths-1.patch
      patch -Np1 -i ${DOWNLOAD_DIR}/gcc-4.2.1-gnu_fix-1.patch
      mkdir -v ../gcc-build
      cd ../gcc-build
      ../gcc-4.2.1/configure --prefix=${TARGET_DIR}/systools --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/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
      sed -i "s@libcrt_nonshared.a@libcrt_nonshared.a /lib/libpthread.so@g" /lib/libc.so
      sed -i s@libhurduser.a@libhurduser.a libpthread.a@g" /lib/libc.a
      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
      ../hurd/configure --build=${BUILD_HOST} --host=${BUILD_TARGET} --disable-profile --prefix=
      make
      切换到root用户(这里必须以root身份的用户来安装)
      export PATH=${TARGET_DIR}/tools/bin:$PATH
      make install prefix=${TARGET_DIR}
      chmod +s /bin/login
  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-undef-c99-1.patch
      patch -Np1 -i gcc-4.2.2-tmake_file-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 去除调试符
      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.25 创建必要的文件
      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.26 使hurd系统可以启动
      cat > ${TARGET_DIR}/boot/grub/menu.lst << "EOF"
      default 0
      timeout 30
      color green/black light-green/black
 
      title Hurd
      root (hd2,0)
      kernel /boot/gnumach.gz root=device:hd3s1 -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来使系统系统可以启动
  5.27 重新启动系统进入hurd
  5.28 创建设备文件
      cd /dev
      ./MAKEDEV std
      ./MAKEDEV tty{1..6}
      chown -R root:root /

6 建立相对完整的系统
  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.1.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=/usr --with-root-prefix="" \
                --enable-elf-shlibs --disable-resize
      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
      patch -Np1 -i ${DOWNLOAD_DIR}/mktemp-1.5-gnu_hash-1.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
      ./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.30 grub
      patch -Np1 -i ${DOWNLOAD_DIR}/grub-0.97-disk_geometry-1.patch
      ./configure --prefix=
      make
      make install
      mkdir -v /boot/grub
      cp -v /lib/grub/i386-unknown/stage{1,2} /boot/grub
  6.31 wget
      ./configure --prefix=
      make
      make install

7 Hurd配置
  7.1  网络配置
  7.2  系统相关配置

      echo "hfs" > /etc/hostname
      echo "127.0.0.1 localhost hfs" > /etc/hosts
      echo "/dev/hd0s3 / ext3" > /var/run/mtab
  7.3  用户配置脚本
      echo "export PS1='\u:\w\$ '" > /etc/profile
      配置/etc/inputrc
      cat > ${TARGET_DIR}/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 (hd2,0)
   kernel /boot/gnumach.gz root=device:hd3s1
   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
                                    2007年12月2日
阅读(4446) | 评论(6) | 转发(1) |
给主人留下些什么吧!~~