[jiabao]原创,转贴请注明出处。有误的地方,一定要指出:
邮箱:
微博:
接上一篇:linux-x86_64-multilib 完全编译定制,呕心呖血,更个性,更纯净!
http://blog.chinaunix.net/space.php?uid=26421196&do=blog&id=3019578
-------- 定制自已需要的Linux [多库]基本系统组件 ------
1. 制作多库系统,多数是参考CLFS,但本文不像CLFS文档那样,没有使用依赖宿主的交叉编译工具,完全是用最基础脱离宿主的tool,所有的东西都是在目标系统上自给自足生产的,思路很明确。
2. 有了核心的多库编译器,剩下的你可以参考 Cross-Compiled Linux From Scratch [CLFS] 的文档来完成了,不过[CLFS]她选用的软件依然很旧,我们选用的是目前为止网上公布的最新版本,编译方式和最新的PATCH也有差异,也添加了新的元素。但是CLFS也会经常更新的,你可以关注CLFS的最新文档,在线阅读地址:
稳定版:http://blog.chinaunix.net/space.php?uid=26421196&do=blog&id=3019578
开发版:
3. 当然,我有自已的一套方法,尽量避免patch而适应软件们默认的状态,而且封装打包了每一个软件。但是有些软件是不好封装的,一旦把64位库安装到了32位库目录,后果有点小麻烦。对于多数软件 您也可以在make install之前,使用make DESTDIR=$PKGDIR install 来提前分析。最好的方法还是查看configure脚本和调查生成的Makefile.
4. 包不是必须的,作用是制作发行版,或是为系统排错做分析依据,或是系统的完美备份,但是应该同时把.configure配置文件保留。
5. 下面的都是系统最依赖的组件,bin目录应该安装在/bin,lib应该在/lib64,其它的附属组件应该安装在/usr/{subdir},以便在系统启动时未挂载/usr目录时,系统应该仍然完好可启动,所以做了一些必要的配置。
---man-page-3.35---
- make install
- make DESTDIR=/pkg/man-page-3.35-x86_64 install
-- sed-4.2.1 --
- ./configure --prefix=/usr --bindir=/bin \
- --htmldir=/usr/share/doc/sed-4.2.1
安装,封包:
- make && make html
- make DESTDIR=/pkg/sed-4.2.1-x86_64 install
- make install
- make DESTDIR=/pkg/sed-4.2.1-x86_64 -C doc install-html
- make -C doc install-html
--bzip2-1.0.6--
32位库:
- make -f Makefile-libbz2_so CC="gcc -m32" CXX="g++ -m32"
- make clean
- make CC="gcc -m32" CXX="g++ -m32" libbz2.a
- mkdir -pv $PKGDIR-i686/{lib,usr/lib}
- cp -v libbz2.a $PKGDIR-i686/usr/lib
- cp -av libbz2.so* $PKGDIR-i686/lib
- ln -sv ../../lib/libbz2.so.1.0 $PKGDIR-i686/usr/lib/libbz2.so
64位:
先修正他创建的符号链接:
- sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile
他的文档不按常规目录安装,修改Makefile:
- sed -i 's@(PREFIX)/man@(PREFIX)/share/man@g' Makefile
修改目标库目录为(PREFIX)/lib64
- sed -i 's@(PREFIX)/lib@(PREFIX)/lib64@g' Makefile
不要用默认的Makefile,告诉使其编译libbz2.so:
- make -f Makefile-libbz2_so
- make clean
- make
- make PREFIX=$PKGDIR-x86_64/usr install
添加文档:
- mkdir -pv $PKGDIR-x86_64/{bin,lib64}
- mkdir -pv $PKGDIR-x86_64/usr/{lib64,share/doc/bzip2-1.0.6}
- cp -v README LICENSE README.* CHANGES $PKGDIR-x86_64/usr/share/doc/bzip2-1.0.6/
配置:
- rm -v $PKGDIR-x86_64/usr/bin/{bunzip2,bzcat,bzip2}
- cp -v bzip2-shared $PKGDIR-x86_64/bin/bzip2
- cp -av libbz2.so* $PKGDIR-x86_64/lib64
- ln -sv ../../lib64/libbz2.so.1.0 $PKGDIR-x86_64/usr/lib64/libbz2.so
- ln -sv bzip2 $PKGDIR-x86_64/bin/bunzip2
- ln -sv bzip2 $PKGDIR-x86_64/bin/bzcat
安装:
- cp -av $PKGDIR-i686/* /
- cp -av $PKGDIR-x86_64/* /
--- pcre-8.12 ---
32-lib:
- CC="gcc -m32" CXX="g++ -m32" \
- ./configure --prefix=/usr \
- --docdir=/usr/share/doc/pcre-8.12 \
- --enable-utf8 --enable-unicode-properties \
- --enable-pcregrep-libz --enable-pcregrep-libbz2
- make
- make DESTDIR=$PKGDIR-i686 install
- mkdir -v $PKGDIR-i686/lib
- mv -v $PKGDIR-i686/usr/lib/libpcre.so.* $PKGDIR-i686/lib/
- ln -v -sf ../../lib/libpcre.so.0 $PKGDIR-i686/usr/lib/libpcre.so
64-bit:
- ./configure --prefix=/usr --libdir=/usr/lib64 \
- --docdir=/usr/share/doc/pcre-8.12 \
- --enable-utf8 \
- --enable-unicode-properties \
- --enable-pcregrep-libz \
- --enable-pcregrep-libbz2
配置及制作包:
- make DESTDIR=$PKGDIR-x86_64 install
- mkdir -v $PKGDIR-x86_64/lib64
- mv -v $PKGDIR-x86_64/usr/lib64/libpcre.so.* $PKGDIR-x86_64/lib64/
- ln -v -sf ../../lib64/libpcre.so.0 $PKGDIR-x86_64/usr/lib64/libpcre.so
配置multiarch_wrapper:
- mv -v $PKGDIR-i686/usr/bin/pcre-config{,-32}
- mv -v $PKGDIR-x86_64/usr/bin/pcre-config{,-64}
- ln -vs multiarch_wrapper $PKGDIR-x86_64/usr/bin/pcre-config
安装:
- cp -av $PKGDIR-i686/* /
- cp -av $PKGDIR-x86_64/* /
--- glib-2.28.8 ---
- [32-bit:]
- PCRE_LIBS="-L/usr/lib -lpcre" PCRE_CFLAGS="-I/usr/include" \
- CC="gcc -m32" CXX="g++ -m32" \
- ./configure --prefix=/usr --sysconfdir=/etc --with-pcre=system
- make
- make DESTDIR=/pkg/glib-2.28.8-i686 install
- make install
- [64-bit:]
- PCRE_LIBS="-L/usr/lib64 -lpcre" PCRE_CFLAGS="-I/usr/include" \
- ./configure --prefix=/usr --sysconfdir=/etc \
- --with-pcre=system --libdir=/usr/lib64
- make
- make DESTDIR=/pkg/glib-2.28.8-x86_64 install
- make install
------pkg-config-0.26:-------
- GLIB_LIBS="-L/usr/lib64 -lglib-2.0" \
- GLIB_CFLAGS="-I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include" \
- ./configure --prefix=/usr
- make
- make DESTDIR=/pkg/pkg-config-0.26-x86_64 install
- make install
----------ncurses-5.9:-------------
32-bit:
- CC="gcc -m32" CXX="g++ -m32" \
- ./configure --prefix=/usr \
- --mandir=/usr/share/man \
- --with-shared --without-debug --enable-widec
- make && make install DESTDIR=$PKGDIR-i686
下面的配置非常重要,使此版本同时兼容4种版本的curses:
- mkdir -v $PKGDIR-i686/lib
- mv -v $PKGDIR-i686/usr/lib/libncursesw.so.5* $PKGDIR-i686/lib
- ln -sfv ../../lib/libncursesw.so.5 $PKGDIR-i686/usr/lib/libncursesw.so
- for lib in ncurses form panel menu ; do \
- rm -vf $PKGDIR-i686/usr/lib/lib${lib}.so ; \
- echo "INPUT(-l${lib}w)" > $PKGDIR-i686/usr/lib/lib${lib}.so ; \
- ln -sfv lib${lib}w.a $PKGDIR-i686/usr/lib/lib${lib}.a ; \
- done
- ln -sfv libncurses++w.a $PKGDIR-i686/usr/lib/libncurses++.a
上述意思是:
创建/usr/lib/lib{ncurses,form,panel,menu}.so ,使其指向各自的lib*w.so版本
创建/usr/lib/lib{...}.a,使其指向lib*w.a 版本:
- rm -vf $PKGDIR-i686/usr/lib/libcursesw.so
- echo "INPUT(-lncursesw)" > $PKGDIR-i686/usr/lib/libcursesw.so
- ln -sfv libncurses.so $PKGDIR-i686/usr/lib/libcurses.so
- ln -sfv libncursesw.a $PKGDIR-i686/usr/lib/libcursesw.a
- ln -sfv libncurses.a $PKGDIR-i686/usr/lib/libcurses.a
上述意思是:
创建不带n的curses,cursesw,curses.a 指向带n的版本.
上述方法是用宽字符库代替非宽字符库,而且使用中文的话,必须设置兼容,他的重要性在后面有个插曲.但是如果你有一些不是你编译的程序,必须要链接到非no-widec版本的库时,就需要创建no-widec的库:
- make distclean
- CC="gcc -m32" CXX="g++ -m32" \
- ./configure --prefix=/usr --with-shared --without-debug
- make sources libs
- cp -av lib/lib*.so.5* $PKGDIR-i686/usr/lib/
64位:与32位一样,只是库目录改为/lib64而已
- ./configure --prefix=/usr \
- --libdir=/usr/lib64 --mandir=/usr/share/man \
- --with-shared --without-debug --enable-widec
- make && make install DESTDIR=$PKGDIR-x86_64
- mkdir -v $PKGDIR-x86_64/lib64
- mv -v $PKGDIR-x86_64/usr/lib64/libncursesw.so.5* $PKGDIR-x86_64/lib64
- ln -sfv ../../lib64/libncursesw.so.5 $PKGDIR-x86_64/usr/lib64/libncursesw.so
- for lib in ncurses form panel menu ; do \
- rm -vf $PKGDIR-x86_64/usr/lib64/lib${lib}.so ; \
- echo "INPUT(-l${lib}w)" > $PKGDIR-x86_64/usr/lib64/lib${lib}.so ; \
- ln -sfv lib${lib}w.a $PKGDIR-x86_64/usr/lib64/lib${lib}.a ; \
- done
- ln -sfv libncurses++w.a $PKGDIR-x86_64/usr/lib64/libncurses++.a
- rm -vf $PKGDIR-x86_64/usr/lib64/libcursesw.so
- echo "INPUT(-lncursesw)" > $PKGDIR-x86_64/usr/lib64/libcursesw.so
- ln -sfv libncurses.so $PKGDIR-x86_64/usr/lib64/libcurses.so
- ln -sfv libncursesw.a $PKGDIR-x86_64/usr/lib64/libcursesw.a
- ln -sfv libncurses.a $PKGDIR-x86_64/usr/lib64/libcurses.a
配置文档:
- mkdir -pv $PKGDIR-x86_64/usr/share/doc/ncurses-5.9
- cp -v -R doc/* $PKGDIR-x86_64/usr/share/doc/ncurses-5.9
创建no-widec库:
- make distclean
- ./configure --prefix=/usr --with-shared --without-debug
- make sources libs
- cp -av lib/lib*.so.5* $PKGDIR-x86_64/usr/lib64/
制作multiarch_wrapper选择器:
- mv -v $PKGDIR-i686/usr/bin/ncursesw5-config{,-32}
- mv -v $PKGDIR-x86_64/usr/bin/ncursesw5-config{,-64}
- ln -sv multiarch_wrapper $PKGDIR-x86_64/usr/bin/ncurses5-config
最终安装:
- cp -av $PKGDIR-i686/* /
- cp --remove-destination -av $PKGDIR-x86_64/* /
-- util-linux-2.20.1: ---
- [i686]:
- CC="gcc -m32" CXX="g++ -m32" \
- ./configure --enable-arch --enable-partx --enable-write
- make && make DESTDIR=/pkg/util-linux-2.20.1-i686 install
- make install
- [x86_64]:
- ./configure --enable-arch --enable-partx \
- --enable-write --libdir=/lib64
- make && make DESTDIR=/pkg/util-linux-2.20.1-x86_64 install
- make install
-------------E2fsprogs-1.41.14------------------
- PKGDIR=/pkg/e2fsprogs-1.41.14
32位库:[在源码内新建子目录进行编译]
- mkdir build32 && cd build32
- CC="gcc -m32" CXX="g++ -m32" \
- ../configure --prefix=/usr --with-root-prefix="" \
- --enable-elf-shlibs \
- --disable-libblkid --disable-libuuid \
- --disable-uuidd --disable-fsck
- make libs
- make install-libs DESTDIR=$PKGDIR-i686
修正链接:
- ln -sv -f ../../lib/libcom_err.so.2 $PKGDIR-i686/usr/lib/libcom_err.so
- ln -sv -f ../../lib/libe2p.so.2 $PKGDIR-i686/usr/lib/libe2p.so
- ln -sv -f ../../lib/libext2fs.so.2 $PKGDIR-i686/usr/lib/libext2fs.so
- ln -sv -f ../../lib/libss.so.2 $PKGDIR-i686/usr/lib/libss.so
64位程序:
- mkdir ../build64 && cd ../build64
- CC="gcc -m64" CXX="g++ -m64" \
- ../configure --prefix=/usr --libdir=/usr/lib64 \
- --with-root-prefix="" --enable-elf-shlibs \
- --disable-libblkid --disable-libuuid \
- --disable-uuidd --disable-fsck
- make
- make DESTDIR=$PKGDIR-x86_64 install
- make DESTDIR=$PKGDIR-x86_64 install-libs
配置库[使其可写以便清理调试信息]:
- chmod -v u+w $PKGDIR-i686/usr/lib/{libcom_err,libe2p,libext2fs,libss}.a
- chmod -v u+w $PKGDIR-x86_64/usr/lib64/{libcom_err,libe2p,libext2fs,libss}.a
关键库移到根目录下:
- mkdir $PKGDIR-x86_64/lib64
- mv -v $PKGDIR-x86_64/usr/lib64/libcom_err.so.* $PKGDIR-x86_64/lib64
- mv -v $PKGDIR-x86_64/usr/lib64/libe2p.so.2* $PKGDIR-x86_64/lib64
- mv -v $PKGDIR-x86_64/usr/lib64/libext2fs.so.* $PKGDIR-x86_64/lib64
- mv -v $PKGDIR-x86_64/usr/lib64/libss.so.* $PKGDIR-x86_64/lib64
修正链接:
- ln -sv -f ../../lib64/libcom_err.so.2 $PKGDIR-x86_64/usr/lib64/libcom_err.so
- ln -sv -f ../../lib64/libe2p.so.2 $PKGDIR-x86_64/usr/lib64/libe2p.so
- ln -sv -f ../../lib64/libext2fs.so.2 $PKGDIR-x86_64/usr/lib64/libext2fs.so
- ln -sv -f ../../lib64/libss.so.2 $PKGDIR-x86_64/usr/lib64/libss.so
[安装文档时需要Tex的支持,会有个错误信息,被忽略掉,这里手动安装一下. ]
- gunzip -v $PKGDIR-x86_64/usr/share/info/libext2fs.info.gz
- install-info --dir-file=$PKGDIR-x86_64/usr/share/info/dir \
- $PKGDIR-x86_64/usr/share/info/libext2fs.info
- makeinfo -o doc/com_err.info ../lib/et/com_err.texinfo
- install -v -m644 doc/com_err.info $PKGDIR-x86_64/usr/share/info
- install-info --dir-file=$PKGDIR-x86_64/usr/share/info/dir \
- $PKGDIR-x86_64/usr/share/info/com_err.info
安装:
- cp -av $PKGDIR-i686/* /
- cp --remove-destination -av $PKGDIR-x86_64/* /
----- attr-2.4.44 -----
下载地址找的头皮发麻:
使安装的手册目录带上版本号:
- sed -i 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in
32-bit:
- CC="gcc -m32" CXX="g++ -m32" \
- ./configure --prefix=/usr --libexecdir=/usr/lib
- make && make install install-dev install-lib
头疼的封包方法:
- make install install-dev install-lib DIST_ROOT=$PKGDIR-i686
64位:
- sed -i 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in
这个安装脚本有点弱智:
如果设置/usr/lib64后,结果为/usr/lib6464
如果不设置libexecdir,结果为/usr/libexec64
所以:
- ./configure --prefix=/usr --libexecdir=/usr/lib --enable-lib64
- make
- make install install-dev install-lib
- make install install-dev install-lib DIST_ROOT=$PKGDIR-x86_64
-----acl-2.2.51----------
下载地址找的头皮发麻:
acl和attr不是一个机构维护的,编译方式都是一个模子刻出来的:
32位:
- sed -i 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in
- CC="gcc -m32" CXX="g++ -m32" \
- ./configure --prefix=/usr --libexecdir=/usr/lib
- make
- make install install-dev install-lib DIST_ROOT=$PKGDIR-i686
- make install install-dev install-lib
64位:
- sed -i 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in
- ./configure --prefix=/usr --libexecdir=/usr/lib --enable-lib64
- make
- make install install-dev install-lib DIST_ROOT=$PKGDIR-x86_64
- make install install-dev install-lib
### 关于acl和attr:###
安装后,在/etc/fstab就可以指定这两项了:
- # file system mount-point type options dump fsck
- /dev/sda1 / ext3 defaults,acl,user_xattr 0 2
##### NTFS格式分区支持 ntfs-progs_ntfs-3g #####
主页:
稳定版:
最新版:
- PKGDIR=/pkg/ntfs-progs-2011.10.9-rc
- 32bit:
- CC="gcc -m32" CXX="g++ -m32" \
- ./configure --prefix=/usr \
- --sbindir=/sbin --enable-extras \
- --enable-posix-acls --enable-xattr-mappings
- make && make DESTDIR=$PKGDIR-i686 install
- make install
- 64bit:
- ./configure --prefix=/usr --libdir=/usr/lib64 \
- --sbindir=/sbin --enable-extras \
- --enable-posix-acls --enable-xattr-mappings
- make && make DESTDIR=$PKGDIR-x86_64 install
- make install
##### 安装最新格式的分区支持 [btrfs-progs-0.19] #####
需要打五个补丁,来修复已知的BUG:
- patch -Np1 -i ../patches/btrfs-progs-fix-labels.patch
- patch -Np1 -i ../patches/btrfs-progs-build-everything.patch
- patch -Np1 -i ../patches/btrfs-progs-valgrind.patch
- patch -Np1 -i ../patches/btrfs-progs-upstream.patch
- patch -Np1 -i ../patches/btrfs-progs-compile-fix.patch
这个不能configure,只能按默认的方式进行make,封包的方法也不一样:
- make CFLAGS="-g -Os"
- make DESTDIR=/pkg/btrfs-progs-0.19-x86_64 bindir=/sbin mandir=/usr/share/man install
- make bindir=/sbin mandir=/usr/share/man install
---coreutils-8.14---------
- PKGDIR=/pkg/coreutils-8.14-x86_64
- ./configure --prefix=/usr --libexecdir=/usr/lib64
- make && make install DESTDIR=$PKGDIR
将这些程序放在根分区上更适合:
- mkdir -v $PKGDIR/bin
- mkdir -pv $PKGDIR/usr/share/man/man8
- mv -v $PKGDIR/usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} $PKGDIR/bin
- mv -v $PKGDIR/usr/bin/{false,ln,ls,mkdir,mknod,mv,pwd,rm} $PKGDIR/bin
- mv -v $PKGDIR/usr/bin/{rmdir,stty,sync,true,uname} $PKGDIR/bin
- mv -v $PKGDIR/usr/bin/chroot /usr/sbin
- mv -v $PKGDIR/usr/share/man/man1/chroot.1 $PKGDIR/usr/share/man/man8/chroot.8
- sed -i s/\
一些启动脚本可能依赖于 head, sleep 和 nice。由于 /usr 目录有 可能在系统启动过程的早期不可用,所以这些二进制程序需要放置在根分区上:
- mv -v $PKGDIR/usr/bin/{head,sleep,nice} $PKGDIR/bin
安装:
- cp --remove-destination -av $PKGDIR/* /
----Iana-Etc-2.30----
- make
- make DESTDIR=/pkg/iana-etc-2.30 install
- make install
----m4-1.4.16----
- ./configure --prefix=/usr
- make && make DESTDIR=/pkg/m4-1.4.16-x86_64 install
- make install
---bison-2.5 ---
32-lib:
- CC="gcc -m32" ./configure --prefix=/usr
如果 bison 程序不在 $PATH 中的话, 编译时将会出现缺乏国际化支持的错误信息,修改一下:
- echo '#define YYENABLE_NLS 1' >> lib/config.h
- make && make DESTDIR=/pkg/bison-2.5-i686 install
- make install
64-prog:
- ./configure --prefix=/usr --libdir=/usr/lib64
- echo '#define YYENABLE_NLS 1' >> lib/config.h
- make && make DESTDIR=/pkg/bison-2.5-x86_64 install
- make install
--- Procps-3.2.8 ---
32-lib:
使用高版本的make得做一件事,不然编译报错:
- sed -i -e 's@\*/module.mk@proc/module.mk ps/module.mk@' Makefile
- make CC="gcc -m32" m64="" ABI=32
- make install lib64=lib DESTDIR=/pkg/procps-3.2.8-i686
- make install lib64=lib
64-prog:
- sed -i -e 's@\*/module.mk@proc/module.mk ps/module.mk@' Makefile
- make ABI=64
- make install lib64=lib64 DESTDIR=/pkg/procps-3.2.8-x86_64
- make install lib64=lib64
--- grep-2.9 ---
- ./configure --prefix=/usr --bindir=/bin
- make && make DESTDIR=/pkg/grep-2.9-x86_64 install
- make install
--- readline-6.2 ----
配置:[patch可以不打]
- PKGDIR=/pkg/readline-6.2
- sed -i '/MV.*old/d' Makefile.in
- sed -i '/{OLDSUFF}/c:' support/shlib-install
- patch -Np1 -i ../patches/readline-6.2-fixes-1.patch
32位:
- CC="gcc -m32" CXX="g++ -m32" \
- ./configure --prefix=/usr --libdir=/lib
使用ncurses库,默认是curses,事实上结果是ncursesw:
[注:可选lncursesw,或 make SHLIB_XLDFLAGS=-lncurses{w}]
- make SHLIB_LIBS=-lncurses
- make install DESTDIR=$PKGDIR-i686
配置:
- mkdir -v $PKGDIR-i686/usr/lib
- mv -v $PKGDIR-i686/lib/lib{readline,history}.a $PKGDIR-i686/usr/lib
- rm -v $PKGDIR-i686/lib/lib{readline,history}.so
- ln -sfv ../../lib/libreadline.so.6 $PKGDIR-i686/usr/lib/libreadline.so
- ln -sfv ../../lib/libhistory.so.6 $PKGDIR-i686/usr/lib/libhistory.so
64:
- sed -i '/MV.*old/d' Makefile.in
- sed -i '/{OLDSUFF}/c:' support/shlib-install
- patch -Np1 -i ../patches/readline-6.2-fixes-1.patch
- ./configure --prefix=/usr --libdir=/lib64
- make SHLIB_LIBS=-lncurses
- make install DESTDIR=$PKGDIR-x86_64
- mkdir -v $PKGDIR-x86_64/usr/lib64
- mv -v $PKGDIR-x86_64/lib64/lib{readline,history}.a $PKGDIR-x86_64/usr/lib64
- rm -v $PKGDIR-x86_64/lib64/lib{readline,history}.so
- ln -sfv ../../lib64/libreadline.so.6 $PKGDIR-x86_64/usr/lib64/libreadline.so
- ln -sfv ../../lib64/libhistory.so.6 $PKGDIR-x86_64/usr/lib64/libhistory.so
添加文档:
- mkdir -pv $PKGDIR-x86_64/usr/share/doc/readline-6.2
- install -v -m644 doc/*.{ps,pdf,html,dvi} \
- $PKGDIR-x86_64/usr/share/doc/readline-6.2
安装:
- cp -av $PKGDIR-i686/* /
- cp --remove-destination -av $PKGDIR-x86_64/* /
------------ 插曲 -----------------------------
编译软件时,如果有相关资料或文档,并不是见了sed就要运行,见了Patch就要打,要弄清他的意义再做决定...
如果不做上面两个sed修改的话,在后面你会哭的.
[参考LFS说明]:
重新安装 Readline 会将老的库重命名为.old。这通常并不是问题。 但是, 在某些情况下它会引发ldconfig的一个链接bug。
开始我并没有sed,果然在后面编译其它软件时,让我遇到问题了:
telnet.o: In function `init_term':
/sources/inetutils-1.8/telnet/telnet.c:734: undefined reference to `tgetent'
undefined reference to `tgetent'
collect2: ld returned 1 exit status
make: *** [all] Error 2
不知你遇到问题时,是啥样的心情,不过没事,啥问题都有解决方法,你应该学着去找毛病,而不是找百度,Google或是发贴问人.
翻开出错的源码:[出错代码有提示,文件名是: /sources/inetutils-1.8/telnet/telnet.c:734:
打开文件: 源码目录/telnet/telnet.c 第734行:
733: #ifdef HAVE_LIBREADLINE
734: err = tgetent (termbuf, tname);
435: #endif
上面有个宏定义:HAVE_LIBREADLINE 很明确嘛,libreadline,问题就可能出在readline上面,于是我翻开这个软件的编译记录,就有了这个插曲.
不过更正了新的readline后,在后面,问题又依旧了,再仔细查看源文件:
#ifdef HAVE_LIBREADLINE
#include
#endif
好,再找/usr/include/term.h,不是"undefined reference to `tgetent'"吗?查找函数tgettent()的定义:
#if !defined(NCURSES_TERMCAP_H_incl)
...
extern NCURSES_EXPORT(int) tgetent (char *, const char *);
...
#endif
毫无疑问,是ncurses的问题了,因为安装的是宽字符版本的库,而上面 "make SHLIB_LIBS=-lncurses"是链接到非宽字符库,正确的应该是-lncursesw 才对. 但是,curses有四种版本,curses,cursesw ncurses,ncursesw,带w的是新版本,很多程序不认识新版本,依旧会在你不知情的情况下链接到老版本,导致程序编译出错,安装ncurses时,没有做兼容处理,而产生了一些不知情的错误.外国人的东西,要支持中文,很吭爹!
----------------------------
--- Bash-4.2 ---
打个补丁[可选]:
- patch -Np1 -i ../bash-4.2-fixes-3.patch
编译:
- ./configure --prefix=/usr --bindir=/bin \
- --htmldir=/usr/share/doc/bash-4.2 --without-bash-malloc \
- --with-installed-readline
- make && make install DESTDIR=/pkg/bash-4.2-x86_64
- make install
----新的bash产生了,现在用新的Bash登陆---
- exec /bin/bash --login +h
注:如果本次未完成所有的编译,下次进入chroot时,要指定/bin/bash而不是tools/bin/bash
---------------------------------------
--- libtool-2.4.2 ---
- PKGDIR=/pkg/libtool-2.4.2
- [32bit]:
- CC="gcc -m32" ./configure --prefix=/usr
- make
- make install DESTDIR=$PKGDIR-i686
- [64bit]:
- ./configure --prefix=/usr --libdir=/usr/lib64
- make && make install DESTDIR=$PKGDIR-x86_64
- mv -v $PKGDIR-i686/usr/bin/libtool{,-32}
- mv -v $PKGDIR-x86_64/usr/bin/libtool{,-64}
- ln -vs multiarch_wrapper $PKGDIR-x86_64/usr/bin/libtool
- cp -av $PKGDIR-i686/* /
- cp --remove-destination -av $PKGDIR-x86_64/* /
--- GDBM-1.9.1 ---
- 32-lib:
- CC="gcc -m32" CXX="g++ -m32" ./configure --prefix=/usr --enable-libgdbm-compat
- make && make install DESTDIR=/pkg/gdbm-1.9.1-i686
- make install
- 64-prog:
- ./configure --prefix=/usr --libdir=/usr/lib64 --enable-libgdbm-compat
- make && make install DESTDIR=/pkg/gdbm-1.9.1-x86_64
- make install
------------ inetutil-1.8-x86_64 ----------------
- PKGDIR=/pkg/inetutil-1.8-x86_64
- ./configure --prefix=/usr --libexecdir=/usr/sbin \
- --localstatedir=/var --sysconfdir=/etc
- make && make install DESTDIR=$PKGDIR
- make -C doc html
- make -C doc install-html docdir=/usr/share/doc/inetutils-1.8 DESTDIR=$PKGDIR
这几个程序移到根分区:
- mkdir -v $PKGDIR/{bin,sbin}
- mv -v $PKGDIR/usr/bin/{hostname,ping,ping6} $PKGDIR/bin
- mv -v $PKGDIR/usr/bin/traceroute $PKGDIR/sbin
- cp --remove-destination -av $PKGDIR/* /
----------- perl-5.14.2 ------------
必要的设置:
- echo "127.0.0.1 localhost $(hostname)" > /etc/hosts
- PKGDIR=/pkg/perl-5.14.2
32位库的安装:
设置:让perl链接到已安装的共享库zlib,不要让他自已编译一个内部的zlib.
- sed -i -e "s|BUILD_ZLIB\s*= True|BUILD_ZLIB = False|" \
- -e "s|INCLUDE\s*= ./zlib-src|INCLUDE = /usr/include|" \
- -e "s|LIB\s*= ./zlib-src|LIB = /usr/lib|" \
- cpan/Compress-Raw-Zlib/config.in
采用perl的自动配置和最基础的必要的设置:
- sh Configure -des -Dprefix=/usr \
- -Dvendorprefix=/usr \
- -Dman1dir=/usr/share/man/man1 \
- -Dman3dir=/usr/share/man/man3 \
- -Dpager="/usr/bin/less -isR" \
- -Duseshrplib \
- -Dcc="gcc -m32" \
- -Dmyhostname=localhost \
- -Dperladmin=root@localhost \
- -Darchname=i686-linux-thread-multi \
- -Dcf_by=Jiabao, Workroom.
解释:
-Dvendorprefix=/usr
该参数确保 perl 知道怎样告诉其他软件包它们的perl模块安装在哪。
-Dpager="/usr/bin/less -isR"
纠正 perldoc 代码调用 less 程序时的一个错误。
-Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3
因为高尔夫(Groff) 还没有安装, Configure 会认为我们不想安装 Perl 的 man 手册。 应用这个参数来改变这种情况。
- make
- make install DESTDIR=$PKGDIR-i686
64位程序:
设置perl链接到zlib的共享库:
- sed -i -e "s|BUILD_ZLIB\s*= True|BUILD_ZLIB = False|" \
- -e "s|INCLUDE\s*= ./zlib-src|INCLUDE = /usr/include|" \
- -e "s|LIB\s*= ./zlib-src|LIB = /usr/lib64|" \
- cpan/Compress-Raw-Zlib/config.in
修改libc的库的位置:
- sed -i "/libc/s@/lib@/lib64@" hints/linux.sh
修改安装的库目录[配合-Dinstallstyle="lib64/perl5"才有效]:
- sed -i '/*lib\/perl5*/s@lib/@lib64/@g' Configure
编译:
- sh Configure -des -Dprefix=/usr \
- -Dvendorprefix=/usr \
- -Dman1dir=/usr/share/man/man1 \
- -Dman3dir=/usr/share/man/man3 \
- -Dpager="/usr/bin/less -isR" \
- -Duseshrplib \
- -Dcc="gcc -m64" \
- -Dlibpth="/usr/local/lib64 /lib64 /usr/lib64" \
- -Dinstallstyle="lib64/perl5" \
- -Dmyhostname=localhost \
- -Dperladmin=root@localhost \
- -Darchname=x86_64-linux-thread-multi \
- -Dcf_by=Jiabao, Workroom.
- make && make install DESTDIR=$PKGDIR-x86_64
创建arch选择器:
- mv -v $PKGDIR-i686/usr/bin/perl{,-32}
- mv -v $PKGDIR-i686/usr/bin/perl5.14.2{,-32}
- mv -v $PKGDIR-x86_64/usr/bin/perl{,-64}
- mv -v $PKGDIR-x86_64/usr/bin/perl5.14.2{,-64}
- ln -sv multiarch_wrapper $PKGDIR-x86_64/usr/bin/perl
- ln -sv multiarch_wrapper $PKGDIR-x86_64/usr/bin/perl5.14.2
安装:
- cp -av $PKGDIR-i686/* /
- cp --remove-destination -av $PKGDIR-x86_64/* /
附:
--这里有个更全面设置,供你参考-----------
- -des
- -Doptimize=-O2 -g -pipe -Wall -Wp,
- -D_FORTIFY_SOURCE=2
- -fexceptions -fstack-protector --param=ssp-buffer-size=4
- -m64 -mtune=generic -Dccdlflags=-Wl,--enable-new-dtags
- -DDEBUGGING=-g
- -Dversion=5.12.4
- -Dmyhostname=localhost
- -Dperladmin=root@localhost -Dcc=gcc
- -Dprefix=/usr
- -Dvendorprefix=/usr
- -Dsiteprefix=/usr/local
- -Dsitelib=/usr/local/share/perl5
- -Dsitearch=/usr/local/lib64/perl5
- -Dprivlib=/usr/share/perl5
- -Dvendorlib=/usr/share/perl5/vendor_perl
- -Darchlib=/usr/lib64/perl5
- -Dvendorarch=/usr/lib64/perl5/vendor_perl
- -Darchname=x86_64-linux-thread-multi
- -Dlibpth=/usr/local/lib64 /lib64 /usr/lib64
- -Duseshrplib -Dusethreads -Duseithreads
- -Dusedtrace=/usr/bin/dtrace -Duselargefiles
- -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm
- -Duseperlio -Dinstallusrbinperl=n -Ubincompat5005 -Uversiononly
- -Dpager=/usr/bin/less -isr
- -Dd_gethostent_r_proto -Ud_endhostent_r_proto
- -Ud_sethostent_r_proto -Ud_endprotoent_r_proto
- -Ud_setprotoent_r_proto -Ud_endservent_r_proto
- -Ud_setservent_r_proto -Dscriptdir=/usr/bin
---autoconf-2.68---
- ./configure --prefix=/usr
- make && make install DESTDIR=/pkg/autoconf-2.68-x86_64
- make install
---automake-1.11.1---
- ./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.11.1
- make && make install DESTDIR=/pkg/automake-1.11.1-x86_64
- make install
---diffutils-3.2---
- ./configure --prefix=/usr
- make && make install DESTDIR=/pkg/diffutils-3.2-x86_64
- make install
---gawk-4.0.0---
- PKGDIR=/pkg/gawk-4.0.0-x86_64
- ./configure --prefix=/usr --libexecdir=/usr/lib64
- make && make install DESTDIR=$PKGDIR
- mkdir -pv $PKGDIR/usr/share/doc/gawk-4.0.0
- cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} \
- $PKGDIR/usr/share/doc/gawk-4.0.0
- cp --remove-destination -av $PKGDIR/* /
---findutils-4.4.2---
- PKGDIR=/pkg/findutils-4.4.2-x86_64
- ./configure --prefix=/usr --libexecdir=/usr/lib64/findutils
- make && make install DESTDIR=$PKGDIR
- mkdir -v $PKGDIR/bin
- mv -v $PKGDIR/usr/bin/find $PKGDIR/bin
- sed -i 's/find:=${BINDIR}/find:=\/bin/' $PKGDIR/usr/bin/updatedb
- cp -av $PKGDIR/* /
---flex-2.5.35---
- PKGDIR=/pkg/flex-2.5.35
- patch -Np1 -i ../patches/flex-2.5.35-gcc44-1.patch
这个补丁就是把源文件目录里的这个文件: ./flex-2.5.35/skel.c 添加一个头文件:
以避免使用gcc-4.4.3以上版本时c++编译错误.
32位库:
- CC="gcc -m32" ./configure \
- --prefix=/usr \
- --infodir=/usr/share/info \
- --mandir=/usr/share/man
- make libfl.a
- make install-libLIBRARIES DESTDIR=$PKGDIR-i686
跟{n,}curses一样,让libfl来替代旧的libl库:
- ln -sv libfl.a $PKGDIR-i686/usr/lib/libl.a
64位:
- patch -Np1 -i ../patches/flex-2.5.35-gcc44-1.patch
- ./configure --prefix=/usr \
- --libdir=/usr/lib64 \
- --infodir=/usr/share/info \
- --mandir=/usr/share/man
- make && make install DESTDIR=$PKGDIR-x86_64
替代旧版本库:
- ln -sv libfl.a $PKGDIR-x86_64/usr/lib64/libl.a
替代旧版本lex程序:
- cat > $PKGDIR-x86_64/usr/bin/lex << "EOF"
- #!/bin/sh
- # Begin /usr/bin/lex
- exec /usr/bin/flex -l "$@"
- # End /usr/bin/lex
- EOF
- chmod -v 755 $PKGDIR-x86_64/usr/bin/lex
添加文档:
- mkdir -pv $PKGDIR-x86_64/usr/share/doc/flex-2.5.35
- cp -v doc/flex.pdf \
- $PKGDIR-x86_64/usr/share/doc/flex-2.5.35
安装:
- cp -av $PKGDIR-i686/* /
- cp --remove-destination -av $PKGDIR-x86_64/* /
--- gettext-0.18.1.1 ---
- 32-bit:
- CC="gcc -m32" CXX="g++ -m32" \
- ./configure --prefix=/usr \
- --docdir=/usr/share/doc/gettext-0.18.1.1
- make && make install DESTDIR=/pkg/gettext-0.18.11-i686
- make install
- 64-bit:
- ./configure --prefix=/usr --libdir=/usr/lib64 \
- --docdir=/usr/share/doc/gettext-0.18.1.1
- make && make install DESTDIR=/pkg/gettext-0.18.11-x86_64
- make install
--- groff-1.21 ---
- PKGDIR=/pkg/groff-1.21-x86_64
- PAGE=A4 ./configure --prefix=/usr --libdir=/usr/lib64
注:
你以后可以通过将“A3” 或 “letter”写入到/etc/papersize文件来更改默认值
- make && make install DESTDIR=$PKGDIR
- ln -sv soelim $PKGDIR/usr/bin/zsoelim
- ln -sv eqn $PKGDIR/usr/bin/geqn
- ln -sv tbl $PKGDIR/usr/bin/gtbl
- cp -av $PKGDIR/* /
--- grub-1.99 [GRUB2]----
- ./configure --prefix=/usr \
- --build=$OSBUILD \
- --sysconfdir=/etc \
- --libdir=/usr/lib64 \
- --disable-werror \
- --disable-efiemu \
- --disable-grub-emu-usb
- make && make install DESTDIR=/pkg/grub-1.99-x86_64
- make install
注:
##--disable-grub-emu-usb取消枚举usb,看情况自已定
需要安装扩展的请看:
*******************************************************
GRUB2 will be compiled with following components:
Platform: i386-pc
With devmapper support: No (need libdevmapper header)
With memory debugging: No
efiemu runtime: No (explicitly disabled)
grub-mkfont: No (need freetype2 library)
*******************************************************
--- Gzip-1.4 ---
- PKGDIR=/pkg/gzip-1.4-x86_64
- ./configure --prefix=/usr --bindir=/bin
- make && make install DESTDIR=$PKGDIR
移动一些不必位于root文件系统的程序:
- mkdir -v $PKGDIR/usr/bin
- mv -v $PKGDIR/bin/{gzexe,uncompress,zcmp,zdiff,zegrep} $PKGDIR/usr/bin
- mv -v $PKGDIR/bin/{zfgrep,zforce,zgrep,zless,zmore,znew} $PKGDIR/usr/bin
安装:
--- iproute2-2.6.39 ----
- PKGDIR=/pkg/iproute2-2.6.39-x86_64
- sed -i '/^TARGETS/s@arpd@@g' misc/Makefile
注:
设置目标不安装arpd程序,他依赖于berkeleyDB库,berkeleyDB有free的,也有商业版的,是一般linux用户少用的程序,
况且为了生成一个/usr/bin/arpd,不得不安装berkeleyDB,还要安装更多的依赖,暂不安装.在文末有介绍安装方法.
制作包的方法:
- make DESTDIR=$PKGDIR LIBDIR=/usr/lib64 \
- VARLIB=/var/lib64 SBINDIR=/sbin \
- ARPDDIR=/var/lib64/arpd
-
make install DESTDIR=$PKGDIR LIBDIR=/usr/lib64 \
VARLIB=/var/lib64 SBINDIR=/sbin \
ARPDDIR=/var/lib64/arpd \
MANDIR=/usr/share/man \
DOCDIR=/usr/share/doc/iproute2-2.6.39
安装:
--- kbd-1.15.2 ---
- PKGDIR=/pkg/kbd-1.15.2-x86_64
- ./configure --prefix=/usr --datadir=/lib64/kbd
- make && make install DESTDIR=$PKGDIR
将重要的程序放在根分区下:
- mkdir -v $PKGDIR/bin
- mv -v $PKGDIR/usr/bin/{kbd_mode,loadkeys,openvt,setfont} $PKGDIR/bin
添加文档、安装:
- mkdir -pv $PKGDIR/usr/share/doc/kbd-1.15.2
- cp -R -v doc/* \
- $PKGDIR/usr/share/doc/kbd-1.15.2
- cp -av $PKGDIR/* /
注:
Backspace键和Delete键在不同的kbd包中有些争议,下面的patch修正了i386的键盘映射的一个问题:
patch -Np1 -i ../kbd-1.15.2-backspace-1.patch
打完 patch 之后,Backspace 键会产生字符编码 127,Delete 键会产生一个著名的逃脱序列。
----- Less-444 ----------
- ./configure --prefix=/usr --sysconfdir=/etc
- make && make install DESTDIR=/pkg/less-444-x86_64
- make install
--- libpipeline-1.2.0 ----
- PKGDIR=/pkg/libpipeline-1.2.0
- 32-libs:
- CC="gcc -m32" ./configure --prefix=/usr
- make && make install DESTDIR=$PKGDIR-i686
- make install
- 64-bit:
- ./configure --prefix=/usr --libdir=/usr/lib64
- make && make install DESTDIR=$PKGDIR-x86_64
- make install
--- make-3.82 ---
- ./configure --prefix=/usr --build=$OSBUILD
- make && make install DESTDIR=/pkg/make-3.82-x86_64
- make install
--- xz-5.0.3 ---
- 32-libs:
- CC="gcc -m32" ./configure --prefix=/usr \
- --docdir=/usr/share/doc/xz-5.0.3
- make && make install DESTDIR=/pkg/xz-5.0.3-i686
- make install
-
- 64-bit:
- ./configure --prefix=/usr --libdir=/usr/lib64 \
- --docdir=/usr/share/doc/xz-5.0.3
- make && make install DESTDIR=/pkg/xz-5.0.3-x86_64
- make install
--- man-db-2.6.0.2 ---
- ./configure --prefix=/usr --libexecdir=/usr/lib64 \
- --libdir=/usr/lib64 --sysconfdir=/etc \
- --docdir=/usr/share/doc/man-db-2.6.0.2 \
- --disable-setuid --with-browser=/usr/bin/lynx \
- --with-vgrind=/usr/bin/vgrind --with-grap=/usr/bin/grap
- make && make install DESTDIR=/pkg/man-db-2.6.0.2-x86_64
- make install
------- module-init-tools-3.15 ---------
目前为止,官方放出的最新版本是3.15版。
很多人在安装这个时,遇到很多麻烦,主要是为了安装他的手册(man)出错.
安装手册文件:[参见底下的注解]
- tar -xvf ../module-init-tools-3.15-man-jiabao.tar.bz2
- mv -v module-init-tools-3.15-man-jiabao build
下面的设置可以不安装手册:
- cp -v Makefile.in{,.orig}
- sed -e "/MAN5 =/,/bin.5/d" -e "/MAN8 = /i\MAN5 =" -e "/MAN8 =/c\MAN8 =" \
- Makefile.in.orig > Makefile.in
修正一个脚本和配置文件的路径为/lib64:
- sed -i '/\/lib\/modules/s|/lib/modules|/lib64/modules|g' stress_modules.sh
- sed -i '/\/lib\/modules/s|/lib/modules|/lib64/modules|g' generate-modprobe.conf
测试一下:
- DOCBOOKTOMAN=/bin/true ./configure
- make check
- sed -i -e 's@../../configure@DOCBOOKTOMAN=/bin/true &@' tests/runtests
- ./tests/runtests
- make clean
编译,安装: [--with-moddir=/lib64/modules是必须的]
- ./configure --prefix=/ \
- --enable-zlib-dynamic \
- --mandir=/usr/share/man \
- --with-moddir=/lib64/modules \
- --build=$OSBUILD
- make
- make INSTALL=install DESTDIR=/pkg/module-init-tools-3.15-x86_64 install
安装:
- make INSTALL=install install
### 关于man-jiabao ###
安装man文件,需要docbook2man的支持,需要更多的软件依赖包并安装:
SGML Common-0.6.3
DocBook SGML DTD-3.1
DocBook SGML DTD-4.5
OpenSP-1.5.2
OpenJade-1.3.2
DocBook DSSSL Stylesheets-1.79
DocBook-utils-0.6.14
sgmltools-lite-3.0.3
gcc-3.3.6
这些信赖包有些不能在gcc-4.x下正确编译,因此需要安装gcc-3.3.6
对于他们的具体安装方式,可以再来一篇文章了,因此我把编译过的man文件做了个包。
### ### ###
--- patch-2.6.1 ---
- ./configure --prefix=/usr
- make && make install DESTDIR=/pkg/patch-2.6.1-x86_64
- make install
--- psmisc-22.14 ---
- ./configure --prefix=/usr
- make && make install DESTDIR=/pkg/psmisc-22.14-x86_64
- make install
---- shadow-4.1.4.3-x86_64 ----
- PKGDIR=/pkg/shadow-4.1.4.3-x86_64
下面的命令禁止安装 groups 程序和它的手册页,因为之前的 Coreutils 提供了一个更好的版本。coreutils是gnu官方维护的。shadow是Debian官方维护的,似乎已成为各种发行版本必备品!
- sed -i 's/groups$(EXEEXT) //' src/Makefile.in
- find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \;
**************
如果是低于本文的版本,要禁止安装中文和韩文手册页,因为Man-DB 不能很好的格式化它们,编译安装会终止.
- sed -i -e 's/ ko//' -e 's/ zh_CN zh_TW//' man/Makefile.in
**************
修正一个安装俄文手册的错误:
- sed -i 's/man_MANS = $(man_nopam) /man_MANS = /' man/ru/Makefile.in
修改使用md5加密方法:[默认是crypt]
- sed -i 's@#ENCRYPT_METHOD DES@ENCRYPT_METHOD MD5@' etc/login.defs
如果想启用 Cracklib 支持[需要提前安装cracklib]:
- sed -i 's@DICTPATH.*@DICTPATH\t/lib/cracklib/pw_dict@' \
- etc/login.defs
编译:
- ./configure --sysconfdir=/etc --libdir=/lib64
- make && make install DESTDIR=$PKGDIR
有个程序放错位置了:
- mv -v $PKGDIR/usr/bin/passwd $PKGDIR/bin
安装:
- cp --remove-destination -av $PKGDIR/* /
---安装后的可选配置:---
使用影子密码,运行以下指令:
使用组影子密码,运行:
如果你不想useradd 为新添加的用户建立mailbox 文件,请执行下面的命令:
- sed -i 's/yes/no/' /etc/default/useradd
设置root的密码:
---sysklogd-1.5-x86_64---
- PKGDIR=/pkg/sysklogd-1.5-x86_64
- mkdir -pv $PKGDIR/{sbin,etc,usr/share/man/man{5,8}}
- make && make prefix=$PKGDIR BINDIR=$PKGDIR/sbin install
- make BINDIR=/sbin install
配置:
- cat > $PKGDIR/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
安装:
- cp -av $PKGDIR/etc/* /etc
------sysvinit-2.88dsf----------------------
关闭系统时,终端上会提示一个信息:
Sending processes the TERM signal
把他改为下面的英文更为直观[当然你非常理解英文是啥意思]:
Sending processes configured via /etc/inittab the TERM signal
命令如下:
- sed -i 's@Sending processes@& configured via /etc/inittab@g' \
- src/init.c
安装后,这个程序:/usr/bin/wall,会覆盖之前util-linux提供的更好的版本,下面的命令可以禁掉:
- sed -i -e 's/utmpdump wall/utmpdump/' \
- -e 's/mountpoint.1 wall.1/mountpoint.1/' src/Makefile
编译安装:
- make -C src
- make -C src install
打包的方法:
- make -C src install ROOT=/pkg/sysvinit-2.88dsf-x86_64
--- tar-1.26 ---
- PKGDIR=/pkg/tar-1.26-x86_64
- FORCE_UNSAFE_CONFIGURE=1 ./configure --prefix=/usr \
- --bindir=/bin --libexecdir=/usr/sbin
说明:
FORCE_UNSAFE_CONFIGURE=1
使运行时,不测试mknod,因为他需要root权限,意味着:在安装后普通用户不能执行tar命令.
- make && make install DESTDIR=$PKGDIR
- make install
- make -C doc install-html docdir=$PKGDIR/usr/share/doc/tar-1.26
- make -C doc install-html docdir=/usr/share/doc/tar-1.26
--- texinfo-4.13 ---
- PKGDIR=/pkg/texinfo-4.13-x86_64
- ./configure --prefix=/usr
- make && make install DESTDIR=$PKGDIR
- make TEXMF=/usr/share/texmf install-tex DESTDIR=$PKGDIR
- cd $PKGDIR/usr/share/info
- rm -v dir
- for f in *
- do install-info $f dir 2>/dev/null
- done
- cd /sources
- cp -av $PKGDIR/* /
------ udev-173 -----
32位:
解压用于测试的文件:
- tar -xvf ../udev-173-testfiles.tar.bz2 --strip-components=1
创建必要的空目录和结点:
- install -dv $PKGDIR-i686/lib/udev/devices/pts
- mknod -m0666 $PKGDIR-i686/lib/udev/devices/null c 1 3
安装32位全部程序,打包:
- GLIB_LIBS="-L/usr/lib -lglib-2.0" \
- GLIB_CFLAGS="-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include" \
- CC="gcc -m32" \
- ./configure --prefix=/usr \
- --sysconfdir=/etc --sbindir=/sbin \
- --libexecdir=/lib/udev \
- --with-rootlibdir=/lib \
- --disable-introspection \
- --disable-keymap --disable-hwdb
可选:--with-selinux
- make
- make check
- make install DESTDIR=$PKGDIR-i686
64位程序:
- tar -xvf ../udev-173-testfiles.tar.bz2 --strip-components=1
- install -dv $PKGDIR-x86_64/lib64/udev/devices/pts
- mknod -m0666 $PKGDIR-x86_64/lib64/udev/devices/null c 1 3
修正modules的查找目录在/lib64目录下:
- sed -i "s@/lib/modules@/lib64/modules@g" udev/udevd.c
在启动的时候会显示udev的版本,它占用2秒的时间,追求极速的朋友,下面的命令可以禁止:
- sed -i -e '/deprecated/d' udev/udevadm-trigger.c
编译安装:
- GLIB_LIBS="-L/usr/lib64 -lglib-2.0" \
- GLIB_CFLAGS="-I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include" \
- ./configure --prefix=/usr \
- --sysconfdir=/etc --sbindir=/sbin \
- --libexecdir=/lib64/udev --libdir=/usr/lib64 \
- --with-rootlibdir=/lib64 \
- --with-firmware-path=/lib64/firmware/updates:/lib64/firmware \
- --disable-introspection \
- --disable-keymap --disable-hwdb \
- --build=$OSBUILD
- make
- make check
- make install DESTDIR=$PKGDIR-x86_64
- cp --remove-destination -av $PKGDIR-i686/* /
- cp --remove-destination -av $PKGDIR-x86_64/* /
安装 udev-config,其实就是一个rulers文件:
保持当前目录不变:
- PKGDIR=/pkg/udev-lfs-cfg-x86_64
- tar -xvf ../udev-config-20100128.tar.bz2
- cd udev-config-20100128
- make install PREFIX=$PKGDIR/usr RULES_DIR=$PKGDIR/etc/udev/rules.d
- make install-doc PREFIX=$PKGDIR/usr
- make install
- make install-doc
--------vim73 ----------------
设置vimrc的目录:
- echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
编译安装:
- ./configure --prefix=/usr --enable-multibyte
- make && make install DESTDIR=$PKGDIR
创建一个兼容的vi:
- ln -sv vim $PKGDIR/usr/bin/vi
手册:
- for L in $PKGDIR/usr/share/man/{,*/}man1/vim.1; do
- ln -sv vim.1 $(dirname $L)/vi.1
- done
- mkdir -pv $PKGDIR/usr/share/doc
- ln -sv ../vim/vim73/doc $PKGDIR/usr/share/doc/vim-7.3
简单的配置一下vimrc:
- mkdir -pv $PKGDIR/etc
- 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
安装:
-----------------------------------分界线----------------------------------------
清理系统[去除不必要的调试信息,可节省200M左右的空间]:
退出chroot环境:
如果中途关过机,看看OSROOT变量还在不在:
重新换根,更改一些参数,不然无法清理正在使用中的文件。
- chroot $OSROOT /tools/bin/env -i \
- HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
- PATH=/bin:/usr/bin:/sbin:/usr/sbin \
- /tools/bin/bash --login
使用tools下的工具对目标系统进行清理:
- /tools/bin/find /{,usr/}{bin,lib,sbin} -type f \
- -exec /tools/bin/strip --strip-debug '{}' ';'
将所有PKG包压缩,压缩比很变态:
- cd /pkg
- for file in \
- $(find -type d -name "*-x86_64" -o -name "*-i686")
- do
- tar -cJvf $(echo $file | sed -n "s@./@@p"){.tar.xz,}
- rm -rf $file
- done
再次退出chroot环境:
-------完成基础系统---------
“人类已经无法阻止我们修改源代码了……"
从现在开始,基础系统已完成,/tools下的工具已经不再需要,你可以删除或者打包备份到其它地方;
以后进入chroot环境应该使用下面的脚本:
- cat > ~/chroot-jiabao.sh << "EOF"
- export OSROOT=/media/jiabao-linux
- chroot "$OSROOT" /usr/bin/env -i \
- HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
- PATH=/bin:/usr/bin:/sbin:/usr/sbin \
- OSBUILD=x86_64-jiabao-linux-gnu \
- /bin/bash --login
- EOF
修改枯燥的环境,为以后的编译添点颜色:
1.设置终端的显示颜色:
- LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:*.pdf=00;33:*.ps=00;33:*.ps.gz=00;33:*.txt=00;33:*.patch=00;33:*.diff=00;33:*.log=00;33:*.tex=00;33:*.xls=00;33:*.xlsx=00;33:*.ppt=00;33:*.pptx=00;33:*.rtf=00;33:*.doc=00;33:*.docx=00;33:*.odt=00;33:*.ods=00;33:*.odp=00;33:*.xml=00;33:*.epub=00;33:*.abw=00;33:*.html=00;33:*.wpd=00;33:"
- echo "export LS_COLORS=\"$LS_COLORS\"" >> /etc/profile
- sed -i "/alias ls=/d" /etc/profile
- echo "alias ls='ls --color=auto'" >> /etc/profile
2.设置为中文终端环境,在编译的时候还可以显示中文:
- echo "export LANG=zh_CN.UTF-8" >> /etc/profile
在没有安装dhcpd[自动获取IP地址]之前,先手动设置一下IP地址和DNS,以便可以使用网络
IP地址:
- cd /etc/sysconfig/
- cat > ifconfig.eth0 << "EOF"
- ONBOOT=yes
- IFACE=eth0
- SERVICE=ipv4-static
- ##如果使用路由器上网,默认为:#
- IP=192.168.1.100
- GATEWAY=192.168.1.1
- BROADCAST=255.255.255.0
- PREFIX=24
- #######
- EOF
DNS服务器:
- cat > /etc/resolv.conf << "EOF"
- domain domain
- search domain
- #这个是河南某市的DNS,不要效仿#
- nameserver 202.102.227.68
- nameserver 202.102.224.68
- EOF
设置host解析:
- cat > /etc/hosts << "EOF"
- 127.0.0.1 localhost.localdomain localhost
- ::1 localhost6.localdomain6 localhost6
- EOF
配置网络[主机名只针对服务器有效]:
- cat > /etc/sysconfig/network << "EOF"
- # Begin /etc/sysconfig/network
- NETWORKING=yes
- HOSTNAME=jiabao-pc
- # End /etc/sysconfig/network
- EOF
设置通用键盘:
- cat > /etc/sysconfig/keyboard << "EOF"
- KEYTABLE="us"
- MODEL="pc105+inet"
- LAYOUT="us"
- EOF
设置时钟:
- cat > /etc/sysconfig/clock << "EOF"
- # 纯终端环境下,区域设置定义在这个文件 /etc/localtime.
- # 如果安装了GNU界面,使用 system-config-date 可以自动配置本文件。
- ZONE="Asia/Shanghai"
- # 如果想设置UTC时间的话:
- # UTC=1
- EOF
设置终端[暂不需要]:
- cat > /etc/sysconfig/console << "EOF"
- # 如果想使用中文的话:
- # UNICODE="1"
- # FONT="字体名[必须点阵字体]"
- EOF
通用启动脚本[可选],采用LFS 2011年10月17号更新的:
lfs-bootscripts-20111017
注意用下面的命令,使scripts里的/lib改为/lib64,因为咱们用的是64位程序,而lfs用/lib做为默认值:
- find -type f -exec sed -i "s@/lib@/lib64@g" {} \;
- mv -v lfs/lib{,64}
安装,封包:
- make install
- make install DESTDIR=/pkg/boot-scripts-20111017-x86_64
配置内核的初始化启动级别脚本[inittab]
- cat > /etc/inittab << "EOF"
- # Begin /etc/inittab
- id:3:initdefault:
- si::sysinit:/etc/rc.d/init.d/rc S
- l0:0:wait:/etc/rc.d/init.d/rc 0
- l1:S1:wait:/etc/rc.d/init.d/rc 1
- l2:2:wait:/etc/rc.d/init.d/rc 2
- l3:3:wait:/etc/rc.d/init.d/rc 3
- l4:4:wait:/etc/rc.d/init.d/rc 4
- l5:5:wait:/etc/rc.d/init.d/rc 5
- l6:6:wait:/etc/rc.d/init.d/rc 6
- ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
- su:S016:once:/sbin/sulogin
- 1:2345:respawn:/sbin/agetty --noclear tty1 9600
- 2:2345:respawn:/sbin/agetty tty2 9600
- 3:2345:respawn:/sbin/agetty tty3 9600
- 4:2345:respawn:/sbin/agetty tty4 9600
- 5:2345:respawn:/sbin/agetty tty5 9600
- 6:2345:respawn:/sbin/agetty tty6 9600
- # End /etc/inittab
- EOF
注:这个脚本已经过时好几年了,通常是用他来配置启动级别的,现在多数发行版使用systemd来配置,在后面的章节我们再介绍systemd。
参见systemd的说明:
# inittab is no longer used when using systemd.
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
# Ctrl-Alt-Delete is handled by /etc/systemd/system/ctrl-alt-del.target
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
# To set a default target, run:
# ln -s /lib/systemd/system/.target /etc/systemd/system/default.target
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
配置键盘映射:[可有可无]
- cat > /etc/inputrc << EOF
- # do not bell on tab-completion
- #set bell-style none
- set meta-flag on
- set input-meta on
- set convert-meta off
- set output-meta on
- # Completed names which are symbolic links to
- # directories have a slash appended.
- set mark-symlinked-directories on
- EOF
配置启动时必要的挂载[fstab]:
- cat > /etc/fstab << EOF
- #UUID=48b6f294-ada1-4553-8468-9af4619d319d /boot ext4 defaults 1 1
- UUID=1c6baf90-0865-483a-96a9-b76aadcbbfda / btrfs defaults 1 1
- tmpfs /dev/shm tmpfs defaults 0 0
- devpts /dev/pts devpts gid=5,mode=620 0 0
- sysfs /sys sysfs defaults 0 0
- proc /proc proc defaults 0 0
- EOF
我的系统内存是8G,因此没有挂载swap分区,想要添加的话添加:
- /dev/sda15 swap swap defaults 0 0
##### 关于UUID:#########
使用UUID来代替/dev/sda{N},好处是我为了折腾,经常要调整其它分区,来回的增减分区,分区号经常会变,使用了UUID后,只要这个LINUX分区不改变的情况,分区ID就不会变。查看UUID的方法如下:
查看分区号和卷标的命令:
- ls -al /dev/disk/by-label
WIN7 -> ../../sda1
WIN2K3 -> ../../sda5
WIN_SOFT -> ../../sda6
_Fedora-16-x86_6 -> ../../sda9
Mac OS X -> ../../sda10
jiabao-linux -> ../../sda12
查看分区号和UUID的命令:
1c6baf90-0865-483a-96a9-b76aadcbbfda -> ../../sda12
1b8b068b-bcb1-4185-9885-70dfaa67c9c2 -> ../../sda8
###关于/boot######
如果你做了多系统,以及btrfs为根的linux,不希望把grub2安装在mbr上,必须把grub2的state文件安装在非btrfs分区上,因为只有grub2才能正确识别btrfs分区。很方便的做法就是,新分出一个ext4分区做为/boot,然后可以通过grub4dos来引导grub2。当然,最省事的做法就是把grub2安装在MBR上。有时间可以为新手们做一个专题。
--------------------------------------------------------------------------------
##### 编译linux-3.2-rc1 #####
设置安装的变量:
- VER=3.2.0-rc1-jiabao-x86_64
- PKGDIR=/pkg/kernel-$VER
- DEVDIR=/usr/src/kernels/$VER
- unset LANG
- mkdir -pv $DEVDIR
关于$DEVDIR:
因为在以后我们的glibc头文件/usr/include以后就不可以修改了,以后在升级kernel时,有些程序在编译时必须依赖现实使用的新kernel头文件,因此需要这个文件夹,以便程序使用最新内核的特性!。
因为我们需要绝对干净的32位库/lib,里面不充许放置任何64位文件,做以下修改:
1. 使库目录和modules安装在/lib64下面:
- sed -i 's@)/lib/@)/lib64/@g' Makefile
2. 修改一些辅助的脚本改/lib为/lib64:
- find {tools/,scripts/} -type f -name "*" \
- -exec sed -i '/[^g]\/lib\/modules/s|/lib/modules|/lib64/modules|g' {} \;
保持源码目录干净性:
复制发行版的配置文件:
- cp ../config-3.1.0-7.fc16.x86_64 $DEVDIR/.config
主分区是btrfs,必须添加内核级的btrfs支持,用make oldconfig无法修改,
用一个Sed命令来完成:
- sed -i -e "/BTRFS_FS[^_]/c\CONFIG_BTRFS_FS=y" \
- -e "/BTRFS_FS_POSIX_ACL/c\CONFIG_BTRFS_FS_POSIX_ACL=y" \
- $DEVDIR/.config
保留旧功能,提示新功能的方法来配置:
[如果不确定的话,全部回车使用kernel官方推荐的,在后面还可以重新“增量编译”,快速的添加或删除某个功能,基本不消耗时间]
########## 注意: ###############
如果你用的是USB的鼠标,在纯终端下会永无休止的显示鼠标的信息,解决方法:
修改三个文件:
- cp -v drivers/usb/core/hub.c{,.orgi}
- sed -e '/#include "usb.h"/a\\n#undef DEBUG\n#undef CONFIG_USB_ANNOUNCE_NEW_DEVICES\n' \
- -e "/USB disconnect, device number/,/;/s|^.*$|/*jiabao-marked:&\t*/|" \
- -e "/if (udev->speed != USB_SPEED_SUPER)/,/;/s|^.*$|/*jiabao-marked:&\t*/|" \
- drivers/usb/core/hub.c.orgi > drivers/usb/core/hub.c
- cp -v drivers/input/input.c{,.orgi}
- sed '/pr_info("%s as %s/,/;/s|^.*$|/*jiabao-marked:&\t*/|' \
- drivers/input/input.c.orgi > drivers/input/input.c
- cp -v drivers/hid/hid-core.c{,.orgi}
- sed '/hid_info(hdev, "%s: %s HID/,/;/s|^.*$|/*jiabao-marked:&\t*/|' \
- drivers/hid/hid-core.c.orgi > drivers/hid/hid-core.c
################################################################
编译:
安装:
- make O=$DEVDIR INSTALL_MOD_STRIP=1 modules_install
- cp -v $DEVDIR/arch/x86/boot/bzImage /boot/vmlinuz-$VER
- cp -v $DEVDIR/System.map /boot/System.map-$VER
- cp -v $DEVDIR/.config /boot/config-$VER
- install -d /usr/share/doc/linux-$VER
- cp -r Documentation/* /usr/share/doc/linux-$VER
制作包:
打包modules:[可选]
- make O=$DEVDIR INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=$PKGDIR modules_install
文档,以及内核文件:
- mkdir -pv $PKGDIR/{boot,usr/share/doc/linux-$VER}
- cp -v $DEVDIR/arch/x86/boot/bzImage $PKGDIR/boot/vmlinuz-$VER
- cp -v $DEVDIR/System.map $PKGDIR/boot/System.map-$VER
- cp -v $DEVDIR/.config $PKGDIR/boot/config-$VER
- install -d $PKGDIR/usr/share/doc/linux-$VER
- cp -r Documentation/* $PKGDIR/usr/share/doc/linux-$VER
配置Linux模块装载顺序:
创建/etc/modprobe.d/usb.conf文件,使ehci_hcd 必须在ohci_hcd和uhci_hcd之前装载:
- install -v -m755 -d /etc/modprobe.d
- cat > /etc/modprobe.d/usb.conf << "EOF"
- # Begin /etc/modprobe.d/usb.conf
- install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true
- install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true
- # End /etc/modprobe.d/usb.conf
- EOF
安装GRUB2:
/dev/sda12便是安装GRUB所在的分区
- ln -vs /dev/sda12 /dev/root
- grub-install /dev/sda12
- grub-mkconfig -o /boot/grub2/grub/grub.cfg
---独立的/boot分区---
如果你想为目标linux使用单独的/boot分区,必须把boot文件复制到那个分区上,你应该用现有的可用的方法,分割出一个新分区,假设是/dev/sda18:
格式化:
- mkfs.ext4 -L "boot-jiabao" /dev/sda18
挂载,复制文件:
- $ROOTDIR=/mnt/root
- mkdir $ROOTDIR
- mount -t ext4 /dev/sda18 $ROOTDIR
- cp -av /boot $ROOTDIR/
- mv -v /boot{,-bak}
在/etc/fstab里面必须指定这一行:
- /dev/sda18 /boot ext4 defaults 1 1
安装grub2到这个分区:
- ln -svf /dev/sda18 /dev/root
- grub-install /dev/sda18
从grub4dos引导这个新分区的grub2:
假设你已安装了grub4dos,只添加一项:
- title jiabao-linux
- find --set-root /grub/core.img
- kernel /grub/core.img
基础系统已完成,但他只是一个完整的纯终端环境。所有以后我们需要安装的软件,都基于此环境。下一步我们可以正式的选择我们需要的软件了,包括xorg,GUI桌面,声卡显示,多媒体库等等……
---未完待续---