LFS(Linux From Scratch)是一种由源代码来制作Linux发布的一种方法。这种方法从一个现有的发布版本(例如,ReaHat,Ubuntu或LFS提供的Live CD等)开始,然后下载相关软件的源代码并编译,最终生成一个新的Linux发布版本。LFS主要提供了一本描述上述制作步骤的。以源代码为起点一步一步按照书中给出的指导进行制作工作,对于学习Linux相关的背景知识大有裨益,但是需要有足够的时间和耐心。
受到内存和硬盘容量的限制,我在工作中需要用到一个纯粹命令行的Linux发布版本,但是主流的Linux的各个发行版本都不提供这种纯粹命令行的环境,所以需要自己制作一个,LFS自然是一种选择(另外一种从源代码开始工作的发行方式是)。由于LFS要求的制作周期长,而自己只是出于工作的考虑,暂时没有系统学习的需要,所以我希望能够由LFS的Live CD为起点,直接将其中已经编译好的、运行很稳定的Linux系统直接安装到硬盘上。前日有幸读到Myhsg的文章《把LFS LiveCD安装到硬盘》,该文为我解决了实际问题。关于制作的工作原理,可以参考该文章。下面列出我在虚拟机环境中制作的详细步骤。
# 虚拟机:VMware 6.5 Workstation
# LFS:
# 在硬盘上创建文件系统,并将livecd中的数据复制到该文件系统中
# /dev/hda1是根文件系统,/dev/hda2是交换区
- fdisk /dev/hda
-
- mke2fs -j /dev/hda1
-
- mkswap /dev/hda2
-
- mkdir /mnt/livehd
-
- mount /dev/hda1 /mnt/livehd
-
- mkdir /mnt/livecd
-
- mount -o loop /dev/shm/.cdrom/root.ext2 /mnt/livecd
-
- cp -Rv /mnt/livecd/* /mnt/livehd
# 将后面用到的一些软件复制到硬盘
- mkdir /mnt/cdrom
-
- mount -t iso9660 /dev/cdrom /mnt/cdrom
-
- cp /mnt/cdrom/lfs-sources/linux* /mnt/livehd/usr/src
-
- cp /mnt/cdrom/lfs-sources/grub* /mnt/livehd/usr/src
-
- cp /mnt/cdrom/lfs-sources/lfs* /mnt/livehd/usr/src
# 切换到硬盘工作
- mount --bind /dev /mnt/livehd/dev
-
- chroot /mnt/livehd
# 编译内核源码,省略了源代码解压和切换目录的操作(下同)。
- make LANG=$LANG LC_ALL= menuconfig
-
- make
-
- make modules_install
-
- mkdir /boot
-
- cp arch/i386/boot/bzImage /boot/lfskernel-2.6.22.5
-
- cp System.map /boot/System.map-2.6.22.5
-
- cp .config /boot/config-2.6.22.5
-
- install -d /usr/share/doc/linux-2.6.22.5
-
- cp -r Documentation/* /usr/share/doc/linux-2.6.22.5
-
# 重新安装grub
- patch -Np1 -i ../grub-0.97-disk_geometry-1.patch
-
- ./configure --prefix=/usr
-
- make
-
- make install
-
- make clean
-
- mkdir /boot/grub
-
- cp /usr/lib/grub/i386-pc/stage{1,2} /boot/grub
-
- cp /usr/lib/grub/i386-pc/e2fs_stage1_5 /boot/grub
-
- cp /usr/lib/grub/i386-pc/reiserfs_stage1_5 /boot/grub
-
- cat > /boot/grub/menu.lst << "EOF"
-
- default 0
-
- timeout 0
-
- title LFS 6.3
-
- root (hd0,0)
-
- kernel /boot/lfskernel-2.6.22.5 root=/dev/hda1 quiet
-
- EOF
-
- grub
-
- root (hd0,0)
-
- setup (hd0)
-
- quit
# 重新安装启动脚本lfs-bootscripts
- make install
# 修改/etc/inittab文件
- 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
# 修改/etc/fstab文件
- cat > /etc/fstab << "EOF"
-
- # Begin /etc/fstab
-
- # file system mount-point type options dump fsck order
-
- /dev/hda1 / ext3 defaults 1 1
-
- /dev/hda2 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
# 下面的步骤二选一。
# 建立网络接口,采用DHCP服务,可以用默认设置
- cat > /etc/sysconfig/network-devices/ifconfig.eth0 << "EOF"
-
- ONBOOT="yes"
-
- SERVICE="dhcpcd"
-
- DHCP_START="-t 20"
-
- DHCP_STOP="-k"
-
- EOF
# 建立网络接口,采用静态IP地址
- 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
# 修改/etc/resolv.conf,使DNS服务器指向路由器
- cat > /etc/resolv.conf << "EOF"
-
- nameserver 192.168.0.254
-
- EOF
# 编辑/etc/sysconfig/network,修改主机名
- HOSTNAME=lfs
# 修改root用户的密码
- passwd root
#启动ssh
- touch .autosshd
# 默认情况下/usr/bin/sudo命令不是setuid程序,用root账户改变
# 此外,还要对/etc/sudoers文件做相应的设置
- chmod u+s /usr/bin/sudo