LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3363|回复: 10

[原创]Hurd系统源代码搭建手册(从Linux到Hurd) 正式版

[复制链接]
发表于 2008-2-16 22:06:47 | 显示全部楼层 |阅读模式
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
    http://www.zdbr.net.cn/download/gnumach.tar.bz2
   hurd
    http://www.zdbr.net.cn/download/hurd-20070926.tar.bz2
   mig
    http://www.zdbr.net.cn/download/mig-20070926.tar.bz2
   binutils
    http://ftp.gnu.org/gnu/binutils/binutils-2.18.tar.bz2
   glibc
    http://ftp.gnu.org/gnu/glibc/glibc-2.3.6.tar.bz2
   gcc
    http://ftp.gnu.org/gnu/gcc/gcc-4.2.2/gcc-4.2.2.tar.bz2
   bash
    http://ftp.gnu.org/gnu/bash/bash-3.2.tar.gz
   sed
    http://ftp.gnu.org/gnu/sed/sed-4.1.5.tar.gz
   grep
    http://ftp.gnu.org/gnu/grep/grep-2.5.1a.tar.bz2
   coreutils
    http://ftp.gnu.org/gnu/coreutils/coreutils-6.9.tar.bz2
   make
    http://ftp.gnu.org/gnu/make/make-3.81.tar.bz2
   diffutils
    http://ftp.gnu.org/gnu/diffutils/diffutils-2.8.7.tar.gz
   gawk
    http://ftp.gnu.org/gnu/gawk/gawk-3.1.5.tar.bz2
   gzip
    http://ftp.gnu.org/gnu/gzip/gzip-1.3.12.tar.gz
   tar
    http://ftp.gnu.org/gnu/tar/tar-1.18.tar.bz2
   patch
    http://ftp.gnu.org/gnu/patch/patch-2.5.9.tar.gz
   bzip2
    http://www.bzip.org/1.0.4/bzip2-1.0.4.tar.gz
   findutils
    http://ftp.gnu.org/gnu/findutils/findutils-4.2.31.tar.gz
   ncurses
    ftp://invisible-island.net/ncurses/ncurses-5.6.tar.gz
   gettext
    http://ftp.gnu.org/gnu/gettext/gettext-0.16.1.tar.gz
   texinfo
    http://ftp.gnu.org/gnu/texinfo/texinfo-4.9.tar.bz2
   Berkeley db
    http://download-east.oracle.com/berkeley-db/db-4.5.20.tar.gz
   iana-etc
    http://www.sethwklein.net/projec ... na-etc-2.20.tar.bz2
   e2fsprogs
    http://prdownloads.sourceforge.n ... progs-1.40.2.tar.gz
   m4
    http://ftp.gnu.org/gnu/m4/m4-1.4.10.tar.bz2
   bison
    http://ftp.gnu.org/gnu/bison/bison-2.3.tar.bz2
   libtool
    http://ftp.gnu.org/gnu/libtool/libtool-1.5.24.tar.gz
   zlib
    http://www.zlib.net/zlib-1.2.3.tar.gz
   perl
    http://ftp.funet.fi/pub/CPAN/src/perl-5.8.8.tar.bz2
   readline
    http://ftp.gnu.org/gnu/readline/readline-5.2.tar.gz
   autoconf
    http://ftp.gnu.org/gnu/autoconf/autoconf-2.61.tar.bz2
   automake
    http://ftp.gnu.org/gnu/automake/automake-1.10.tar.bz2
   file
    ftp://ftp.gw.com/mirrors/pub/unix/file/file-4.21.tar.gz
   flex
    http://prdownloads.sourceforge.net/flex/flex-2.5.33.tar.bz2
   groff
    http://ftp.gnu.org/gnu/groff/groff-1.18.1.4.tar.gz
   inetutils
    http://ftp.gnu.org/gnu/inetutils/inetutils-1.5.tar.gz
   less
    http://www.greenwoodsoftware.com/less/less-406.tar.gz
   man-db
    http://savannah.nongnu.org/download/man-db/man-db-2.4.4.tar.gz
   mktemp
    ftp://ftp.mktemp.org/pub/mktemp/mktemp-1.5.tar.gz
   psmisc
    http://prdownloads.sourceforge.net/psmisc/psmisc-22.5.tar.gz
   shadow
    ftp://ftp.pld.org.pl/software/shadow/shadow-4.0.18.1.tar.bz2
   vim
    ftp://ftp.vim.org/pub/vim/unix/vim-7.1.tar.bz2
   grub
    ftp://alpha.gnu.org/gnu/grub/grub-0.97.tar.gz
   wget
    http://ftp.gnu.org/gnu/wget/wget-1.10.2.tar.gz

  3.2 补丁包下载
    http://www.zdbr.net.cn/download/hfs-patch-1.0.tar.bz2
  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/binPATH
      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/<command line>/<command-line>/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系统启动画面
发表于 2008-2-16 22:38:22 | 显示全部楼层
难得的沙发。这两天忙着找工作,难得来看下。
支持豹老师!
回复 支持 反对

使用道具 举报

发表于 2008-2-16 23:25:33 | 显示全部楼层
不错,好东西
回复 支持 反对

使用道具 举报

发表于 2008-2-16 23:46:13 | 显示全部楼层
这个……太经典了!!!
一直想弄个HURD来玩玩,奈何太菜,连LFS离开了手册都搞不定,更不用想HURD了,有了豹兄这篇大作的指导,改天照猫画虎也要玩一下!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-16 23:52:03 | 显示全部楼层
我制作了本文配套的LiveCD,正在找一个合适适合下载的地方传上去。
回复 支持 反对

使用道具 举报

发表于 2008-2-17 08:16:12 | 显示全部楼层
youbest 的意思是用这配套的 LiveCD 就能直接用它做宿主,无需玩 CLFS?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-17 11:43:06 | 显示全部楼层
Post by d00m3d;1816872
youbest 的意思是用这配套的 LiveCD 就能直接用它做宿主,无需玩 CLFS?

我的意思是这个LiveCD里包含做这个系统所必须的各种软件包及补丁,同时这个LiveCD就可以拿来做为制作过程的主系统.
回复 支持 反对

使用道具 举报

发表于 2008-2-17 11:53:18 | 显示全部楼层
赞。最近豹哥你是高产高收啊。。连续出手几篇精彩文章,不得不佩服。偶是一篇也没有。哈哈。。。
回复 支持 反对

使用道具 举报

发表于 2008-2-23 10:38:46 | 显示全部楼层
YOUBEST
SIR有你最好
回复 支持 反对

使用道具 举报

发表于 2008-2-25 19:26:20 | 显示全部楼层
学习中啊,呵呵
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表