lfs学习笔记(三)最终构建与配置
lfs学习笔记(三)链接:
一名linux爱好者,记录构建linux from scratch的过程
经博客园-骏马金龙前辈介绍,开始接触学习lfs,用博客记录学习笔记,如有写的不恰当的地方,望多多指正。
笔记中只是记录一些问题和书中表述不清晰的内容的处理办法以及我的解决思路,仅做参考。
要实际构建lfs请结合lfs官方的书籍操作。
linux from scratch(lfs)是一个项目书籍,提供完全从源代码构建自己的自定义linux系统的分步说明。
构建过程中使用到的网站:
lfs书籍原版(英文)下载链接:http://www.linuxfromscratch.org/lfs/downloads/stable/lfs-book-8.3.tar.bz2
lfs(linux中国翻译版)下载链接:https://codeload.github.com/lctt/lfs-book/zip/8.3-translating
文件镜像网站汇总:
使用的机器型号:thinkpad-l450
使用主机操作系统:manjaro-xfce-18.0.1
使用lfs书籍版本lfs-book-8.3(官网英文版)
第6.7章
开始构建第一个包
第六章中构建的所有包必须进行测试。
软件构建过程:
以下以linux api headers包为例,其后的软件包构建过程大同小异,出现不同的选项会在后面补充,不完全贴出书中内容。
这时你的命令行或终端的环境应该是:
1.设置变量:
2.挂载你为lfs创建的所有分区
3.逐步完成6.2.2与6.2.3章节内容后
4.chroot进入lfs分区继续操作。
根据上一章节的构建要求,首先进入到/mnt/lfs/sources/sources目录
cd /sources
因为linux api headers在linux-4.18.5.tar.xz包中,所以解压包:
tar -xvf linux-4.18.5.tar.xz
进入解压完的软件:
cd linux-4.18.5
运行书中的编译说明
make mrproper make install_hdr_path=dest headers_install find dest/include \( -name .install -o -name ..install.cmd \) -delete cp -rv dest/include/* /usr/include
1.在软件包编译,测试,安装过程中出现的如下命令:
make make check make tests
make test make install
在没有要求必须使用make -j1参数的情况下,make后面都可加 -j(n) 参数 提升速度
(-j [n], --jobs[=n] 同时允许 n 个任务;无参数表明允许无限个任务)
软件包编译安装完成后,书中会有一些相应的配置说明,完成这些操作说明。
运行完每书中每个软件包页最后一个命令后运行:
cd /mnt/lfs/sources(返回sources目录) rm -rf binutils-2.31.1(删除解压的软件包目录)
继续构建下一个软件包
第6.9章
glibc的配置
按照书籍安装步骤到(可以使用localedef程序安装单个语言环境)步骤
我们需要安装英文语言环境和中文语言环境
1.创建语言环境安装目录
mkdir -pv /usr/lib/locale
2.安装语言环境
localedef -i en_us -f utf-8 en_us.utf-8 localedef -i zh_cn -f utf-8 zh_cn.utf-8
第6.9.22章
添加时区数据,这里我们添加亚洲/上海时区
1.安装和设置时区数据
tar -xf ../../tzdata2018e.tar.gz zoneinfo=/usr/share/zoneinfo mkdir -pv $zoneinfo/{posix,right} for tz in etcetera southamerica northamerica europe africa antarctica \ asia australasia backward pacificnew systemv; do zic -l /dev/null -d $zoneinfo -y "sh yearistype.sh" ${tz} zic -l /dev/null -d $zoneinfo/posix -y "sh yearistype.sh" ${tz} zic -l leapseconds -d $zoneinfo/right -y "sh yearistype.sh" ${tz} done cp -v zone.tab zone1970.tab iso3166.tab $zoneinfo zic -d $zoneinfo -p america/new_york unset zoneinfo
2.确定时区
tzselect
please identify a location so that time zone rules can be set correctly. please select a continent, ocean, "coord", or "tz". 1) africa 2) americas 3) antarctica 4) asia 5) atlantic ocean 6) australia 7) europe 8) indian ocean 9) pacific ocean 10) coord - i want to use geographical coordinates. 11) tz - i want to specify the time zone using the posix tz format.
3.这里我们选择4亚洲
please select a country whose clocks agree with yours. 1) afghanistan 18) israel 35) palestine 2) armenia 19) japan 36) philippines 3) azerbaijan 20) jordan 37) qatar 4) bahrain 21) kazakhstan 38) russia 5) bangladesh 22) korea (north) 39) saudi arabia 6) bhutan 23) korea (south) 40) singapore 7) brunei 24) kuwait 41) sri lanka 8) cambodia 25) kyrgyzstan 42) syria 9) china 26) laos 43) * 10) cyprus 27) lebanon 44) tajikistan 11) east timor 28) macau 45) thailand 12) georgia 29) malaysia 46) turkmenistan 13) * 30) * 47) united arab emirates 14) india 31) myanmar (burma) 48) uzbekistan 15) indonesia 32) nepal 49) vietnam 16) iran 33) oman 50) yemen 17) iraq 34) pakistan
4.这里我们选择9中国
please select one of the following time zone regions. 1) beijing time 2) * time
5.这里我们选择1北京时间
the following information has been given: china beijing time therefore tz='asia/shanghai' will be used. selected time is now: sun dec 30 18:00:59 cst 2018. universal time is now: sun dec 30 10:00:59 utc 2018. is the above information ok? 1) yes 2) no #? yes please enter a number in range.
6.是否选择以上信息?这里选择1
you can make this change permanent for yourself by appending the line tz='asia/shanghai'; export tz to the file '.profile' in your home directory; then log out and log in again. here is that tz value again, this time on standard output so that you can use the /usr/bin/tzselect command in shell scripts: asia/shanghai
这句的意思是你可以将该配置文件添加到/usr/bin/tzselect使其生效
7.运行以下命令创建文件/etc/localtime
cp -v /usr/share/zoneinfo/asia/shanghai /etc/localtime
第6.31章 如果需要,在下一节中安装flex后,可以重建bison,并且可以通过make check来运行bison检查。(不推荐重建)
第6.48章 libelf是elfutils-0.173包的一部分,所以需要解压elfutils-0.173软件包,进行编译
第6.61章 按书籍说明,第一条修改设置命令如下
page=a4 ./configure --prefix=/usr
第6.62章 我使用manjaro安装的grub引导lfs所以在此处不安装grub,如果需要安装grub到lfs笔记后面,对应章节有配置说明。
第6.72章
ld_library_path=/tools/lib udevadm hwdb --update
每次更新硬件信息时都需要运行此命令。
第6.79章 从二进制文件和库中删除调试符号 按照书籍中的命令操作即可(可选)建议执行此项操作。
第6.80章
清理运行测试剩下的一些额外文件
rm -rf /tmp/*
退出
exit
挂载6.2.2和6.2.3章节内容
mount -v --bind /dev $lfs/dev
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
if [ -h $lfs/dev/shm ]; then mkdir -pv $lfs/$(readlink $lfs/dev/shm) fi
chroot进入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.2章节
进入sources目录,解压lfs-bootscripts
进入lfs-bootscripts目录,并运行安装。
第7.6章
运行第7.6.2章节与第7.6.4章的命令即可
因为大多数使用的都是美国键盘,所以本章节其他内容可忽略
第7.7章节
运行以下命令获取glibc支持的所有语言环境的列表:
locale -a
结果:
c en_us.utf8 posix zh_cn.utf8
这里我们选择en_us.utf8
以下是对对所选择的语言的测试
lc_all=<locale name> locale charmap lc_all=<locale name> locale language lc_all=<locale name> locale charmap lc_all=<locale name> locale int_curr_symbol lc_all=<locale name> locale int_prefix
确定正确的区域设置后,创建 /etc/profile
文件:
cat > /etc/profile << "eof" # begin /etc/profile export lang=en_us.utf8 (这里替换为所选择的语言环境) # end /etc/profile eof
第7.4章
找出分配给哪个网络设备的名称:
cat /etc/udev/rules.d/70-persistent-net.rules 记住这个命令输出的网络设备的名字,下一章要使用。
第7.5章
第7.5.1节
cd /etc/sysconfig/ cat > ifconfig.eth0 << "eof" (这里的eth0修改为上一章节记录的网络设备的名字) onboot=yes iface=eth0 (这里的eth0修改为上一章节记录的网络设备的名字) service=ipv4-static ip=192.168.1.2 gateway=192.168.1.1 prefix=24 broadcast=192.168.1.255 eof
第7.5.2章节
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
这里我们使用谷歌的dns
第7.5.3章节
echo "<lfs>" > /etc/hostname 这里的lfs替换为你所设置的主机名字
第7.8章 第7.9章运行书中所给命令即可
第8.2章
更改为lfs所创建的分区到相应位置即可(这个文件是配置lfs开机自动挂载的分区)
cat > /etc/fstab << "eof" # begin /etc/fstab # file system mount-point type options dump fsck # order /dev/sda9 /boot ext4 defaults 1 1 /dev/sda10 / ext4 defaults 1 1 /dev/sda11 /home ext4 defaults 1 1 /dev/sda12 swap swap pri=1 0 0 proc /proc proc nosuid,noexec,nodev 0 0 sysfs /sys sysfs nosuid,noexec,nodev 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 tmpfs /run tmpfs defaults 0 0 devtmpfs /dev devtmpfs mode=0755,nosuid 0 0 # end /etc/fstab eof
第8.3章(相当重要)
配置编译安装linux内核
首先进入sources目录
cd /sources
解压内核文件压缩包
tar -xvf linux-4.18.5.tar.xz
进入内核包目录
cd linux-4.18.5
准备编译
make mrproper
设置默认内核配置状态
make defconfig
设置内核
make menuconfig
找到以下选项
device drivers ---> generic driver options ---> [ ] support for uevent helper [config_uevent_helper] [*] maintain a devtmpfs filesystem to mount at /dev [config_devtmpfs] kernel hacking ---> choose kernel unwinder (frame pointer unwinder) ---> [config_unwinder_frame_pointer]
上下键翻页找到device drivers --->回车进入
上下键翻页找到generic driver options --->回车进入
按字母n键去掉support for uevent helper对话框的×符号
按y键在maintain a devtmpfs filesystem to mount at /dev对话框打上×符号
左右键找到exit,exit两次
上下键翻页找到kernel hacking --->回车进入
上下键翻页找到choose kernel unwinder--->回车进入
向下选择unwinder_frame_pointer回车确定
左右键选择save,两次回车确定保存 选择两次exit退出到终端。
如果您的主机硬件使用uefi,请自行添加此项设置
processor type and features ---> [*] efi stub support [config_efi_stub]
编译内核映像和模块
make -j(n) n为可设置同时运行的任务数量,不设置参数默认为无限(不要轻易尝试)
本章节警告中的内容大意
如果为boot单独分了区,请挂载boot分区在进行下步操作
复制一些内核的启动文件到boot分区
cp -iv arch/x86/boot/bzimage /boot/vmlinuz-4.18.5-lfs-8.3 cp -iv system.map /boot/system.map-4.18.5 cp -iv .config /boot/config-4.18.5
安装linux内核的文档:
install -d /usr/share/doc/linux-4.18.5 cp -r documentation/* /usr/share/doc/linux-4.18.5
配置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
第8.4章节
安装配置grub引导
我选择的是用manjaro安装的grub引导进入lfs系统所以未安装grub软件包
这里介绍给lfs安装配置grub引导的过程
在第6.62章节已经安装了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 ext4(这里面更改为安装lfs的分区的格式例如ext4) set root=(hd0,2) 括号里面更改为你所安装lfs的分区号 例如/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) } eof
第9.1章节
设置系统版本及版本号运行本章节命令即可
echo 8.3 > /etc/lfs-release cat > /etc/lsb-release << "eof" distrib_id="linux from scratch" distrib_release="8.3" distrib_codename="<your name here>"(括号里改为自己起的名字) distrib_description="linux from scratch" eof
第9.3章
本章节中的提及的软件包,将在其他笔记单独记录
运行下面的命令,退出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
如果需要本机的grub引导lfs则在root用户下运行以下命令创建lfs的引导项
非manjaro系统需要安装os-prober软件包,并挂载lfs的分区,在运行下面命令,添加lfs的启动项
grub-mkconfig -o /boot/grub/grub.cfg
确定添加完lfs引导项后,重启机器进入lfs选项,即可进入lfs操作系统。