17.构建LFS系统──安装系统基础软件(九)
时间:2006-11-17 来源:anima
十七、构建LFS系统──安装系统基础软件(九)
51.Sysklogd-1.4.1
Sysklogd 包含记录系统日志信息的程序,比如内核处理意外事务的日志。
预计编译时间: 少于 0.1 SBU
所需磁盘空间: 0.6 MB
安装Sysklogd
root:/sources/shadow-4.0.15# tar -zxvf $LFS/sources/sysklogd-1.4.1.tar.gz -C $LFS/sources
root:/sources/shadow-4.0.15# cd $LFS/sources/sysklogd-1.4.1
下面的补丁修正了许多问题,包括在2.6系列的内核上编译 Sysklogd 会遇到的问题:
root:/sources/sysklogd-1.4.1# patch -Np1 -i ../sysklogd-1.4.1-fixes-1.patch
下面的patch使 sysklogd 逐字的对待日志信息中0x80—0x9f段的字符,而不是采用八进制进行替换。未打patch的sysklogd在UTF-8编码下会损害日志信息:
root:/sources/sysklogd-1.4.1# patch -Np1 -i ../sysklogd-1.4.1-8bit-1.patch
patching file syslogd.c
Hunk #1 succeeded at 1496 (offset 47 lines).
root:/sources/sysklogd-1.4.1#
编译软件包:
root:/sources/sysklogd-1.4.1# make
gcc -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce -DSYSLOG_INET -DSYSLOG_UNIXAF -DNO_SCCS -DFSSTND -DSYSLOGD_PIDNAME=\"syslogd.pid\" -c syslogd.cgcc -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce -c pidfile.c
gcc -s -o syslogd syslogd.o pidfile.o
gcc -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce -DFSSTND -c klogd.c
gcc -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce -DALLOW_KERNEL_LOGGING -c syslog.c
gcc -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce -DFSSTND -c ksym.c
gcc -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce -DFSSTND -c ksym_mod.c
gcc -s -o klogd klogd.o syslog.o pidfile.o ksym.o \
ksym_mod.o
root:/sources/sysklogd-1.4.1#
这个软件包没有附带测试程序。
安装软件包:
root:/sources/sysklogd-1.4.1# make install
/usr/bin/install -o root -g root -m 644 sysklogd.8 /usr/share/man/man8/sysklogd.8
/usr/bin/install -o root -g root -m 644 syslogd.8 /usr/share/man/man8/syslogd.8
/usr/bin/install -o root -g root -m 644 syslog.conf.5 /usr/share/man/man5/syslog.conf.5
/usr/bin/install -o root -g root -m 644 klogd.8 /usr/share/man/man8/klogd.8
/usr/bin/install -m 500 -s syslogd /usr/sbin/syslogd
/usr/bin/install -m 500 -s klogd /usr/sbin/klogd
root:/sources/sysklogd-1.4.1#
配置Sysklogd
创建一个新的 /etc/syslog.conf 文件:
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
root:/sources/sysklogd-1.4.1# 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
root:/sources/sysklogd-1.4.1#
Sysklogd 的内容
安装的程序: klogd, syslogd
简要描述
klogd |
一个系统守护进程,截获并且记录下 LINUX 内核日志信息。 |
syslogd |
记录下系统里所有提供日志记录的程序给出的日志和信息内容。每一个被记录的消息至少包含时间戳和主机名(通常还包括程序名)。 |
52.Sysvinit-2.86
Sysvinit 软件包包含一些控制系统启动、运行、关闭的程序。
预计编译时间: 少于 0.1 SBU
所需磁盘空间: 1 MB
安装Sysvinit
root:/sources/sysklogd-1.4.1# tar -zxvf $LFS/sources/sysvinit-2.86.tar.gz -C $LFS/sources
root:/sources/sysklogd-1.4.1# cd $LFS/sources/sysvinit-2.86
当运行级别被改变(比如,正在关闭系统),init 向那些由 init 自身开启的,并且将不会在新的运行级别里运行的线程发送终端信号。当 init 做上面这些事情时,会输出像"Sending processes the TERM signal"这样的信息,这看起来就像它正在向那些系统正在运行的程序发送上面这些信息一样。要避免错误地理解这个信息,可以修改源码以便可以代替为读起来像"Sending processes started by init the TERM signal"的信息,可以用下面命令:
root:/sources/sysvinit-2.86# sed -i 's@Sending processes@& started by init@g' \
> src/init.c
编译软件包:
root:/sources/sysvinit-2.86# make -C src
make: Entering directory `/sources/sysvinit-2.86/src'
gcc -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE -c -o mountpoint.o mountpoint.c
gcc -s -o mountpoint mountpoint.o
gcc -c -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE init.c
init.c: In function 're_exec':
init.c:1887: warning: missing sentinel in function call
gcc -c -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE -DINIT_MAIN utmp.c -o init_utmp.o
gcc -s -o init init.o init_utmp.o
gcc -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE -c -o halt.o halt.c
gcc -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE -c -o ifdown.o ifdown.c
gcc -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE -c -o hddown.o hddown.c
gcc -c -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE utmp.c
gcc -s -o halt halt.o ifdown.o hddown.o utmp.o
gcc -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE -c -o dowall.o dowall.c
gcc -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE -c -o shutdown.o shutdown.c
gcc -s -o shutdown dowall.o shutdown.o utmp.o
gcc -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE -c -o runlevel.o runlevel.c
gcc -s -o runlevel runlevel.o
gcc -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE -s killall5.c -o killall5
gcc -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE -c -o sulogin.o sulogin.c
gcc -s -o sulogin sulogin.o -lcrypt
gcc -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE -c -o bootlogd.o bootlogd.c
bootlogd.c: In function 'main':
bootlogd.c:612: warning: pointer targets in passing argument 2 of 'writelog' differ in signedness
gcc -s -o bootlogd bootlogd.o -lutil
gcc -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE -c -o last.o last.c
gcc -s -o last last.o
gcc -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE -c -o mesg.o mesg.c
gcc -s -o mesg mesg.o
gcc -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE -c -o utmpdump.o utmpdump.c
gcc -s -o utmpdump utmpdump.o
gcc -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE -c -o wall.o wall.c
gcc -s -o wall dowall.o wall.o
make: Leaving directory `/sources/sysvinit-2.86/src'
root:/sources/sysvinit-2.86#
这个软件包没有附带测试程序。
安装软件包:
root:/sources/sysvinit-2.86# make -C src install
make: Entering directory `/sources/sysvinit-2.86/src'
for i in mountpoint; do \
install -o root -g root -m 755 $i /bin/; \
done
for i in init halt shutdown runlevel killall5 sulogin bootlogd; do \
install -o root -g root -m 755 $i /sbin/; \
done
for i in last mesg utmpdump wall; do \
install -o root -g root -m 755 $i /usr/bin/; \
done
# install -o root -g root -m 755 etc/initscript.sample /etc/
ln -sf halt /sbin/reboot
ln -sf halt /sbin/poweroff
ln -sf init /sbin/telinit
ln -sf ../sbin/killall5 /bin/pidof
if [ ! -f /usr/bin/lastb ]; then \
ln -sf last /usr/bin/lastb; \
fi
install -o root -g root -m 644 initreq.h /usr/include/
for i in last.1 lastb.1 mesg.1 mountpoint.1 wall.1; do \
install -o root -g root -m 644 ../man/$i /usr/share/man/man1/; \ done
for i in initscript.5 inittab.5; do \
install -o root -g root -m 644 ../man/$i /usr/share/man/man5/; \ done
for i in halt.8 init.8 killall5.8 pidof.8 poweroff.8 reboot.8 runlevel.8 shutdown.8 telinit.8 sulogin.8 bootlogd.8; do \
install -o root -g root -m 644 ../man/$i /usr/share/man/man8/; \ done
#
# This part is skipped on Debian systems, the
# debian.preinst script takes care of it.
make: Leaving directory `/sources/sysvinit-2.86/src'
root:/sources/sysvinit-2.86#
配置Sysvinit
运行下面命令,创建一个新的 /etc/inittab 文件:
cat > /etc/inittab << "EOF"
# Begin /etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/init.d/rc sysinit
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 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
root:/sources/sysvinit-2.86# cat > /etc/inittab << "EOF"
> # Begin /etc/inittab
>
> id:3:initdefault:
>
> si::sysinit:/etc/rc.d/init.d/rc sysinit
>
> 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 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
root:/sources/sysvinit-2.86#
Sysvinit 的内容
安装的程序: bootlogd, halt, init, killall5, last, lastb(→last), mesg, mountpoint, pidof(→killall5), poweroff(→halt), reboot(→halt), runlevel, shutdown, sulogin, telinit(→init), utmpdump, wall
简要描述
bootlogd |
把启动信息记录到一个日志文件 |
halt |
正常情况下等效于 shutdown 加上 -h 参数(当前系统运行级别是 0 时除外)。它将告诉内核去中止系统,并在系统正在关闭的过程中将日志记录到 /var/log/wtmp 文件里。 |
init |
当内核已经初始化硬件,接管引导程序,开启指令线程时,init 会被第一个启动。 |
killall5 |
发送一个信号到所有进程,但那些在它自己设定级别的进程将不会被这个运行的脚本所中断。 |
last |
给出哪一个用户最后一次登录(或退出登录),它搜索 /var/log/wtmp 文件,出给出系统引导、关闭、运行级别改变等信息。 |
lastb |
给出登失败的尝试,并写入日志 /var/log/btmp |
mesg |
控制是否允许其他用户也有向系统所有用户发送信息的权限 |
mountpoint |
检查给定的目录是否是一个挂载点 |
pidof |
报告给定程序的PID号 |
poweroff |
告诉内核中止系统并且关闭系统(参见 halt) |
reboot |
告诉内核重启系统(参见 halt) |
runlevel |
告前一个和当前的系统运行级别,并且将最后一些运行级别写入 /var/run/utmp |
shutdown |
使系统安全关闭,向所有线程发送关闭信号并且通知所有已经登录的系统用户系统即将关闭。 |
sulogin |
允许 root 登录,它通常情况下是在系统在单用户模式下运行时,由 init 所派生。 |
telinit |
告诉 init 将切换到那一个运行级 |
utmpdump |
以一个多用户友好的方式列出已经给出的登录文件的目录 |
wall |
向所有已经登录的用户写入一个信息 |
53.Tar-1.15.1
Tar 包含一个归档程序。
预计编译时间: 0.2 SBU
所需磁盘空间: 13.7 MB
安装Tar
root:/sources/sysvinit-2.86# mv $LFS/sources/tar-1.15.1 $LFS/sources/old2
root:/sources/sysvinit-2.86# tar -jxvf $LFS/sources/tar-1.15.1.tar.bz2 -C $LFS/sources
root:/sources/sysvinit-2.86# cd $LFS/sources/tar-1.15.1
应用一个patch来解决一些使用GCC-4.0.3时测试单元的问题:
root:/sources/tar-1.15.1# patch -Np1 -i ../tar-1.15.1-gcc4_fix_tests-1.patch
patching file tests/genfile.c
root:/sources/tar-1.15.1#
当文件大于 4 GB 并且使用-S选项时,tar 有一个 bug 。下面的补丁修正了这个问题:
root:/sources/tar-1.15.1# patch -Np1 -i ../tar-1.15.1-sparse_fix-1.patch
patching file src/sparse.c
root:/sources/tar-1.15.1#
为编译Tar做准备:
root:/sources/tar-1.15.1# ./configure --prefix=/usr --bindir=/bin –libexecdir=/usr/sbin
编译软件包:
root:/sources/tar-1.15.1# make
要测试结果,请运行:make check 。
安装软件包:
root:/sources/tar-1.15.1# make install
Tar 的内容
安装的程序: rmt, tar
简要描述
rmt |
通过一个 Internet 连接线程实施远程操作一个磁带驱动器 |
tar |
从压缩档案里创建和解压文件,也可理解为压缩包(tarball)。 |
54.Texinfo-4.8
Texinfo 软件包包含读取、写入、转换 Info 文档的程序。
预计编译时间: 0.2 SBU
所需磁盘空间: 16.6 MB
安装Texinfo
root:/sources/tar-1.15.1# mv $LFS/sources/texinfo-4.8 $LFS/sources/old2
root:/sources/tar-1.15.1# tar -jxvf $LFS/sources/texinfo-4.8.tar.bz2 -C $LFS/sources
root:/sources/tar-1.15.1# cd $LFS/sources/texinfo-4.8
info 程序假定一个字符串在屏幕上占据的字符单元树和在内存中的字节数是一样的。 在 UTF-8 的 locale 环境下,字符串就被拆散了。下面的patch可以在多字节的locale环境下将它们转回到英文信息:
root:/sources/texinfo-4.8# patch -Np1 -i ../texinfo-4.8-multibyte-1.patch
patching file info/info.c
patching file info/man.c
root:/sources/texinfo-4.8#
Texinfo 允许本地用户通过位于临时文件中的符号连接改写任意文件,下面的补丁可以修正这个问题:
root:/sources/texinfo-4.8# patch -Np1 -i ../texinfo-4.8-tempfile_fix-2.patch
patching file util/texindex.c
root:/sources/texinfo-4.8#
为编译Texinfo做准备:
root:/sources/texinfo-4.8# ./configure –prefix=/usr
编译软件包:
root:/sources/texinfo-4.8# make
要测试结果,请运行:make check 。
安装软件包:
root:/sources/texinfo-4.8# make install
安装 texinfo 组件中本应由 TeX 来安装的部份(可选操作):
root:/sources/texinfo-4.8# make TEXMF=/usr/share/texmf install-tex
cd doc && make TEXMF=/usr/share/texmf install-tex
make[1]: Entering directory `/sources/texinfo-4.8/doc'
test -n "/usr/share/texmf" || (echo "TEXMF must be set." >&2; exit 1)
/bin/sh ../mkinstalldirs /usr/share/texmf/tex/texinfo /usr/share/texmf/tex/generic/dvips /usr/share/texmf/pdftex/plain/misc
mkdir -p -- /usr/share/texmf/tex/texinfo /usr/share/texmf/tex/generic/dvips /usr/share/texmf/pdftex/plain/misc
/usr/bin/install -c -m 644 ./texinfo.tex /usr/share/texmf/tex/texinfo/texinfo.tex
/usr/bin/install -c -m 644 ./epsf.tex /usr/share/texmf/tex/generic/dvips/epsf.tex
/usr/bin/install -c -m 644 ./pdfcolor.tex /usr/share/texmf/pdftex/plain/misc/pdfcolor.tex
for f in txi-cs.tex txi-de.tex txi-en.tex txi-es.tex txi-fr.tex txi-it.tex txi-nl.tex txi-no.tex txi-pl.tex txi-pt.tex txi-tr.tex; do \
/usr/bin/install -c -m 644 ./$f /usr/share/texmf/tex/texinfo/$f; done
make[1]: Leaving directory `/sources/texinfo-4.8/doc'
root:/sources/texinfo-4.8#
make 参数的含义:
TEXMF=/usr/share/texmf 如果你以后打算安装 TeX 的话,makefile 中的 TEXMF 变量保存着你的 TeX 树的位置。Info 文档系统使用一个纯文本文件来存放菜单条目的列表。这个文件位于 /usr/share/info/dir 。不幸的是,由于不同软件包中 Makefile 的偶然问题,有时候这个文件会与实际安装在系统里的 Info 文档不一致。如果你要再次创建 /usr/share/info/dir 文件,可以使用下面的命令:
cd /usr/share/info
rm dir
for f in *
do install-info $f dir 2>/dev/null
done
Texinfo 的内容
安装的程序: info, infokey, install-info, makeinfo, texi2dvi, texi2pdf, texindex
简要描述
info |
用于读取 Info 文档,它类似于 man 手册页,但是他们会给出更深入的解释而不是停留在解释程序参数上。例如你可以看看 man bison 和 info bison 的区别。 |
infokey |
把包括 Info 设置的源文件编译成二进制格式 |
install-info |
安装 info 文档,它会更新 info 的索引文件 |
makeinfo |
将 Texinfo 源文档翻译成不同的格式,包括html、info文档、文本文档。 |
texi2dvi |
把给定的 Texinfo 文档格式化成可打印的设备无关的文件 |
texi2pdf |
将 Texinfo 文档转化成 PDF 文件 |
texindex |
对 Texinfo 索引文件进行排序 |
55.Udev-096
Udev 软件包包含动态地创建设备节点的程序。
预计编译时间: 0.1 SBU
所需磁盘空间: 6.8 MB
安装Udev
root:/sources/texinfo-4.8# tar -jxvf $LFS/sources/udev-096.tar.bz2 -C $LFS/sources
root:/sources/texinfo-4.8# cd $LFS/sources/udev-096
udev-config 压缩包里面包含用配置 Udev 的 LFS-specific 文件。把它解压到 Udev 的源码目录:
root:/sources/udev-096# tar xf ../udev-config-6.2.tar.bz2
创建一些Udev无法创建的设备和目录,因为这些会在系统启动的早些时候被用到:
root:/sources/udev-096# install -dv /lib/{firmware,udev/devices/{pts,shm}}
install: creating directory `/lib/firmware'
install: creating directory `/lib/udev'
install: creating directory `/lib/udev/devices'
install: creating directory `/lib/udev/devices/pts'
install: creating directory `/lib/udev/devices/shm'
root:/sources/udev-096# mknod -m0666 /lib/udev/devices/null c 1 3
root:/sources/udev-096# ln -sv /proc/self/fd /lib/udev/devices/fd
create symbolic link `/lib/udev/devices/fd' to `/proc/self/fd'
root:/sources/udev-096# ln -sv /proc/self/fd/0 /lib/udev/devices/stdin
create symbolic link `/lib/udev/devices/stdin' to `/proc/self/fd/0'
root:/sources/udev-096# ln -sv /proc/self/fd/1 /lib/udev/devices/stdout
create symbolic link `/lib/udev/devices/stdout' to `/proc/self/fd/1'
root:/sources/udev-096# ln -sv /proc/self/fd/2 /lib/udev/devices/stderr
create symbolic link `/lib/udev/devices/stderr' to `/proc/self/fd/2'
root:/sources/udev-096# ln -sv /proc/kcore /lib/udev/devices/core
create symbolic link `/lib/udev/devices/core' to `/proc/kcore'
root:/sources/udev-096#
编译软件包:
root:/sources/udev-096# make EXTRAS="extras/ata_id extras/cdrom_id extras/edd_id \
> extras/firmware extras/floppy extras/path_id \
> extras/scsi_id extras/usb_id extras/volume_id"
make 选项的含义:
EXTRAS=... 这将会编译一些帮助程序,对定制Udev的规则很有帮助。要测试结果,请运行:make test 。
注意,Udev的测试单元会在宿主系统的日志中产生很多信息。这些都是无害的,可以被忽略掉。
安装软件包:
root:/sources/udev-096# make DESTDIR=/ \
> EXTRAS="extras/ata_id extras/cdrom_id extras/edd_id \
> extras/firmware extras/floppy extras/path_id \
> extras/scsi_id extras/usb_id extras/volume_id" install
make 参数的含义:
DESTDIR=/ 防止编译 Udev 的进程杀死可能存在于宿主系统中的 udevd 进程。Udev 要工作,需要配置才可以。因为默认是不安装任何配置文件的。安装 LFS-specific 配置文件:
root:/sources/udev-096# cp -v udev-config-6.2/[0-9]* /etc/udev/rules.d/
`udev-config-6.2/05-udev-early.rules' -> `/etc/udev/rules.d/05-udev-early.rules'`udev-config-6.2/25-lfs.rules' -> `/etc/udev/rules.d/25-lfs.rules'
`udev-config-6.2/26-modprobe.rules' -> `/etc/udev/rules.d/26-modprobe.rules'
`udev-config-6.2/27-firmware.rules' -> `/etc/udev/rules.d/27-firmware.rules'
`udev-config-6.2/60-persistent-storage.rules' -> `/etc/udev/rules.d/60-persistent-storage.rules'
`udev-config-6.2/81-cdrom.rules' -> `/etc/udev/rules.d/81-cdrom.rules'
root:/sources/udev-096#
安装解释如何创建 Udev 规则的文档:
root:/sources/udev-096# install -m644 -D -v docs/writing_udev_rules/index.html \> /usr/share/doc/udev-096/index.html
install: creating directory `/usr/share/doc/udev-096'
`docs/writing_udev_rules/index.html' -> `/usr/share/doc/udev-096/index.html'
root:/sources/udev-096#
Udev 的内容
安装的程序: ata_id, cdrom_id, create_floppy_devices, edd_id, firmware_helper, path_id, scsi_id, udevcontrol, udevd, udevinfo, udevmonitor, udevsettle, udevtest, udevtrigger, usb_id, vol_id, write_cd_aliases
安装的目录: /etc/udev
简要描述
ata_id |
为 Udev 提供关于 ATA 驱动器的一个唯一的字符串和一些附加信息(uuid,label等) |
cdrom_id |
为 Udev 提供 CD-ROM 或 DVD-ROM 驱动器的性能 |
create_floppy_devices |
创建所有可能的 CMOS 类型的 floppy 设备 |
edd_id |
为 Udev 提供关于 BIOS 磁盘驱动器的 EDD ID |
firmware_helper |
为设备加载 firmware |
path_id |
提供设备的最短的唯一的硬件路径 |
scsi_id |
根据向特定设备发送SCSI INQUIRY命令的返回信息,为 Udev 提供一个唯一的 SCSI 标识符 |
udevcontrol |
为运行 udevd 守护进程,配置一些选项。比如,log level。 |
udevd |
一个守护进程,侦听热插拔事件,并针对事件,创建设备,运行配置好的外部程序。 |
udevinfo |
允许用户查询 udev 数据库以得到当前这个系统上所有设备的信息,它也提供一种方式去查询任何设备在 sysfs 树里去帮助创建 Udev 规则。 |
udevmonitor |
打印出从Udev的规则运行之后,收到的内核事件和 Udev 发出的环境变量。 |
udevsettle |
监视 Udev 的事件队列,如果当前热插拔事件被处理完就立即退出。 |
udevtest |
模拟一个 udev 为那些给定的设备,并且打印出真实节点的名称 udev 可能已经被创建或者(不在LFS中)被重命名的网络接口。 |
udevtrigger |
重新切换到内核空间的热插拔事件处理 |
usb_id |
为 Udev 提供关于 USB 设备的信息 |
vol_id |
为 Udev 提供一个文件系统的 label 和 uuid |
/etc/udev |
包含 udev 配置文件、设备许可、设备命名规则。 |
56.Util-linux-2.12r
Util-linux 软件包包含许多工具。其中比较重要的是加载、卸载、格式化、分区和管理硬盘驱动器,打开 tty 端口和得到内核消息。
预计编译时间: 0.2 SBU
所需磁盘空间: 17.2 MB
root:/sources/udev-096# mv $LFS/sources/util-linux-2.12r $LFS/sources/old2
root:/sources/udev-096# tar -jxvf $LFS/sources/util-linux-2.12r.tar.bz2 -C $LFS/sources
root:/sources/udev-096# cd $LFS/sources/util-linux-2.12r
FHS兼容性说明
FHS 推荐使用 /var/lib/hwclock 目录代替常用的 /etc 目录以定位 adjtime 文件。要将 hwclock 编译成与 FHS 兼容的程序,运行下面的命令:
root:/sources/util-linux-2.12r# sed -i 's@etc/adjtime@var/lib/hwclock/adjtime@g' \
> hwclock/hwclock.c
root:/sources/util-linux-2.12r# mkdir -p /var/lib/hwclock
安装Util-linux
Util-linux 在基于新版本的 Linux-Libc-Headers 编译时会出错,下面的补丁修正了这个问题:
root:/sources/util-linux-2.12r# patch -Np1 -i ../util-linux-2.12r-cramfs-1.patch
patching file disk-utils/fsck.cramfs.c
patching file disk-utils/mkfs.cramfs.c
root:/sources/util-linux-2.12r#
为编译Util-linux做准备:
root:/sources/util-linux-2.12r# ./configure
编译软件包:
root:/sources/util-linux-2.12r# make HAVE_KILL=yes HAVE_SLN=yes
make 参数的含义:
HAVE_KILL=yes 防止编译和安装 kill 程序(已经由 Procps 安装了)。 HAVE_SLN=yes 防止编译 sln 程序(这是静态连接的 ln ,已经由 Glibc 安装了)。这个软件包没有附带测试程序。
安装软件包:
root:/sources/util-linux-2.12r# make HAVE_KILL=yes HAVE_SLN=yes install
Util-linux 的内容
安装的程序: agetty, arch, blockdev, cal, cfdisk, chkdupexe, col, colcrt, colrm, column, ctrlaltdel, cytune, ddate, dmesg, elvtune, fdformat, fdisk, flock, fsck.cramfs, fsck.minix, getopt, hexdump, hwclock, ipcrm, ipcs, isosize, line, logger, look, losetup, mcookie, mkfs, mkfs.bfs, mkfs.cramfs, mkfs.minix, mkswap, more, mount, namei, pg, pivot_root, ramsize(→rdev), raw, rdev, readprofile, rename, renice, rev, rootflags(→rdev), script, setfdprm, setsid, setterm, sfdisk, swapoff(→swapon), swapon, tailf, tunelp, ul, umount, vidmode(→rdev), whereis, write
简要描述
agetty |
打开 tty 端口,为登录名称建立命令控制符,并引出 login 程序 |
arch |
报告机器的体系结构 |
blockdev |
在命令行中调用块设备的 ioctl |
cal |
显示一个简单的日历 |
cfdisk |
处理指定设备的分区表 |
chkdupexe |
找出重复的可执行文件 |
col |
过滤回显反馈线 |
colcrt |
过滤那些 nroff 终端不具备输出的能力,比如高分点距、半线距 |
colrm |
过滤掉给出的列 |
column |
把输出格式化为几列 |
ctrlaltdel |
设置 CTRL+ALT+DEL 组合键的功能为硬重启或软重启 |
cytune |
查询和修改 Cyclade 驱动器的中断入口 |
ddate |
把阳历日期转换为 Discordian 日期 |
dmesg |
显示内核的启动信息 |
elvtune |
调整块设备的相互作用和性能 |
fdformat |
低级格式化一张软盘 |
fdisk |
磁盘分区管理程序 |
flock |
得到一个文件锁,并根据状态执行一个命令 |
fsck.cramfs |
对 Cramfs 文件系统的一致性进行检查 |
fsck.minix |
对 Minix 文件系统的一致性进行检查 |
getopt |
在给出的命令行进行选项和参数解析 |
hexdump |
用用户指定的方式(包括ASCII, 十进制, 十六进制, 八进制)显示一个文件或者标准输入的数据 |
hwclock |
查询和设置硬件时钟(也被称为 RTC 或 BIOS 时钟) |
ipcrm |
删除给定的进程间通信(IPC)资源 |
ipcs |
提供 IPC 状态信息 |
isosize |
报告 iso9660 文件系统的大小 |
line |
单行拷贝 |
logger |
设置系统日志的入口 |
look |
显示以某个给定字符串开头的行 |
losetup |
启动和控制回环(loop)设备 |
mcookie |
为 xauth 生成 magic cookies (128位的随机16进制数) |
mkfs |
在一个设备(通常是一个硬盘分区)设备上建立文件系统 |
mkfs.bfs |
创建一个 Santa Cruz Operations (SCO) bfs 文件系统 |
mkfs.cramfs |
创建 cramfs 文件系统 |
mkfs.minix |
创建 Minix 文件系统 |
mkswap |
初始化指定设备或文件,以用做交换分区 |
more |
分屏显示文件,但没有 less 好用 |
mount |
把一个文件系统从一个设备挂载到一个目录 |
namei |
显示指定路径的符号链接 |
pg |
显示文本文件内容,一次显示一屏 |
pivot_root |
使某个文件系统成为当前进程的根文件系统 |
ramsize |
显示或者改变 RAM disk 的大小 |
raw |
将一个原始的 Linux 字符设备绑定到一个块设备 |
rdev |
查询和设置内核的根设备和其他信息 |
readprofile |
显示内核侧写文件 /proc/profile 的信息 |
rename |
对文件进行重命名 |
renice |
修改正在运行进程的优先级 |
rev |
颠倒一个文件每行字符的顺序 |
rootflags |
在挂载根设备时查询和设置额外的信息 |
script |
为终端会话过程建立一个 typescipt 文件,记录会话过程中终端的输出。 |
setfdprm |
设置用户定义的软盘参数 |
setsid |
在一个新的会话中运行程序 |
setterm |
设置终端属性 |
sfdisk |
磁盘分区表管理工具 |
swapoff |
取消对指定交换设备和交换文件的使用 |
swapon |
使指定的交换设备和交换文件生效 |
tailf |
跟踪一个日志文件,显示日志的最后10行,并将日志中新的记录也显示出来。 |
tunelp |
设置打印设备的参数 |
ul |
用来将指定文件中出现的下划线使用指定终端画下横线的序列 |
umount |
卸载一个被挂载的文件系统 |
vidmode |
查询和设置视频模式 |
whereis |
确定某命令二进制文件、源文件、手册文档的位置 |
write |
发一个消息给另一个用户,如果他开启了 writting 的话。 |
57.Vim-7.0
Vim 软件包包含一个强大的文本编辑器。
预计编译时间: 0.4 SBU
所需磁盘空间: 47.4 MB
Alternatives to Vim
如果你更喜欢使用其他的编辑器,比如Emacs, Joe, Nano,请参考这里:http://www.linuxfromscratch.org/blfs/view/svn/postlfs/editors.html 获取安装方法。
安装Vim
首先,将 vim-7.0.tar.bz2 和 vim-7.0-lang.tar.gz(可选) 解包到同一个目录下。
root:/sources/util-linux-2.12r# tar -jxvf $LFS/sources/vim-7.0.tar.bz2 -C $LFS/sources
root:/sources/util-linux-2.12r# tar -zxvf $LFS/sources/vim-7.0-lang.tar.gz -C $LFS/sources
root:/sources/util-linux-2.12r# cd $LFS/sources/vim70
然后应用几个patch来修正一些 Vim-7.0 的bug:
root:/sources/vim70# patch -Np1 -i ../vim-7.0-fixes-7.patch
这个版本的 Vim 会安装翻译过的 man 手册,并把它们放到 Man-DB 搜索不到的目录下。给 vim 打补丁来使其安装到可搜索目录里面,并允许Man-DB在运行的时候转换成希望的格式:
root:/sources/vim70# patch -Np1 -i ../vim-7.0-mandir-1.patch
patching file src/Makefile
root:/sources/vim70#
因为上面的patch中的一个,导致通过Http来下载拼写文件时候会出现问题。开发者解决了这个问题,应用下面的patch就可以解决:
root:/sources/vim70# patch -Np1 -i ../vim-7.0-spellfile-1.patch
patching file runtime/autoload/spellfile.vim
root:/sources/vim70#
最后把配置文件 vimrc 的默认位置修改到 /etc 目录中:
root:/sources/vim70# echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
为编译Vim做准备:
root:/sources/vim70# ./configure --prefix=/usr –enable-multibyte
配置选项的含义:
--enable-multibyte 我 们强烈推荐你启用该选项(虽然它是可选的),因为它使得 Vim 可以支持使用多字节字符编码的文件,在一个使用多字节字符集的 locale 上,这是必需的。另外该选项还有助于编辑在默认使用 UTF-8 字符集的其它 Linux 发行版(如 Fedora Core)上创建的文本文件。
编译软件包:
root:/sources/vim70# make
要测试结果,请运行:make test 。 注意,Vim 的测试套件会输出一大堆混乱的二进制字符到屏幕上,有时会把当前的终端设置搞乱,所以可以考虑将其输出重定向到一个日志文件。
安装软件包:
root:/sources/vim70# make install
在 UTF-8 的 locale 下,vimtutor 程序会将教程从 ISO-8859-1 转化为 UTF-8。如果一些教程不是 ISO-8859-1 编码的,将会导致不可读。如果你解压了 vim-7.0-lang.tar.gz 包,并打算使用 UTF-8 的 locale,删除非ISO-8859-1编码的教程。英文版本的教程将会被安装:
root:/sources/vim70# rm -f /usr/share/vim/vim70/tutor/tutor.{gr,pl,ru,sk}
root:/sources/vim70# rm -f /usr/share/vim/vim70/tutor/tutor.??.*
许多用户习惯于使用 vi 而不是 vim ,下面的命令为适应这种习惯创建一个二进制文件以及man文档的符号链接:
root:/sources/vim70# ln -sv vim /usr/bin/vi
create symbolic link `/usr/bin/vi' to `vim'
root:/sources/vim70# for L in "" fr it pl ru; do
> ln -sv vim.1 /usr/share/man/$L/man1/vi.1
> done
create symbolic link `/usr/share/man//man1/vi.1' to `vim.1'
create symbolic link `/usr/share/man/fr/man1/vi.1' to `vim.1'
create symbolic link `/usr/share/man/it/man1/vi.1' to `vim.1'
create symbolic link `/usr/share/man/pl/man1/vi.1' to `vim.1'
create symbolic link `/usr/share/man/ru/man1/vi.1' to `vim.1'
root:/sources/vim70#
默认情况下,Vim的文档被安装在 /usr/share/vim 目录下。下面的符号链接允许通过 /usr/share/doc/vim-7.0 来访问,使其与其他软件包的文档保持一致:
root:/sources/vim70# ln -sv ../vim/vim70/doc /usr/share/doc/vim-7.0
create symbolic link `/usr/share/doc/vim-7.0' to `../vim/vim70/doc'
root:/sources/vim70#
如果您计划在您的 LFS 系统上安装 X Window 系统,那么您可能必须在安装 X 之后重新编译 Vim 。Vim 有带有图形用户接口的版本,但需要安装 X 和其它一些库。要了解更多关于这方面的信息请参考 Vim 的安装手册和 BLFS 中有关 Vim 安装指导的页面: http://www.linuxfromscratch.org/blfs/view/svn/postlfs/editors.html#postlfs-editors-vim.
配置Vim
在默认情况下,vim 是以与 vi 兼容的模式运行,这可能对使用过其它文本编辑器的人来说感到陌生。有些人可能喜欢这种模式,但是我们强烈建议使用 vim 模式运行 vim 。下面的配置文件明确的设置了"nocompatible"模式(也可以改用"compatible"模式),这是必要的,因为如果要改变或覆盖其它设置,必须要在这个设置之后。使用下面的命令创建一个默认的 vim 配置文件:
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
root:/sources/vim70# 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
root:/sources/vim70#
set nocompatible 将使 vim 以比默认的 vi 兼容模式功能更强的方式运行。你可以去掉"no"来保持默认的 vi 模式。set backspace=2 让退格键能跨行、自动缩进、插入。syntax on 打开了 vim 的语法高亮功能。最后,带有 set background=dark 的 if 语句纠正了 vim 对于终端背景颜色的猜测。对于那些使用黑色背景的用户这是一个较好的配色方案。
使用下面的命令可以得到其它可以使用的选项的说明文档:
vim -c ':options'
注意
默认情况下,Vim仅会安装英文的拼写检查文件。要安装你熟悉的语言的拼写检查文件,从 ftp://ftp.vim.org/pub/vim/runtime/spell/ 下载与你的语言相关的 *.spl 文件和 *.sug 文件(可选),以及字符解码器。把它们保存到 /usr/share/vim/vim70/spell/ 目录下。
要使用这些拼写检查文件,在 /etc/vimrc 里面需要配置一些选项,例如:
set spelllang=en,ru
set spell
要获取更多的信息,可以查看上面 URL 上的 README 文件。
Vim 的内容
安装的程序: efm_filter.pl, efm_perl.pl, ex(→vim), less.sh, mve.awk, pltags.pl, ref, rview(→vim), rvim(→vim), shtags.pl, tcltags, vi(→vim), view(→vim), vim, vim132, vim2html.pl, vimdiff(→vim), vimm, vimspell.sh, vimtutor, xxd
简要描述
efm_filter.pl |
能读取 vim 产生的错误的一个过滤器 |
efm_perl.pl |
将 perl 解释器的错误信息重新格式化以用于 vim 的"quickfix"模式。 |
ex |
以 ex 模式启动 vim |
less.sh |
用 less.vim 起动 vim 的脚本 |
mve.awk |
处理 vim 错误信息 |
pltags.pl |
为 Perl 代码建立一个标记文件,以用于 vim |
ref |
检查参数的拼写错误 |
rview |
一个 view 的限制版,它不能启动任何 shell 命令并且 view 不能被挂起。 |
rvim |
一个 vim 的限制版。它不能启动任何 shell 命令并且 vim 不能被挂起。 |
shtags.pl |
为 perl 代码产生一个标志文件 |
tcltags |
为 TCL 代码产生一个标志文件 |
view |
以只读模式启动 vim |
vi |
vim 的一个链接 |
vim |
编辑器 |
vim132 |
在132列模式下的终端中起动 vim |
vim2html.pl |
将 vim 文档转化为 HTML 格式 |
vimdiff |
使用 vim 同时编辑一个文档的 2 或 3 个版本并显示他们的区别使用 vim 同时编辑一个文档的 2 或 3 个版本并显示他们的区别 |
vimm |
在一个远端终端上开启 DEC 定位输入模式 |
vimspell.sh |
检查文件拼写并产生一个需要在 vim 中强调的语法报告。这个脚本需要 LFS 和 BLFS 都不提供的旧的 Unix spell 命令 |
vimtutor |
教你使用 vim 的基本操作和命令 |
xxd |
生成十六进制转储或者做相反的工作,因此它能给二进制文件打补丁。 |