alfs学习笔记-自动化构建lfs系统
一名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 () (NEW)
Download timeout (in seconds) () (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-)
[*] 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
/dev/<yyy> swap swap pri= # 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 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/-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>
:: localhost ip6-localhost ip6-loopback
ff02:: ip6-allnodes
ff02:: 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操作系统。
alfs学习笔记-自动化构建lfs系统的更多相关文章
- alfs学习笔记-安装和使用blfs工具
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一名linux爱好者,记录构建Beyond Linux From Scratch的过程 经博客园-骏马金龙前辈介绍,开始接触学习 ...
- LFS7.10——构建LFS系统
参考:LFS7.10——准备Host系统 LFS7.10——构造临时Linux系统 本文正式开始构建LFS系统,后面所有命令的执行都是在root用户下完成的. 这时开始构建LFS前准备工作 更改$LF ...
- 【转】Ant学习笔记——自己构建Ant编译环境
自从年初开始用NetBeans6.0,才接触到Ant. 这是今年6月份的一篇Ant学习笔记.安装 1.下载并构建环境. 去官网下载src包和bin包.解压缩它们到同一目录,运行build.bat, ...
- React学习笔记---项目构建
简介 ReactJs由于有FB的支持,得到了社区的极大关注,同时由于ReactJs只希望专一的做好View层次上的工作,所以本身并没有涉及很多周边工具. 今天要介绍一款工具,同时包含一个构建项目模板的 ...
- Ubuntu学习笔记-win7&Ubuntu双系统简单搭建系统指南
win7&Ubuntu双系统简单搭建系统指南 本文是自己老本子折腾Ubuntu的一些记录,主要是搭建了一个能够足够娱乐(不玩游戏)专注练习自己编程能力的内容.只是简单的写了关于系统的安装和一些 ...
- 《第一行代码》学习笔记1-Android系统架构
1. 2003.10,Andy Rubin创办Android公司.2005.8,Google收购之,并于2008年推出Android系统第一个版本. 2. ①Linux Kernel:基于Linux ...
- Linux学习笔记01—安装LInux系统
1.首先,使用光驱或U盘或你下载的Linux ISO文件进行安装. 界面说明: Install or upgrade an existing system 安装或升级现有的系统 install sys ...
- SRE学习笔记:分布式共识系统、Paxos协议
最近阅读了<SRE Google运维解密>的第23章,有一些感触,记录一下. 日常工作中,我们经常需要一些服务分布式的运行.跨区域如跨城.跨洲部署运行分布式系统往往是容易的,但是如何保证各 ...
- RHCE7认证学习笔记17——KickStart安装系统
一.自动化安装系统工具 1.Cobbler 另一个自动化安装工具: 2.Kickstart 二.使用kickstart自动化安装系统 服务器安装的软件: 1.dhcp服务 [root@lin ...
随机推荐
- linux 重新生成网卡配置文件
nmcli connection add con-name home type ethernet ifname eth1 autoconnect yes ip4 10.1.252.60/24 gw4 ...
- ueditorUE 去掉本地保存成功的提示框!
网上修改什么JS的太麻烦,这样比较暴力,仅供参考 这里直接修改的样式: ue.ready(function () { $(".edui-editor-mess ...
- 安卓startActivityForResult用法
startActivityForResult的作用就是它可以回传数据,假如我们有两个页面A和B,点击A页面的一个按钮,进入下一个页面B,进入页面B后,进行设置操作,并在finish()或者back后, ...
- 升讯威微信营销系统开发实践:微信接口的 .NET 封装
GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...
- Trie树(字典树)的介绍及Java实现
简介 Trie树,又称为前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串.与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定.一个节点的所有子孙都有相同的前缀,也 ...
- 音视频编解码技术(一):MPEG-4/H.264 AVC 编解码标准
一.H264 概述 H.264,通常也被称之为H.264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC) 1. H.264视频编解码的意义 H.264的出现就是为了创 ...
- [Swift]LeetCode306. 累加数 | Additive Number
Additive number is a string whose digits can form additive sequence. A valid additive sequence shoul ...
- [Swift]LeetCode451. 根据字符出现频率排序 | Sort Characters By Frequency
Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...
- 为什么大一先要学C语言(面向过程)再学C++或JAVA(面向对象)?
面向对象和面向过程各有千秋 一.面向过程与面向对象对比 面向过程:强调的是每一个功能的步骤,有很多很多方法组成,这些方法相互调用,完成需求. 面向对象:强调的是对象,然后由对象去调用功能. 面向过程 ...
- 11.Git分支-远程跟踪分支的概念、多个远程仓库的使用
1.远程跟踪分支的概念 远程引用是对远程仓库的引用,包括分支.标签等等. 1.可以通过 git ls-remote <remote> 来获得远程引用的完整列表 2.git remote ...