周末花2天时间,基于LFS 9.1构筑了自己的Linux系统,成功引导,兴奋。网上看了下没看到有几个写到点子上的,分享一下。
请结合着LFS的网站,看我写的这个总结。适合Linux中级以上水平的同学。
LFS(Linux From Scratch),就是从Linux的源代码,构筑自己的Linux系统。对于深入学习Linux的原理、工具包的详细内容,是个很好的资源。想想,自己编译一个自己的操作系统,是不是很兴奋呢!
LFS 9.1具体分4部分,第1、4基本没啥用,重点是第2、3部分。
第2部分,准备编译工具,第3部分,使用编译工具构筑真正的系统。其实,我这里基本也是屁话,但是得放,跟你掌握整体的内容有关。这里只分享关键的注意点(在我看来的)——也就是书里没有说太细或没有总结太好的,体力活和打字打错的问题,请自行解决。
一、构筑环境
VMware 12.1.1;
基于CentOS 8.1——默认安装(英文语言)、没有update;
我用putty,ssh连接——你懂的,你可以选你喜欢的ssh工具;
添加了一块虚拟硬盘——18G。
二、LFS的第2章,准备CentOS 8.1软硬件环境
安装texinfo时有一个小问题,参见: 激活PowerTools
执行下面的脚本可以解决texinfo安装的问题:
yum config-manager --set-enabled PowerTools
yum install -y bash binutils bison bzip2 coreutils diffutils findutils gawk gcc-c++ glibc grep gzip m4 make patch perl sed python3 texinfo tar xz wget vim
fdisk分区,根据习惯分成了3个区:
fdisk分区
# lsblk -f
sdb
|-sdb1 ext4 * 800M /boot # 引导分区
|-sdb2 swap 2G [SWAP]
`-sdb3 ext4 15.2G /
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb3
mkswap /dev/sdb3
三、第2~5章 构筑一个临时系统
临时系统也好,编译工具也好,就是为书里面PART III构筑真正的系统做准备的。
体力活自己干,强调一点,编译时所有的测试都不做——快。
2至4章完事后,进入第5章时或在第5章的某个阶段暂停/重启机器之类操作后,再继续LFS的脚本,我也不可能不吃饭:
#!/bin/sh
export LFS=/mnt/lfs
mount /dev/sdb3 $LFS
su - lfs
注意:这个阶段,请严格安装书里做,先积累个经验,不要上来就换自己想要的版本,不然弄错了,你会很难受的——当然,你够细心也行;
整个一遍下来,除了吃饭,大半天也完事了。
四、LFS书里的PART III①
PART II完事后,进入第6章时或在第6章的某个阶段暂停/重启机器之类操作后,再继续LFS的脚本。
这里,再继续分为:第一次再继续和后面的再续(开机后,进入LFS构筑我称为第一次,后续为再续):
第一次进入的脚本
#!/bin/sh
export LFS=/mnt/lfs
mount /dev/sdb2 $LFS
mount -v --bind /dev $LFS/dev
# Preparing Virtual Kernel File Systems
mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run
chroot "$LFS" /tools/bin/env -i \
HOME=/root \
TERM="$TERM" \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
/tools/bin/bash --login +h
第一次之后,再进入的脚本
#!/bin/sh
export LFS=/mnt/lfs
chroot "$LFS" /tools/bin/env -i \
HOME=/root \
TERM="$TERM" \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
/tools/bin/bash --login +h
第6章,我也觉得没啥注意的内容,完全是体力活——照着书里的做就可以,一定要对照自己的环境,该改的地方要改。
第6章结束后,再继续LFS的脚本
第一次进入的脚本
#!/bin/sh
export LFS=/mnt/lfs
mount /dev/sdb2 $LFS
mount -v --bind /dev $LFS/dev
# Preparing Virtual Kernel File Systems
mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run
chroot "$LFS" /usr/bin/env -i \
HOME=/root TERM="$TERM" \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/bin/bash --login
第一次之后,再进入的脚本
#!/bin/sh
export LFS=/mnt/lfs
chroot "$LFS" /usr/bin/env -i \
HOME=/root TERM="$TERM" \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/bin/bash --login
第7章不说,结合自己的环境照着做就可以。
五、LFS书里的PART III②
PART III的第8章,或者说太重要了,或者说我在这里遇到了坑,单独拿出来说。
第8章比较重要的主要有两部分:内核编译、Grub引导系统,好多人载在这里。
内核编译,很重要——除了内核本身重要外,还有这里做不好,系统就启不来。会出现:
这个错误的原因,跟两方面因素有关:1是内核不支持硬件或者不支持filesystem,后来看是不支持VMware的SCSI设备;2是没有使用支持硬件的initramfs镜像。具体不解释了,要很长的话说。
内核的编译有几项配置,对于VMware必须要选中,主要是:
Device Drivers --->
# Optional, required for VMware virtual machines
# Begin here
Misc devices --->
<*> VMware VMCI Driver
# End here
SCSI device support --->
# Optional, required for VMware virtual machines
[*] SCSI low-level drivers --->
<*> BusLogic SCSI support (used by older VMware virtual solutions, can be optionally selected)
<*> VMware PVSCSI driver support (used by vSphere I think, but not by default, can be used by Player and Workstation too)
文件系统,如果采用ext4,可以不用配置。
内核编译的步骤,剩下的安装啥的照书里做就行:
make mrproper
make defconfig
make menuconfig # 在这里选择上面的内容
make -j2 # 我这里写j2因为我给虚拟机配置了1个CPU、2个核心
make modules_install
cp -iv arch/x86_64/boot/bzImage /boot/vmlinuz-5.6.12-lfs-9.1 # 我的是64位系统
具体参照:
1、Basic Kernel
2、Make LFS bootable
Grub引导的创建
Grub引导的创建,首先确定你的boot分区是个引导分区;然后,把内核编译后的内容,弄到boot分区里去。
grub的急救盘用不着,而且书里说的那个软件还得装。
然后安装书里说的:
grub-install /dev/sdb
注意:这一步的作用是什么?我实际验证的结果是在/dev/sdb上加入了Grub的引导,如果要启动就要编辑当前的Grub菜单加入这块盘的条目。
我的目标是:只使用一块lfs的虚拟硬盘,启动我自己的LFS系统。到现在,直接修改虚拟机——把CentOS8.1的硬盘删除,使用制作的LFS硬盘启动。这个时候,要注意修改:[/etc/fstab]及[/<boot分区>/grub/grub.cfg]文件,硬盘的序号和挂载的分区要对应上。
下面是我的/boot/grub/grub.cfg,因为我的是独立的boot分区:
cat > /boot/grub/grub.cfg << "EOF"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5
insmod ext2
set root=(hd0,1)
menuentry "GNU/Linux, Linux 5.6.12-lfs-9.1" {
linux /vmlinuz-5.6.12-lfs-9.1 root=/dev/sda3 ro
}
EOF
一切都修改正确后,启动出现(这图是网上找的,不过界面是一样的):
这就成功了99%了,剩下的1%,一会儿再说。在上面的小窗口中,敲入grub引导的内容: 参考 Grub2: 拯救你的bootloader
set root=(hd0,1)
linux /vmlinuz-5.6.12-lfs-9.1 root=/dev/sda3 ro
boot
注意:一行一回车。
然后,就出现:
登录,成功,有木有很激动。
现在解决,剩下的那1%。输入:lsblk,出现:
以前的sdb变成了sda,执行:
grub-install /dev/sda
再重启,OK。
后来又验证了下,Grub Minimal Bash-like的小黑框的出现,跟我grub-install时没有设定好boot的目录有关——当时boot盘的目录挂到了/mnt/lfsb,grub-install时应该是如下的命令:
grub-install --boot-directory=/mnt/lfsb /dev/sdb
六、其它
根据Errata for LFS v9.1,我在第6章的真枪实蛋部分,采用了以下版本的软件:
gcc-9.3.0.tar.xz
linux-5.6.12.tar.xz
perl-5.30.2.tar.xz
python-3.8.3-docs-html.tar.bz2
Python-3.8.3.tar.xz
vim-8.2.0716.tar.gz
又根据BLFS,安装了:
openssh-8.2p1.tar.gz
wget-1.20.3.tar.gz
根据书里的内容sshd的配置修改为:
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
这样整个Linux系统就很爽了。
这么折腾一通,有个蛋用呢?其实,一是学习;二是弄一个自己专属的系统,你不觉得很扯么,对人吹牛逼:我用自己的Linux;三,我觉得是最重要的,这个系统的足迹很小、完全自己可控——一切的一切,看看下面的吧,在我启动sshd之后: