linux from scratch 7.10 最新版
开始之前先来看看一般的linux发行版都干了些什么,然后再考虑构建自己的linux发行版
linux from scratch就是以源码的方式有选择的编译安装自己的系统,只安装需要的软件,这点比较自由,因此开始之前要有一个编译的环境,这个环境由宿主主机来提供
我是依据官网最新版本的教程做的,最新版本为7.10,开始宿主主机选择Ubuntu 14.04 server 32
位版
安装之前要检测宿主主机的环境套件,官方提供一个shell script用来检测,有几点需要注意
- server版本默认最小化安装,连gcc都没有,安装之
apt-get install gcc g++ automake autoconf make libtool ncurses-dev
- bison 2.3版本,这个直接google对应的版本编译安装就行
- 有一个makeinfo这个在ubuntu下对应
apt-get install texinfo
- ubuntu默认 /bin/sh----/bin/dash,改之为 /bin/sh----/bin/bash
- yacc与bison链接,ubuntu上用bison代替yacc
mv /usr/local/bin/yacc /usr/local/bin/yacc.orgi ln -sv /usr/local/bin/bison /usr/local/bin/yacc
最后检测结果,不过好像那些都是手动改的,最后发现有些问题,推荐用apt-get来安装这些东东,不要手动搞,包依赖会很麻烦
最后换为Ubuntu Server 16.10 32位
系统检测,缺少的东东用apt-get
来安装,切记
开始do it
首先要给LSF系统空间,有两种方法给分区,一种是在vmware硬盘上点击扩容,因为之前分给宿主系统的20G空间已经分区好了,扩展20G之后再用fdisk /dev/sda
再把新加的空间给分成一个区,这里是 /dev/sda4 是主分区用来安装LFS.
其实还有一种方法也是比较推荐的方法是给vmware新加一块SCSI硬盘,这样再对这块新的硬盘进行分区,可以分成我们想要的几个区/boot , / , /swap等,并且现实中一块硬盘的容量大小是固定的不可能再增加对吧,由于我是第一种方法分的就打算拿这个 /dev/sda4来安装LFS了,内存够用没建swap分区
格式化分区 /dev/sda4 为ext4文件系统 mkfs -t ext4 /dev/sda4
然后挂载
让 /mnt/lfs/source writable + Sticky: chmod -v a+wt $LFS/sources
下边就开始下载packages和patch补丁了,官方提供的下载起来比较慢,这里用wget-list,把要下载的package等放到一个文件中再通过
wget --input-file=wget-list --continue --directory-prefix=$LFS/sources
这里的wget-list文件感谢中科大的镜像,不过最新的7.10确也是国外的镜像,下载速度比较慢
http://mirrors.ustc.edu.cn/lfs/lfs-packages/7.10/wget-list
这个实在太慢,真应该用中科大的全压缩包
http://mirrors.ustc.edu.cn/lfs/lfs-packages/lfs-packages-7.10.tar
有很多包是.tar.xz的,xz是一种压缩率很高的压缩工具
压缩 xz -z 压缩的文件
解压 xz -d xxx.tar.xz ,默认解压后原xxx.tar.gz删除保留xxx.tar ,若想保留加-k 参数
#软连接 /tools -> $LFS/tools
ln -sv $LFS/tools /tools #这一步可简写为ln -sv $LFS/tools /
安装完Binutils,GCC,Linux-API-Headers,GLibc后编译工具就算搞好了,要测试一下
cp 命令
第II部分是在构建 Constructing a Temporary System 临时系统,它不再依赖宿主系统进行编译之类的工作,这样做主要是为了得到一个干净的系统,不再依赖宿主系统的库等文件,第三部分构建LFS系统就是在这个临时系统上编译完成的 temporary mini Linux system,构建在 /tools文件夹下的
su root 切换到root来干活
考虑以后还想搞的话可以把/tools打包备份下来
虚拟内核文件系统
准备进入chroot环境了
进入chroot之后
依据标准构建目录树 standard directory tree,依据 目录结构标准(FHS)
创建好必要的目录设定好属性之后下边建立/etc/passwd /etc/group文件,touch几个日志文件记录系统信息并设定好权限,然后就可以以root的身份开始工作了
工作时的编译环境为/tools下的各种工具binary files可执行文件工作,有些项目要求绝对路径,这里也要做一些软链接
安装GMP的时候
Sysklogd-1.5.1这个包括klogd,syslogd两个程序,一个截取内核信息,一个记录系统program的登录信息
Sysvinit-2.88dsf 控制系统开机,运行与关机 有init ,halt,shutdown,killall5,poweroff,runlevel,bootlogd
此时的/tools为临时系统
Chapter 7. System Configuration
Private Network Address Range Normal Prefix
10.0.0.1 - 10.255.255.254 8
172.x.0.1 - 172.x.255.254 16
192.168.y.1 - 192.168.y.254 24
登录shell与非登录shell,交互式shell与非交互式shell
登录shell:是需要用户名、密码登录后才能进入的shell(或者通过”–login”选项生成的shell)。
非登录shell:当然就不需要输入用户名和密码即可打开的Shell,例如:直接命令“bash”就是打开一个新的非登录shell,在Gnome或KDE中打开一个“终端”(terminal)窗口程序也是一个非登录shell。
交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了
shell也可以运行在另外一种模式:非交互式模式,以shell script(非交互)方式执行。在这种模式 下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就终止了。
执行exit命令,退出一个shell(登录或非登录shell);
执行logout命令,退出登录shell(不能退出非登录shell)
http://blog.csdn.net/wisgood/article/details/52043522
当内核编译完后,由于前期网络没有配置好,不知道该怎么配置,这里正好我要安装wget,在安装好一系列的相依赖的包后,wget已经可以用了,但这时由于dns没有配置好,有以下提示[chroot环境下]
依赖问题确实很烦人,还好有apt-get ,yum
不过LFS: One of the advantages of an LFS system is that there are no files that depend on the position of files on a disk system [that is great]
root:/sources/wget-1.18/testt# wget http://ftp.gnu.org/gnu/wget/wget-1.18.tar.xz
--2017-01-04 13:56:48-- http://ftp.gnu.org/gnu/wget/wget-1.18.tar.xz
Resolving ftp.gnu.org... failed: Temporary failure in name resolution.
wget: unable to resolve host address 'ftp.gnu.org'
这里提示是DNS解析不了,创建resolv.conf后再测试
root:/etc# resolv.conf
# Begin /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
# End /etc/resolv.conf
root:/etc# wget http://ftp.gnu.org/gnu/wget/wget-1.18.tar.xz
--2017-01-04 14:59:33-- http://ftp.gnu.org/gnu/wget/wget-1.18.tar.xz
Resolving ftp.gnu.org... 208.118.235.20, 2001:4830:134:3::b
Connecting to ftp.gnu.org|208.118.235.20|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1922376 (1.8M) [application/x-tar]
Saving to: 'wget-1.18.tar.xz'
wget-1.18.tar.xz 100%[=========================================================>] 1.83M 85.2KB/s in 22s
2017-01-04 14:59:58 (85.9 KB/s) - 'wget-1.18.tar.xz' saved [1922376/1922376]
由些可见这些软件是独立运行的,跟内核是完全独立的,因为此时还没有用到编译好的内核[chroot环境,没有重启]
顺着上边的来配置网络,仅是搞了DNS,chroot下好像能上网了,先进系统吧,网络可以回来配置,好期待....
在umount -v /mnt/lfs的时候提示设备忙...
root@ubuntu:/mnt/lfs/sources# umount -v /mnt/lfs/
umount: /mnt/lfs/: target is busy
(In some cases useful info about processes that
use the device is found by lsof(8) or fuser(1).)
这时候 fuser /mnt/lfs可以看到有进程在使用/mnt/lfs [fuser的作用显示了,lsof更强大]
root@ubuntu:/mnt/lfs/sources# fuser /mnt/lfs
/mnt/lfs: 1963c 2089c 2090c 6165c 6166c 6191c 6572c 6573c 6718c
然后依次kill -9 就行了
重启,关键啊
shutdown -r now
出现 错误
VFS: unable to mount root fs on unknown block(0,0)
不过通过修改grub.cfg加载到宿主的vmlinuz和initrd.img文件成功进入系统,只是用的是宿主系统的内核,说明是内核编译的问题
最后发现最终是在虚拟机中实现要注意的在下边两张图当中,特别是下边两个要编译进内核,最好不要做为模块编译
Fusion MPT ScsiHost drivers for SPI
Fusion MPT ScsiHost Drivers for SAS
在最后shutdown -r now之前会要求检查一些必要的文件是否存在 有些如 /etc/bashrc不存在,在BLFS中可以找到
http://www.linuxfromscratch.org/blfs/view/stable/postlfs/profile.html
6.25. Shadow-4.2.1 这个章节设置了root密码 123456,第一次没有成功启动,不过通过修改grub.cfg加载到宿主的vmlinuz和initrd.img文件成功进入系统,只是用的是宿主系统的内核.说明环境没有太大问题,只是内核缺少模块
最后重新编译内核有人说是有个模块没加入
#CONFIG_VMWARE_VMCI=m
CONFIG_VMWARE_PVSCSI=m #主要是这个模块要加入才能在vmware里起来,然后加之再编译,好期待...但结果好像不是这样的
最后发现有人这样说的,如下图
下边这两个一定要勾选才行
Fusion MPT ScsiHost drivers for SPI
Fusion MPT ScsiHost Drivers for SAS
注意:在make menuconfig的过程中,如果不运行make defconfig的话,直接来make menuconfig,则会报错如下
kernel/bounds.c:1:0 sorry ,unimplement 64 bit mode not compiled in
这就是.config生成的有问题,先make defconfig,再make menuconfig然后特别注意编译进去上边的Fusion模块才行呢
内核编译好后
最后还以为没成功呢,实际上已经可以用root登录啦
本文由 dealdot <dealdot#163.com> 创作, Full Stack Developer @ DeepBlue
本文最后编辑时间为: May 13, 2022 at 09:45 am
转载请注明来源