欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

lfs学习笔记(三)最终构建与配置

程序员文章站 2022-03-24 12:41:48
lfs学习笔记(三)链接:https://www.cnblogs.com/renren-study-notes/p/10199381.html 一名linux爱好者,记录构建Linux From Scratch的过程 经博客园-骏马金龙前辈介绍,开始接触学习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操作系统。