属于原创作品,如果转载,请注明出处和作者(springwind@bhu.edu.cn)
内核配置文件和busybox的配置文件,以及squashfs的补丁在附件中
LFS部分是参考LFS-6.3rc1来进行的,需要特别修改的地方已经标明在下面
全程制作过程见附件livecd.sh.gz
glibc-2.5
安装locale部分,使用自定义方式,只安装下面我需要的locale
代码:
mkdir -pv /usr/lib/locale
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i zh_CN -f GB2312 zh_CN
localedef -i zh_CN -f GBK zh_CN.GBK
localedef -i zh_CN -f GB18030 zh_CN.GB18030
localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
按照晨想版主的建议,使用PRC
代码:
cp -v --remove-destination /usr/share/zoneinfo/PRC /etc/localtime
第八章
代码:
mv -v /etc/udev/rules.d/{75-cd-aliases-generator.rules,../}
mv -v /etc/udev/rules.d/{75-persistent-net-generator.rules,../}
rm -v /etc/udev/rules.d/70-persistent-cd.rules
cat >/etc/udev/rules.d/81-cdrom.rules <<"EOF"
# /etc/udev/rules.d/81-cdrom.rules: Set CD-ROM permissions.
ACTION=="add", SUBSYSTEM=="block", ENV{ID_TYPE}=="cd", PROGRAM="getcdrom %k", SYMLINK+="cdrom%c", GROUP="cdrom"
EOF
cat >/lib/udev/getcdrom <<"EOF"
#!/bin/sh
i=0
while [ -e /dev/cdrom${i} ]
do
[ X$(realpath /dev/cdrom${i}) == X/dev/$1 ] && break
let i=i+1
done
echo $i
exit 0
EOF
chmod 755 /lib/udev/getcdrom
解释:
1、75-cd-aliases-generator.rules
75-persistent-net-generator.rules
的作用是创建一些静态的规则(写文件),在livecd上没有意义,在liveUSB上,会引起问题(因为每台机器的网卡的MAC都不同,直接导致的后果
是每在一台新的机器上运行后,网卡的编号是递增的,比如在A机上启动后,网卡的名字是eth0,可是,到另外一台机器上启动后,网卡是
eth1,....,另外,CDROM的名字也有这样的情况发生)
2、修改81-cdrom.rules,作用是在/dev目录下创建cdrom?这样的符号连接,链接到实际的光驱上面,第一个光驱是cdrom0,第二
个是cdrom1,依次类推(/lib/udev/getcdrom是一个shell脚本,目的就是获取某个光驱的编号,返回值从0开始)
代码:
cat > /etc/sysconfig/clock << "EOF"
# Begin /etc/sysconfig/clock
UTC=0
# End /etc/sysconfig/clock
EOF
解释:
设置UTC=0,就是使用本地时间,否则看起来别扭,总是差8个小时
代码:
echo "HOSTNAME=livecd" > /etc/sysconfig/network
cd /etc/sysconfig/network-devices
mkdir -v ifconfig.eth0
cat > ifconfig.eth0/ipv4 << "EOF"
ONBOOT=yes
SERVICE=ipv4-static
IP=192.168.1.1
GATEWAY=192.168.1.2
PREFIX=24
BROADCAST=192.168.1.255
EOF
cat > /etc/resolv.conf << "EOF"
# Begin /etc/resolv.conf
#domain
nameserver 202.96.64.68
nameserver 202.96.69.38
# End /etc/resolv.conf
EOF
cat > /etc/fstab << "EOF"
# Begin /etc/fstab
# file system mount-point type options dump fsck
# order
#/dev/ / defaults 1 1
#/dev/ swap swap pri=1 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devpts /dev/pts devpts gid=4,mode=620 0 0
shm /dev/shm tmpfs defaults 0 0
# End /etc/fstab
EOF
解释:
1、设置机器名字为livecd
2、使用静态IP
3、DNS服务器是我使用的,这个需要按照实际情况改动
4、因为是用于liveCD或者liveUSB,因此,在/etc/fstab中是没有/和swap的,因此不需要写
内核编译部分
代码:
wget
tar xf squashfs3.2-r2.tar.gz
cd linux-2.6.22.1
patch -Np1 -i ../squashfs3.2-r2/kernel-patches/linux-2.6.20/squashfs3.2-patch
cd /sources/squashfs3.2-r2/squashfs-tools
make
cd /sources/linux-2.6.22.1
patch -Np1 -i ../linux-2.6.22.1-squashfs.patch
make
make modules_install
cp -v arch/i386/boot/bzImage /boot/vmlinuz-2.6.22.1
cp -v System.map /boot/System.map-2.6.22.1
cp -v .config /boot/config-2.6.22.1
cd /sources/aufs
make KDIR=/lib/modules/2.6.22.1/build/ -f local.mk
install -m 500 -p mount.aufs umount.aufs auplink aulchown /sbin
echo FLUSH=ALL > /etc/default/auplink
mkdir /lib/modules/2.6.22.1/kernel/fs/aufs
cp aufs.ko /lib/modules/2.6.22.1/kernel/fs/aufs/
depmod -a 2.6.22.1
echo 6.3-rc1 > /etc/lfs-release
#mkinitrd
cd /sources
tar xf busybox-1.5.1.tar.bz2
cd busybox-1.5.1
make defconfig
make
mkdir /initrd
cd /initrd
mkdir bin dev etc lib mnt/{,cdrom,root,roroot,rwroot} proc root sbin sys tmp
chmod 1777 tmp
cp /sbin/{modinfo,udevd,udevtrigger,depmod,modprobe,udevcontrol,udevsettle} sbin/
cp -a /sources/busybox-1.5.1/_install/{bin,sbin} .
cp -a /etc/udev etc/
cp -a /lib/udev lib/
cp -a /lib/{ld-linux.so.2,libc.so.6,libvolume_id.so.0,libvolum_id.so.0.78.0} lib/
mkdir -p lib/modules/2.6.22.1/kernel/{drivers,fs}
cp -a /lib/modules/2.6.22.1/kernel/drivers/{ata,block,cdrom,hid,ide,input,pcmia,scsi,usb} lib/modules/2.6.22.1/kernel/drivers/
cp -a /lib/modules/2.6.22.1/kernel/fs lib/modules/2.6.22.1/kernel/
cat >init <<"EOF"
#!/bin/sh
PATH=/bin:/sbin
mount -t proc proc /proc
mount -t sysfs sysfs /sys
ro=-r
INIT=/sbin/init
ROOTDELAY=
DEBUG=
NOAUFS=
for i in $(cat /proc/cmdline)
do
case "$i" in
rootdelay=*)
ROOTDELAY=${i#rootdelay=}
;;
esac
done
/sbin/depmod -a
echo > /proc/sys/kernel/hotplug
cp -a /lib/udev/devices/* /dev
/sbin/udevd --daemon
/sbin/udevtrigger
/sbin/udevsettle
if [ X$ROOTDELAY != X ]
then
echo "wait $ROOTDELAY seconds ......"
sleep $ROOTDELAY
fi
for i in $(cat /proc/cmdline)
do
case "$i" in
root=*)
ROOT=${i#root=}
case "$ROOT" in
UUID=*)
ROOT=${ROOT#UUID=}
ROOT=$(realpath /dev/disk/by-uuid/$ROOT)
;;
/dev/*)
ROOT=$ROOT
;;
*)
ROOT=
esac
;;
init=*)
INIT=${i#init=}
;;
ro)
ro=-r
;;
rw)
ro=
;;
debug)
DEBUG=1
;;
noaufs)
NOAUFS=1
;;
esac
done
if [ X$DEBUG != X ]
then
echo "enter debug mode..."
PS1='\[\033[0;34m(debug)\033[0m\]$ ' /bin/sh -i
else
PS1='\[033[0;31m(initramfs)\033[0m\]$ '
[ -d /mnt/cdrom ] || mkdir /mnt/cdrom
[ -d /mnt/root ] || mkdir /mnt/root
[ -d /mnt/roroot ] || mkdir /mnt/roroot
[ -d /mnt/rwroot ] || mkdir /mnt/rwroot
if [ X$ROOT == X ]
then
echo "mount cdrom ......"
modprobe iso9660
for i in 1 2 4 8
do
for CDROM in /dev/cdrom*
do
mount -nt iso9660 -o ro $CDROM /mnt/cdrom
mountpoint -q /mnt/cdrom && break
[ -f /mnt/cdrom/root.sqfs ] && break
umount /mnt/cdrom
done
[ -f /mnt/cdrom/root.sqfs ] && break
sleep $i
done
else
echo "mount rootdev(${ROOT}) ......"
FSTYPE=$(/lib/udev/vol_id -t "${ROOT}" 2> /dev/null)
if [ X$FSTYPE != X ]
then
modprobe nls_iso8859-1
modprobe nls_cp437
modprobe $FSTYPE
for i in 1 2 4 8
do
mount -nt $FSTYPE -o ro $ROOT /mnt/cdrom
mountpoint -q /mnt/cdrom && break
sleep $i
done
fi
fi
mountpoint -q /mnt/cdrom || (echo "no rootdev";/bin/sh -i)
if [ X$AUFS == X ]
then
echo "mount roroot ......"
mount -o remount,rw /mnt/cdrom
modprobe loop
modprobe squashfs
for i in 1 2 4 8
do
mount -nt squashfs -o loop,ro /mnt/cdrom/root.sqfs /mnt/roroot
mountpoint -q /mnt/roroot && break
sleep $i
done
mountpoint -q /mnt/roroot || (echo "no roroot";/bin/sh -i)
mount -nt tmpfs -o mode=755 tmpfs /mnt/rwroot
mountpoint -q /mnt/rwroot || (echo "no tmpfs";/bin/sh -i)
echo "mount realroot ......"
modprobe aufs
for i in 1 2 4 8
do
mount -nt aufs -o br:/mnt/rwroot=rw:/mnt/roroot=ro aufsroot /mnt/root
mountpoint -q /mnt/root && break
sleep $i
done
mountpoint -q /mnt/root || (echo "no root";/bin/sh -i)
mkdir /mnt/root/mnt/.rootdev
mount --bind /mnt/cdrom /mnt/root/mnt/.rootdev
touch /mnt/root/fastboot
touch /mnt/root/.livecd
else
mount -n -o move /mnt/cdrom /mnt/root
fi
#start up hook
[ -f /mnt/cdrom/onboot.sh ] && sh /mnt/cdrom/onboot.sh
killall udevd
umount /proc
umount /sys
fi
exec switch_root /mnt/root $INIT "$@"
EOF
解释:
1、因为CD和USB的空间有限,因此需要对root文件系统进行压缩,我使用的是squashfs来进行压缩,因为squashfs是只读的,可是实际
运行中需要对/文件系统进行写操作,因此使用aufs来挂载/文件系统,将所有的写操作在内存中进行(squashfs和aufs的获取可能通过官方网站
的提示进行,我的aufs是通过cvs获取的)
2、initrd使用initramfs,这种initrd比较简单,而且可控性很强,因为启动后,这个initrd就被释放,因此,使用busybox
来提供大部分工具,省得复制一些运行库,目的是尽可能减少initrd的空间,不过,因为把一部分内核模块复制到initrd中了,initrd的容量已
经比较大了,有20M左右,因此,这部分的减小没有太大意义,不过,如果只是编译内核,使得内核只支持IDE的cdrom的话,和部分USB的光驱,以及
部分SATA的光驱的话,内核模块的容量还是比较小的。
3、在复制内核模块的fs部分,实际上只需要复制部分用得着的,比如livecd只需要isofs,aufs,squashfs,liveUSB只需要aufs,squashfs和USB分区的分区类型的相应模块
4、initrd中使用的是udev,只是为了方便,如果有能力的话,可以自己去创建设备节点(那样做有一些麻烦,因为还需要手动去加载相应的内核模块,工作量确实不少),就可以不用udev了
额外工具
其中一部分是参考BLFS的开发版的手册,其它的都可以从internet上获取
代码:
tar xf zhcon-0.2.5.tar.gz
cd zhcon-0.2.5
zcat ../zhcon-0.2.5-to-0.2.6.diff.gz | patch -Np1
./configure --prefix=/usr --sysconfdir=/etc
make && make install
解释:
因为暂时不想安装X,因此,在控制台下面对中文的支持是必要的
代码:
tar xf openssl-0.9.8d.tar.gz
cd openssl-0.9.8d
patch -Np1 -i ../openssl-0.9.8d-fix_manpages-1.patch
make MANDIR=/usr/share/man
make MANDIR=/usr/share/man install
cp -v -r certs /etc/ssl &&
install -v -d -m755 /usr/share/doc/openssl-0.9.8d &&
cp -v -r doc/{HOWTO,README,*.{txt,html,gif}} \
/usr/share/doc/openssl-0.9.8d
cd /sources/blfs/ && rm -rf openssl-0.9.8d
tar xf wget-1.10.2.tar.gz
cd wget-1.10.2
./configure --prefix=/usr --sysconfdir=/etc && make && make install
cd /sources/blfs/ && rm -rf wget-1.10.2
tar xf pcre-7.2.tar.bz2
cd pcre-7.2
./configure --prefix=/usr \
--docdir=/usr/share/doc/pcre-7.2 \
--enable-utf8 &&
make &&
make install
mv -v /usr/lib/libpcre.so.* /lib/ &&
ln -v -sf ../../lib/libpcre.so.0 /usr/lib/libpcre.so
cd /sources/blfs/ && rm -rf pcre-7.2
cat > /usr/bin/which << "EOF"
#!/bin/bash
type -pa "$@" | head -n 1 ; exit ${PIPESTATUS[0]}
EOF
chmod -v 755 /usr/bin/which
chown -v root:root /usr/bin/which
tar xf pkg-config-0.22.tar.gz
cd pkg-config-0.22
./configure --prefix=/usr && make && make install
cd /sources/blfs/ && rm -rf pkg-config-0.22
tar xf cpio-2.9.tar.bz2
cd cpio-2.9
./configure CPIO_MT_PROG=mt \
--prefix=/usr \
--bindir=/bin \
--libexecdir=/tmp \
--with-rmt=/usr/sbin/rmt &&
make && make install
cd /sources/blfs/ && rm -rf cpio-2.9
tar xf pciutils-2.2.3.tar.bz2
cd pciutils-2.2.3
sed -i 's/null ;/null 2>\&1 ;/' update-pciids.sh &&
make PREFIX=/usr &&
make PREFIX=/usr install &&
install -v -m 755 -d /usr/include/pci &&
install -v -m 644 lib/libpci.a /usr/lib &&
install -v -m 644 lib/*.h /usr/include/pci
update-pciids
cd /sources/blfs/ && rm -rf pciutils-2.2.3
tar xf gc6.8.tar.gz
cd gc6.8
sed -i "s|\$(datadir)/@PACKAGE@|&-6.8|" doc/Makefile.in &&
./configure --prefix=/usr \
--datadir=/usr/share/doc --enable-cplusplus &&
make && make install &&
install -v -m644 doc/gc.man /usr/share/man/man3/gc_malloc.3 &&
ln -v -s gc_malloc.3 /usr/share/man/man3/gc.3 &&
cd /sources/blfs/ && rm -rf gc6.8
tar xf w3m-0.5.2.tar.gz
cd w3m-0.5.2
./configure --prefix=/usr \
--libexecdir=/usr/lib \
--sysconfdir=/etc &&
make && make install &&
install -v -m644 -D doc/keymap.default /etc/w3m/keymap &&
install -v -m644 doc/menu.default /etc/w3m/menu &&
install -v -m755 -d /usr/share/doc/w3m-0.5.2 &&
install -v -m644 doc/{HISTORY,READ*,keymap.*,menu.*,*.html} \
/usr/share/doc/w3m-0.5.2
cd /sources/blfs/ && rm -rf w3m-0.5.2
tar xf screen-4.0.3.tar.gz
cd screen-4.0.3
./configure --prefix=/usr --with-socket-dir=/var/run/screen \
--with-sys-screenrc=/etc/screenrc &&
sed -i -e "s%/usr/local/etc/screenrc%/etc/screenrc%" {etc,doc}/* &&
make && make install &&
install -m 644 etc/etcscreenrc /etc/screenrc
cd /sources/blfs/ && rm -rf screen-4.0.3
tar xf openssh-4.6p1.tar.gz
cd openssh-4.6p1
install -v -m700 -d /var/lib/sshd &&
chown -v root:sys /var/lib/sshd &&
groupadd -g 50 sshd &&
useradd -c 'sshd PrivSep' -d /var/lib/sshd -g sshd \
-s /bin/false -u 50 sshd
sed -i "s:-lcrypto:/usr/lib/libcrypto.a -ldl:g" configure
sed -i "s/lkrb5 -ldes/lkrb5/" configure &&
./configure --prefix=/usr --sysconfdir=/etc/ssh \
--libexecdir=/usr/lib/openssh --with-md5-passwords \
--with-privsep-path=/var/lib/sshd &&
make && make install &&
install -v -m755 -d /usr/share/doc/openssh-4.6p1 &&
install -v -m644 INSTALL LICENCE OVERVIEW README* WARNING.RNG \
/usr/share/doc/openssh-4.6p1
cd /sources/blfs/ && rm -rf openssh-4.6p1
tar xf dhcp-3.0.5.tar.gz
cd dhcp-3.0.5
patch -Np1 -i ../dhcp-3.0.5-client_dns-1.patch
patch -Np1 -i ../dhcp-3.0.5-iproute2-1.patch
./configure &&
make &&
make LIBDIR=/usr/lib INCDIR=/usr/include install
cat > /etc/dhclient.conf << "EOF"
# dhclient.conf
interface "eth0"{
prepend domain-name-servers 127.0.0.1;
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, host-name;
require subnet-mask, domain-name-servers;
}
# end dhclient.conf
EOF
cd /sources/blfs/ && rm -rf dhcp-3.0.5
cat > /etc/sysconfig/network-devices/dhclient.example << "EOF"
ONBOOT="yes"
SERVICE="dhclient"
DHCP_START="-q
"
DHCP_STOP="-q -r "
# Set PRINTIP="yes" to have the script print
# the DHCP assigned IP address
PRINTIP="no"
# Set PRINTALL="yes" to print the DHCP assigned values for
# IP, SM, DG, and 1st NS. This requires PRINTIP="yes".
PRINTALL="no"
EOF
tar xf ppp-2.4.4.tar.gz &&
cd ppp-2.4.4 &&
./configure --prefix=/usr &&
make &&
make install &&
make install-etcppp &&
cd /sources/blfs/ && rm -rf ppp-2.4.4
tar xf rp-pppoe-3.8.tar.gz &&
cd rp-pppoe-3.8 &&
patch -Np1 -i ../rp-pppoe-3.8-iproute2-1.patch &&
sed -i s%/usr/bin/logger%/bin/logger% scripts/pppoe-{connect,setup,stop}.in &&
cd src &&
./configure &&
make &&
make install &&
cat > /etc/sysconfig/network-devices/pppoe-example << "EOF"
ONBOOT="yes"
SERVICE="pppoe"
EOF
cd /sources/blfs/ && rm -rf rp-pppoe-3.8
cd blfs-bootscripts-20070726 &&
make install-service-pppoe &&
cd /sources/blfs
tar xf libpcap-0.9.6.tar.gz &&
cd libpcap-0.9.6 &&
./configure --prefix=/usr &&
make &&
make install &&
install -v -m755 -d /usr/share/doc/libpcap-0.9.6 &&
install -v -m644 doc/* /usr/share/doc/libpcap-0.9.6 &&
cd /sources/blfs/ && rm -rf libpcap-0.9.6
tar xf wireless_tools.28.tar.gz &&
cd wireless_tools.28 &&
make &&
make install &&
cd /sources/blfs/ && rm -rf wireless_tools.28
tar xf glib-2.12.12.tar.bz2 &&
cd glib-2.12.12 &&
./configure --prefix=/usr &&
make &&
make install &&
cat > /etc/profile.d/glib2-locale.sh << "EOF"
# Use the current locale charset for filenames
# in applications using GLib
export G_FILENAME_ENCODING=@locale
EOF
cd /sources/blfs/ && rm -rf glib-2.12.12
tar xf wireshark-0.99.6.tar.bz2 &&
cd wireshark-0.99.6 &&
./configure --prefix=/usr \
--sysconfdir=/etc \
--enable-threads \
--disable-wireshark &&
make &&
make install &&
install -v -m755 -d /usr/share/doc/wireshark-0.99.6 &&
install -v -m644 FAQ README{,.linux} doc/README.* doc/*.{pod,txt} \
/usr/share/doc/wireshark-0.99.6 &&
pushd /usr/share/doc/wireshark-0.99.6 &&
for FILENAME in ../../wireshark/*.html; do \
ln -s -v $FILENAME .
done &&
popd &&
cd /sources/blfs/ && rm -rf wireshark-0.99.6
tar xf nmap-4.20.tar.bz2 &&
cd nmap-4.20 &&
./configure --prefix=/usr --without-nmapfe &&
make &&
make install &&
cd /sources/blfs/ && rm -rf nmap-4.20
tar xf traceroute-1.4a12.tar.gz &&
cd traceroute-1.4a12 &&
sed -i -e 's/-o bin/-o root/' Makefile.in &&
./configure --prefix=/usr &&
make &&
make install &&
make install-man &&
cd /sources/blfs/ && rm -rf traceroute-1.4a12
tar xf whois_4.7.21.tar.gz &&
cd whois-4.7.21 &&
make &&
make prefix=/usr install &&
cd /sources/blfs/ && rm -rf whois-4.7.21
tar xf bind-9.4.1-P1.tar.gz &&
cd bind-9.4.1-P1 &&
./configure --prefix=/usr &&
make -C lib/dns &&
make -C lib/isc &&
make -C lib/bind9 &&
make -C lib/isccfg &&
make -C lib/lwres &&
make -C bin/dig &&
make -C bin/dig install &&
cd /sources/blfs/ && rm -rf bind-9.4.1-P1
tar xf lftp-3.5.12.tar.bz2 &&
cd lftp-3.5.12 &&
./configure --prefix=/usr &&
make &&
make install &&
cd /sources/blfs/ && rm -rf lftp-3.5.12
groupadd -g 46 proftpd &&
useradd -c proftpd -d /srv/ftp -g proftpd \
-s /usr/bin/proftpdshell -u 46 proftpd &&
install -v -d -m775 -o proftpd -g proftpd /srv/ftp &&
ln -v -s /bin/false /usr/bin/proftpdshell &&
echo /usr/bin/proftpdshell >> /etc/shells &&
tar xf proftpd-1.3.0.tar.bz2 &&
cd proftpd-1.3.0 &&
./configure --prefix=/usr --sysconfdir=/etc \
--localstatedir=/var/run &&
make &&
make install &&
cat > /etc/proftpd.conf << "EOF"
# This is a basic ProFTPD configuration file
# It establishes a single server and a single anonymous login.
ServerName "ProFTPD Default Installation"
ServerType standalone
DefaultServer on
# Port 21 is the standard FTP port.
Port 21
# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask 022
# To prevent DoS attacks, set the maximum number of child processes
# to 30. If you need to allow more than 30 concurrent connections
# at once, simply increase this value. Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd)
MaxInstances 30
# Set the user and group that the server normally runs at.
User proftpd
Group proftpd
# Normally, files should be overwritable.
AllowOverwrite on
# A basic anonymous configuration, no upload directories.
User proftpd
Group proftpd
# Clients should be able to login with "anonymous" as well as "proftpd"
UserAlias anonymous proftpd
# Limit the maximum number of anonymous logins
MaxClients 10
# 'welcome.msg' should be displayed at login, and '.message' displayed
# in each newly chdired directory.
DisplayLogin welcome.msg
DisplayFirstChdir .message
# Limit WRITE everywhere in the anonymous chroot
DenyAll
EOF
cd /sources/blfs/ && rm -rf proftpd-1.3.0
cd /sources/blfs/blfs-bootscripts-20070726
make install-proftpd
cd /sources/blfs
tar xf gpm-1.20.1.tar.bz2 &&
cd gpm-1.20.1 &&
patch -Np1 -i ../gpm-1.20.1-segfault-1.patch &&
patch -Np1 -i ../gpm-1.20.1-silent-1.patch &&
./configure --prefix=/usr --sysconfdir=/etc &&
LDFLAGS="-lm" make &&
make install &&
cp -v conf/gpm-root.conf /etc &&
ldconfig &&
cat > /etc/sysconfig/mouse << "EOF"
# Begin /etc/sysconfig/mouse
MDEVICE="/dev/input/mouse0"
PROTOCOL="imps2"
GPMOPTS=""
# End /etc/sysconfig/mouse
EOF
cd /sources/blfs/ && rm -rf gpm-1.20.1
cd /sources/blfs/blfs-bootscripts-20070726
make install-gpm
cd /sources/blfs
tar xf slang-2.1.1.tar.bz2 &&
cd slang-2.1.1 &&
./configure --prefix=/usr --sysconfdir=/etc &&
make &&
make install_doc_dir=/usr/share/doc/slang-2.1.1 install-all &&
chmod -v 755 /usr/lib/libslang.so.2.1.1 \
/usr/lib/slang/v2/modules/*.so &&
cd /sources/blfs/ && rm -rf slang-2.1.1
tar xf mc-4.6.1.tar.gz &&
cd mc-4.6.1 &&
patch -Np1 -i ../mc-4.6.1-bash32-1.patch &&
patch -Np1 -i ../mc-4.6.1-debian_fixes-1.patch &&
CPPFLAGS="-DUTF8" ./configure --prefix=/usr \
--enable-charset &&
make &&
convert-mans ISO-8859-1 UTF-8 lib/mc.hint{,.es,.it,.nl} &&
convert-mans ISO-8859-2 UTF-8 lib/mc.hint{.cs,.hu,.pl} &&
convert-mans ISO-8859-5 UTF-8 lib/mc.hint.sr &&
convert-mans KOI8-R UTF-8 lib/mc.hint.ru &&
convert-mans KOI8-U UTF-8 lib/mc.hint.uk &&
convert-mans BIG5 UTF-8 lib/mc.hint.zh &&
convert-mans ISO-8859-1 UTF-8 doc/{es,it}/mc.hlp.* &&
convert-mans ISO-8859-2 UTF-8 doc/{hu,pl}/mc.hlp.* &&
convert-mans ISO-8859-5 UTF-8 doc/sr/mc.hlp.sr &&
convert-mans KOI8-R UTF-8 doc/ru/mc.hlp.ru &&
make install &&
chmod 1755 /usr/lib/mc/cons.saver &&
cd /sources/blfs/ && rm -rf mc-4.6.1
#comiple p7zip need nasm
#wget ""
tar xf nasm-0.99.01.tar.bz2 &&
cd nasm-0.99.01 &&
./configure && make &&
cp nasm /usr/local/bin/ &&
cd /sources/blfs/ && rm -rf nasm-0.99.01
tar xf p7zip_4.51_src_all.tar.bz2 &&
cd p7zip_4.51 &&
cp makefile.linux_x86_asm_gcc_4.X makefile.machine &&
make clean &&
make all3 &&
sed -i "s@DEST_HOME=/usr/local@DEST_HOME=/usr@" install.sh &&
./install.sh &&
cd /sources/blfs/ && rm -rf p7zip_4.51
tar xf fuse-2.7.0.tar.gz &&
cd fuse-2.7.0 &&
./configure --disable-kernel-module --prefix=/usr &&
make &&
make install &&
cd /sources/blfs/ && rm -rf fuse-2.7.0
tar xf sshfs-fuse-1.8.tar.gz &&
cd sshfs-fuse-1.8 &&
./configure --prefix=/usr &&
make &&
make install &&
cd /sources/blfs/ && rm -rf sshfs-fuse-1.8
tar xf curl-7.16.3.tar.bz2 &&
cd curl-7.16.3 &&
./configure --prefix=/usr &&
make &&
make install &&
find docs -name "Makefile*" -o -name "*.1" -o -name "*.3" | xargs rm &&
install -v -d -m755 /usr/share/doc/curl-7.16.3 &&
cp -v -R docs/* /usr/share/doc/curl-7.16.3 &&
cd /sources/blfs/ && rm -rf curl-7.16.3
#wget "http://downloads.sourceforge.net/curlftpfs/curlftpfs-0.9.1.tar.gz?modtime=1175788159&big_mirror=0"
tar xf curlftpfs-0.9.1.tar.gz &&
cd curlftpfs-0.9.1 &&
./configure --prefix=/usr &&
make &&
make install &&
cd /sources/blfs/ && rm -rf curlftpfs-0.9.1
tar xf ntfs-3g-1.710.tgz &&
cd ntfs-3g-1.710 &&
./configure --prefix=/usr &&
make &&
make install &&
cd /sources/blfs/ && rm -rf ntfs-3g-1.710
解释:
我只是安装一些我觉得有用的工具,具体应该安装哪些,视各人喜好而定
1、wget,lftp可以用来下载文件和访问ftp服务器
2、w3m可以浏览网页
3、screen是一个可爱的工具
4、openssh,proftpd分别提供ssh服务和ftp服务
5、dhcp可以动态获取IP,在很多场合下是必要的
6、rp-pppoe可以提供ADSL拨号功能
7、wireless-tool可以提供对无线网卡的控制(内核中已经把大部分无线网卡的驱动编译成模块了)
8、nmap,wireshark是网络工具
9、sshfs,curlftpfs,ntfs-3g是一些可爱的工具,sshfs可以通过ssh将远程主机上的文件系统挂载到本地;curlftpfs可以将远程FTP上的目录挂载到本地;ntfs-3g可以提供对ntfs的读写操作
10、cpio,p7zip是压缩解压工具,p7zip可以支持大部分的压缩格式
11、gpm支持控制台下面使用鼠标(启动后,我发现在/dev/input下面有鼠标的设备节点,分别是mouse0,mouse1....,所以就在配置文件中使用了/dev/input/mouse0作为鼠标的设备节点了)
12、mc是一个大部分人都说好的工具
期待您的参与,给提供一些好的工具,以便添加到livecd中
修正启动脚本中的一点问题
代码:
ln -sf /proc/mounts /etc/mtab
cat > /etc/rc.d/init.d/mountfs <<"EOF"
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/mountfs
#
# Description : File System Mount Script
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
case "${1}" in
start)
boot_mesg "Remounting root file system in read-write mode..."
[ -f /.livecd ] || mount -n -o remount,rw / >/dev/null 2>&1
evaluate_retval
# Remove fsck-related file system watermarks.
rm -f /fastboot /forcefsck /.livecd
# This will mount all filesystems that do not have _netdev in
# their option list. _netdev denotes a network filesystem.
boot_mesg "Mounting remaining file systems..."
mount -an -O no_netdev >/dev/null 2>&1
evaluate_retval
;;
stop)
boot_mesg "Unmounting all other currently mounted file systems..."
umount -a -d -r >/dev/null 2>&1
evaluate_retval
;;
*)
echo "Usage: ${0} {start|stop}"
exit 1
;;
esac
# End $rc_base/init.d/mountfs
EOF
解释:
因为livecd使用的方式有些特别,因此,在mountfs中运行的一些脚本可能出现错误(不影响实际的使用)
在livecd的initrd中已经挂载了/文件系统,并且是可写的,因此,在mountfs中就不需要重新以rw方式挂载/了
设置一些必要的配置文件(来自BLFS手册)
代码:
cat > /etc/profile << "EOF"
# Begin /etc/profile
# Written for Beyond Linux From Scratch
# by James Robertson
# modifications by Dagmar d'Surreal
# System wide environment variables and startup programs.
# System wide aliases and functions should go in /etc/bashrc. Personal
# environment variables and startup programs should go into
# ~/.bash_profile. Personal aliases and functions should go into
# ~/.bashrc.
# Functions to help us manage paths. Second argument is the name of the
# path variable to be modified (default: PATH)
pathremove () {
local IFS=':'
local NEWPATH
local DIR
local PATHVARIABLE=${2:-PATH}
for DIR in ${!PATHVARIABLE} ; do
if [ "$DIR" != "$1" ] ; then
NEWPATH=${NEWPATH:+$NEWPATH:}$DIR
fi
done
export $PATHVARIABLE="$NEWPATH"
}
pathprepend () {
pathremove $1 $2
local PATHVARIABLE=${2:-PATH}
export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}"
}
pathappend () {
pathremove $1 $2
local PATHVARIABLE=${2:-PATH}
export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1"
}
# Set the initial path
export PATH=/bin:/usr/bin
if [ $EUID -eq 0 ] ; then
pathappend /sbin:/usr/sbin
unset HISTFILE
fi
# Setup some environment variables.
export HISTSIZE=1000
export HISTIGNORE="&:[bf]g:exit"
# Setup a red prompt for root and a green one for users.
NORMAL="\[\e[0m\]"
RED="\[\e[1;31m\]"
GREEN="\[\e[1;32m\]"
if [[ $EUID == 0 ]] ; then
PS1="$RED\u [ $NORMAL\w$RED ]# $NORMAL"
else
PS1="$GREEN\u [ $NORMAL\w$GREEN ]\$ $NORMAL"
fi
for script in /etc/profile.d/*.sh ; do
if [ -r $script ] ; then
. $script
fi
done
# Now to clean up
unset pathremove pathprepend pathappend
# End /etc/profile
EOF
install --directory --mode=0755 --owner=root --group=root /etc/profile.d
cat > /etc/profile.d/dircolors.sh << "EOF"
# Setup for /bin/ls to support color, the alias is in /etc/bashrc.
if [ -f "/etc/dircolors" ] ; then
eval $(dircolors -b /etc/dircolors)
if [ -f "$HOME/.dircolors" ] ; then
eval $(dircolors -b $HOME/.dircolors)
fi
fi
alias ls='ls --color=auto'
EOF
cat > /etc/profile.d/readline.sh << "EOF"
# Setup the INPUTRC environment variable.
if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ] ; then
INPUTRC=/etc/inputrc
fi
export INPUTRC
EOF
cat > /etc/profile.d/umask.sh << "EOF"
# By default we want the umask to get set.
if [ "$(id -gn)" = "$(id -un)" -a $EUID -gt 99 ] ; then
umask 002
else
umask 022
fi
EOF
cat > /etc/profile.d/i18n.sh << "EOF"
# Set up i18n variables
export LANG=zh_CN.UTF-8
EOF
cat > /etc/bashrc << "EOF"
# Begin /etc/bashrc
# Written for Beyond Linux From Scratch
# by James Robertson
# updated by Bruce Dubbs
# System wide aliases and functions.
# System wide environment variables and startup programs should go into
# /etc/profile. Personal environment variables and startup programs
# should go into ~/.bash_profile. Personal aliases and functions should
# go into ~/.bashrc
# Provides a colored /bin/ls command. Used in conjunction with code in
# /etc/profile.
alias ls='ls --color=auto'
# Provides prompt for non-login shells, specifically shells started
# in the X environment. [Review the LFS archive thread titled
# PS1 Environment Variable for a great case study behind this script
# addendum.]
NORMAL="\[\e[0m\]"
RED="\[\e[1;31m\]"
GREEN="\[\e[1;32m\]"
if [[ $EUID == 0 ]] ; then
PS1="$RED\u [ $NORMAL\w$RED ]# $NORMAL"
else
PS1="$GREEN\u [ $NORMAL\w$GREEN ]\$ $NORMAL"
fi
# End /etc/bashrc
EOF
cat > ~/.bash_profile << "EOF"
# Begin ~/.bash_profile
# Written for Beyond Linux From Scratch
# by James Robertson
# updated by Bruce Dubbs
# Personal environment variables and startup programs.
# Personal aliases and functions should go in ~/.bashrc. System wide
# environment variables and startup programs are in /etc/profile.
# System wide aliases and functions are in /etc/bashrc.
append () {
# First remove the directory
local IFS=':'
local NEWPATH
for DIR in $PATH; do
if [ "$DIR" != "$1" ]; then
NEWPATH=${NEWPATH:+$NEWPATH:}$DIR
fi
done
# Then append the directory
export PATH=$NEWPATH:$1
}
if [ -f "$HOME/.bashrc" ] ; then
source $HOME/.bashrc
fi
if [ -d "$HOME/bin" ] ; then
append $HOME/bin
fi
unset append
# End ~/.bash_profile
EOF
cat > ~/.bashrc << "EOF"
# Begin ~/.bashrc
# Written for Beyond Linux From Scratch
# by James Robertson
# Personal aliases and functions.
# Personal environment variables and startup programs should go in
# ~/.bash_profile. System wide environment variables and startup
# programs are in /etc/profile. System wide aliases and functions are
# in /etc/bashrc.
if [ -f "/etc/bashrc" ] ; then
source /etc/bashrc
fi
# End ~/.bashrc
EOF
dircolors -p > /etc/dircolors
cat > /etc/shells << "EOF"
# Begin /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/proftpdshell
# End /etc/shells
EOF
创建initrd和ISO
代码:
cd /initrd
find . | cpio -o -H newc | gzip -9 > /boot/initrd.img-2.6.22.1
umount $LFS/{proc,sys,dev/shm,dev/pts,dev} #在宿主系统中执行
/sources/squashfs3.2-r2/squashfs-tools/mksquashfs bin boot dev etc home lib media mnt opt proc root sbin srv sys tmp usr var /sources/root.sqfs
下面代码需要在宿主系统中操作
代码:
cd $LFS
mkdir -p isolinux/boot/grub
cp ${LFS}/boot/{initrd.img-2.6.22.1,vmlinuz-2.6.22.1} isolinux/boot/
cp ${LFS}/usr/lib/grub/i386-pc/{stage2_eltorito,stage1,stage2} isolinux/boot/grub/
cp ${LFS}/sources/root.sqfs isolinux/
cat > isolinux/boot/grub/menu.lst <<"EOF"
default 0
timeout 5
title lfs(kernel 2.6.22.1)
kernel /boot/vmlinuz-2.6.22.1 vga=788
initrd /boot/initrd.img-2.6.22.1
EOF
mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o lfs.iso isolinux
至此,liveCD已经完成,$LFS目录下的lfs.iso就是最终的光盘映象文件,可以用虚拟机挂载上,看看效果了
因为写得仓促,如有错误之处,敬请指正