一名linux爱好者,记录构建Linux From Scratch的过程
经博客园-骏马金龙前辈介绍,开始接触学习lfs,用博客记录学习笔记,如有写的不恰当的地方,望多多指正。
笔记中只是记录一些问题和书中表述不清晰的内容的处理办法以及我的解决思路,仅做参考。
要实际构建lfs请结合lfs官方的书籍操作
一.lfs系列概述
1.lfs:Linux From Scratch(LFS)是一个项目,为您提供完全从源代码构建自己的自定义Linux系统的分步说明
2.blfs:Beyond Linux From Scratch(BLFS)是一个继续LFS书籍完成的项目。它通过提供在基本LFS系统之上安装和配置各种软件包的广泛说明,帮助用户根据需要开发系统。
3.alfs:Automated Linux From Scratch (ALFS)是一个为可扩展系统构建器和程序包安装程序创建通用框架的项目。(自动化创建LFS系统的过程)
4.clfs:Cross Linux From Scratch(CLFS)是一个使用其他架构从源代码构建自己的定制Linux系统的分步说明
5.hlfs:Hardened Linux From Scratch (HLFS)是一个为您提供从源完全构建您自己的定制和强化Linux系统的分步说明。基于LFS,该项目还将包含BLFS的部分内容。与这些其他项目的主要区别在于处理安全配置问题的文本数量,以及修补或替换许多用于提高安全性的软件包。
6.livecd:LFS LiveCD专门用于提供可靠的主机系统,以便构建Linux From Scratch。因此,它可能不是您想象的“完美”Linux系统。但是,它应该为您提供足够舒适的环境,以便您可以反过来建立自己的“完美”系统
二.lfs版本说明
1.lfs系列每本书籍都有两个版本
一个版本是安装并使用systemv的版本
另一个版本是安装并使用systemd的版本
本篇笔记使用的是systemd版本书籍。
三.构建过程中使用到的网站
1.lfs书籍原版(英文)下载链接:http://www.linuxfromscratch.org/lfs/downloads/stable-systemd/LFS-BOOK-8.4-systemd.tar.bz2
2.文件镜像网站汇总:http://www.linuxfromscratch.org/mirrors.html
四.使用的机器信息,系统信息,书籍信息
1.使用的机器型号:Thinkpad-L450
2.使用过的主机操作系统:deepin-15.9
3.使用lfs书籍版本lfs-book-8.4-systemd(官网英文版)
五.前期准备工作
书中第2.2章节
1.具体操作:
将书中提供的命令复制到终端(命令行)运行测试,并把得出结果与2.2章节所提供的软件版本链接类型进行核对,核对无误后可删除创建的验证文件。
2.所遇到过的问题与解决方案:
1.有部分软件包未找到,按照错误提示的名字安装对应的软件包
2.未检测到/usr/bin/yacc是bison或执行bison的小脚本的链接
解决办法:
#ln -s /usr/bin/bison /usr/bin/yacc (建立链接)
类似问题解决思路:检查缺失链接的软件包是否安装,如果都已经安装,则手动建立软链接:
3./bin/sh的链接不是bash而是dash
执行如下命令并选择否
#dpkg-reconfigure dash
书中第2.3章节
注意:
如果不能做到在不关机的情况下一次性构建完lfs,请仔细阅读本节内容
1.具体操作:
第1-4章节
每次重新启动后创建环境变量:
第5章节
1.设置变量
2.挂载为lfs创建的所有分区
3.切换到lfs用户,进行下一步的操作。4.提示对软件包编译过程中出现解决不了的操作失误,首先删除所解压的软件包目录,重新解压软件包,切入目录,按该软件包书籍页操作说明重新进行编译。
第6-8章节
1.进入root用户
2.设置变量
3.挂载你为lfs创建的所有分区
4.逐步完成6.2.2与6.2.3章节内容后
5.chroot进入lfs分区继续操作。
书中第2.4章节
1.本章节开始所有操作切换为root用户,命令如下
su
2.为lfs创建新的分区,列出我的分区方案
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 465.8G 0 disk ├─sda9 8:9 0 100M 0 part /mnt/lfs/boot ├─sda10 8:10 0 50G 0 part /mnt/lfs ├─sda11 8:11 0 40G 0 part /mnt/lfs/home └─sda12 8:12 0 1G 0 part [SWAP]
3.注意事项:
1.分区使用的命令 cfdisk或fdisk
2.boot建议单独分区。建议分100M。
3./分区必须创建,根据机器情况自行分配大小(官方建议最小分20G)。
4.home建议单独分区,大小按需分配即可。
5.swap可以与主机系统用同一个swap分区,也可以单独分区。
书中第2.5章节
1.创建文件系统(只介绍常用的ext4格式类型)
2.除了swap分区以外的分区,使用如下命令格式化:
#mkfs -v -t ext4 /dev/<xxx>(替换<xxx>和<yyy>为分区的名称)
3.swap分区如果是新分区则使用如下命令格式化:
#mkswap /dev/<yyy>(替换<xxx>和<yyy>为分区的名称)
书中第2.6章节
1.设置lfs变量,运行的命令及作用:
export LFS=/mnt/lfs(使用$LFS代替输入/mnt/lfs目录,每次关闭机器或终端都需要重新设置)
echo $LFS(输出$LFS变量的内容,确保输出为:/mnt/lfs)
2.本章节书籍中的下文内容介绍如何设置开机运行变量,不建议此项设置。
3.变量设置在每次重启机器或者重启终端时都需要重新设置,详细参考2.3章节的笔记
书中第2.7章节
挂载分区
使用的命令及作用:
#mkdir -pv $LFS(在当前系统的根目录下创建一个/mnt/lfs的目录) #mount -v -t ext4 /dev/<yyy> $LFS(替换<yyy>为根分区位置,将根分区挂载到/mnt/lfs目录) #mkdir -v $LFS/boot(在/mnt/lfs分区下创建boot目录) #mount -v -t ext4 /dev/<yyy> $LFS/boot(<yyy>替换为boot分区位置,将boot分区挂载到/mnt/lfs/boot目录) #mkdir -v $LFS/home(在/mnt/lfs目录下创建home目录) #mount -v -t ext4 /dev/<yyy> $LFS/home(<yyy>替换为home分区位置,将boot分区挂载到/mnt/lfs/home目录) #/sbin/swapon -v /dev/<zzz>(替换<zzz>为分配的swap分区位置,启用swap分区) lsblk(查看分区表是否正确)
书中本章节中的警告内容为如何设置开机自动挂载lfs的分区(不建议)
六.下载所需资源
1.在任意目录下创建alfs目录
mkdir alfs
2.下载所需的所有软件包
wget https://mirror-hk.koddos.net/lfs/lfs-packages/lfs-packages-8.4.tar tar -xvf lfs-packages-8.4.tar
3.下载所需书籍(需要主机安装subversion)
svn co http://svn.linuxfromscratch.org/LFS/tags/8.4/
4.下载alfs所需软件包
svn co http://svn.linuxfromscratch.org/ALFS/jhalfs/trunk jhalfs-dev
七.配置jhalfs-dev
1.进入jhalfs目录,并打开设置页面
cd jhalfs-dev make
这里会提示缺少一些依赖,因为每台主机所缺少的依赖不同,所以不贴出依赖了,请自行按照依赖名字安装所需依赖
2.设置第一步,选择所使用的书籍
BOOK Settings ---> Use BOOK (Linux From Scratch systemd) ---> Use BOOK (Linux From Scratch systemd) ---> Release (Working Copy) ---> Loc of working copy (mandatory) (/8.4)(这里更改为你放置上文下载的书籍的绝对路径) [ ] Add blfs-tool support (NEW) [ ] Add custom tools support (NEW)
3.设置第二步,选择所使用的软件包,和安装位置
General Settings ---> Build Directory (/mnt/lfs) (修改为上文修改的安装目录建议使用官方的lfs目录) [*] Retrieve source files Package Archive Directory (/ruanjianbaomulu)(修改为上文下载的软件包的解压目录的绝对路径) [ ] Retry on 'connection refused' failure (NEW) Number of retry attempts on download failures (20) (NEW) Download timeout (in seconds) (30) (NEW) FTP mirror (http://ftp.osuosl.org) (NEW) [ ] Run the makefile (NEW) [*] Rebuild files
4.设置第三步,构建设置
Build Settings ---> [*] Run testsuites (NEW) Test settings ---> [ ] Package management (NEW) [*] Create a log of installed files for each package [*] Strip Installed Binaries/Libraries [*] Remove libtool .la files (NEW) [ ] DO NOT use/display progress_bar (NEW)
5.设置第四步,系统服务设置
System configuration ---> [ ] Use a custom fstab file (NEW) [ ] Build the kernel (NEW) [ ] Install vim-lang package (NEW) TimeZone (Asia/Shanghai) Language (en_US.UTF-8) [*] Install the full set of locales(如果会修改脚本,请取消这个选项,自行修改脚本安装语言环境)
Groff page size (A4) ---> Hostname (see help) (ZHUJIMINGZI) Network configuration ---> Console configuration --->
6.确定操作,创建构建文件,修改构建脚本
选择exit后选择yes后输入yes,开始创建构建文件
创建完后进入构建文件目录按照自己的配置要求修改脚本(这一步如果懂脚本的自行修改,不懂的不要修改)
7.创建构建用户,并给sudo权限
useradd -m jhalfs_user passwd jhalfs_user visudo 再打开的文件内加入
jhalfs_user ALL=(ALL)ALL
su - jhalfs_user
8.开始安装
make -C /mnt/build_dir/jhalfs(这个目录修改为上文选择的安装目录)
安装过程需要输入三次密码,分别是:开始构建时,构建完工具链后,构建完所有软件包后,
八.自动化构建完后需要的配置
1.挂载并进入系统
具体方法,参照我以前的笔记:https://www.cnblogs.com/renren-study-notes/p/10204516.html
2.设置root的密码
passwd
3.删除本机创建的用户
userdel -r jhalfs_user
4.修改/etc/fstab文件
更改为lfs所创建的分区到相应位置即可(这个文件是配置lfs开机自动挂载的分区) cat > /etc/fstab << "EOF" # Begin /etc/fstab # file system mount-point type options dump fsck # order /dev/<xxx> / <fff> defaults 1 1 /dev/<yyy> swap swap pri=1 0 0 # End /etc/fstab EOF
5.引导时禁用屏幕清除
mkdir -pv /etc/systemd/system/getty@tty1.service.d cat > /etc/systemd/system/getty@tty1.service.d/noclear.conf << EOF [Service] TTYVTDisallocate=no EOF
6.禁用/ tmp的tmpfs
ln -sfv /dev/null /etc/systemd/system/tmp.mount
7.如果电脑上面是多系统,并且有windows系统,就不要使用系统硬件时间作为系统时间(会有时差)。如果没有windows系统不需要更改。具体内容参见:我的linux时间综述笔记地址:https://www.cnblogs.com/renren-study-notes/p/10229743.html
硬件时间设置为本地时间
cat > /etc/adjtime << "EOF" 0.0 0 0.0 0 LOCAL EOF
8.编译安装内核
(1)首先进入sources目录
cd /sources
(2)解压内核文件压缩包
tar -xvf linux-4.18.5.tar.xz
(3)进入内核包目录
cd linux-4.18.5
(4)准备编译
make mrproper
(5)设置默认内核配置状态
make defconfig
(6)设置内核也可以通过修改.config文件来进行设置
make menuconfig
(7)设置书中提供的以下选项
General setup --> [ ] Enable deprecated sysfs features to support old userspace tools [CONFIG_SYSFS_DEPRECATED] [ ] Enable deprecated sysfs features by default [CONFIG_SYSFS_DEPRECATED_V2] [*] open by fhandle syscalls [CONFIG_FHANDLE] [ ] Auditing support [CONFIG_AUDIT] [*] Control Group support [CONFIG_CGROUPS] Processor type and features ---> [*] Enable seccomp to safely compute untrusted bytecode [CONFIG_SECCOMP] Networking support ---> Networking options ---> <*> The IPv6 protocol [CONFIG_IPV6] Device Drivers ---> Generic Driver Options ---> [ ] Support for uevent helper [CONFIG_UEVENT_HELPER] [*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS] [ ] Fallback user-helper invocation for firmware loading [CONFIG_FW_LOADER_USER_HELPER] Firmware Drivers ---> [*] Export DMI identification via sysfs to userspace [CONFIG_DMIID] File systems ---> [*] Inotify support for userspace [CONFIG_INOTIFY_USER] <*> Kernel automounter version 4 support (also supports v3) [CONFIG_AUTOFS4_FS] Pseudo filesystems ---> [*] Tmpfs POSIX Access Control Lists [CONFIG_TMPFS_POSIX_ACL] [*] Tmpfs extended attributes [CONFIG_TMPFS_XATTR] Kernel hacking ---> Choose kernel unwinder (Frame pointer unwinder) ---> [CONFIG_UNWINDER_FRAME_POINTER]
(8)如果您的主机硬件使用UEFI,请自行添加此项设置
Processor type and features ---> [*] EFI stub support [CONFIG_EFI_STUB]
(9)设置调整完保存退出即可
(10)编译内核映像和模块
make -j8
(11)安装配置模块
make modules_install
(12)复制一些内核的启动文件到boot分区
cp -iv arch/x86/boot/bzImage /boot/vmlinuz-4.18.5-lfs-8.3-systemd
cp -iv System.map /boot/System.map-4.18.5
cp -iv .config /boot/config-4.18.5
(13)安装Linux内核的文档:
install -d /usr/share/doc/linux-4.18.5 cp -r Documentation/* /usr/share/doc/linux-4.18.5
(14)配置linux模块加载顺序
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
(15)返回sources目录并删除包目录
cd $LFS/sources rm -rf linux-4.18.5
9.安装配置grub引导
(1)安装grub引导到MBR
grub-install /dev/sda
(2)创建grub配置文件
cat > /boot/grub/grub.cfg << "EOF" # Begin /boot/grub/grub.cfg set default=0 set timeout=5 insmod ext2 set root=(hd0,2) 括号里面更改为你所安装lfs的分区或boot分区 例如/dev/sda2为(hd0,2) menuentry "GNU/Linux, Linux 4.18.5-lfs-8.3" { linux /boot/vmlinuz-4.18.5-lfs-8.3 root=/dev/sda2 ro(这里的/dev/sda2更改为你所安装lfs的分区号 例如/dev/sda2) } (如果boot单独分区,则把这里的/boot删除。)
EOF
多系统引导文件示例:
cat > /boot/grub/grub.cfg << "EOF" # Begin /boot/grub/grub.cfg set default=0 set timeout=5 menuentry "GNU/Linux, Linux 4.18.5-lfs-8.3" { insmod ext2 set root=(hd0,5) linux /vmlinuz-4.18.5-lfs-8.3 root=/dev/sda6 ro } menuentry 'Manjaro Linux'{ insmod ext2 set root='hd0,msdos9' linux /vmlinuz-4.19-x86_64 root=/dev/sda10 ro initrd /intel-ucode.img /initramfs-4.19-x86_64.img } menuentry 'Windows 7 (on /dev/sda1)'{ insmod ntfs set root='hd0,msdos1' chainloader +1 } EOF
10.设置系统版本及版本号
cat > /etc/os-release << "EOF"
NAME="Linux From Scratch" VERSION="8.3-systemd" ID=lfs PRETTY_NAME="Linux From Scratch 8.3-systemd" VERSION_CODENAME="<your name here>"(括号里改为自己起的名字) EOF echo 8.3-systemd > /etc/lfs-release cat > /etc/lsb-release << "EOF" DISTRIB_ID="Linux From Scratch" DISTRIB_RELEASE="8.3-systemd" DISTRIB_CODENAME="<your name here>"(括号里改为自己起的名字) DISTRIB_DESCRIPTION="Linux From Scratch" EOF
11.修改网络配置
1.删除静态ip文件和/etc/resolv.conf文件
rm -rf /etc/resolv.conf rm -rf /etc/systemd/network/10-eth-static.network
2.新建resolv.conf文件和hosts文件
cat > /etc/resolv.conf << "EOF" # Begin /etc/resolv.conf domain <Your Domain Name> nameserver 8.8.8.8 nameserver 8.8.4.4 # End /etc/resolv.conf EOF
cat > /etc/hosts << "EOF" # Begin /etc/hosts 127.0.0.1 localhost 127.0.1.1 <FQDN> <HOSTNAME> ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters # End /etc/hosts EOF
12.运行下面的命令,退出chroot,卸载lfs的分区
exit umount -v $LFS/dev/pts umount -v $LFS/dev umount -v $LFS/run umount -v $LFS/proc umount -v $LFS/sys umount -v $LFS umount -v $LFS/usr umount -v $LFS/home umount -v $LFS
重启进入lfs系统
reboot
附录
如果需要本机的grub引导lfs则在root用户下运行以下命令创建lfs的引导项
需要安装os-prober软件包,并挂载lfs的分区,在运行下面命令,添加lfs的启动项
grub-mkconfig -o /boot/grub/grub.cfg
确定添加完lfs引导项后,重启机器进入lfs选项,即可进入lfs操作系统。