一、搭建Linux环境
曾经有LFSliveCD用于编译LFS,但前者不维护了,可以使用其他Linux发行版。
安装debian,发现使用中文安装会乱码【问题1】,并且未设置root密码,使用su root切换却提示密码错误【问题2】,遂重装英文版本。
debian的安装过程有点长,即使下载了xfced版本,选择不从网络下载软件包,也得等数分钟。
http://www.linuxfromscratch.org/lfs/view/stable/chapter02/hostreqs.html
原本想安装VirtualBox提供的工具,方便从主机剪贴板获取命令,没想到即使以root运行挂载盘下的runasroot.sh,也提示Permission Denied【问题3】。
和午后的困倦拼了一会儿,结果我把挂载的内容复制了,就可以运行。其间我第一次复制得到的文件夹是空的【问题4】,不知道啥原因,由于弹出后挂载镜像又需要手动挂载,我就干脆重启。
虽然没干啥事,但已经过去了几个小时。。工欲善其事,必先利其器嘛。
然后运行官方提供的脚本检查所需软件是否已安装,发现报错一大堆。比如g++就没有安装,所以我apt intall g++,发现报错Unable to correct problems, you have held broken packages.【问题5】
网上说update+upgrade升级源和软件就好了,然而我试了也没用,只好手动添加源再运行以上命令,发现仍然不行。
我再观察报错,发现它都提示有依赖没有安装,难道不是自动安装依赖吗??如下提示,但如果我安装libc6-dev,那么它又会提示我安装别的,如此循环下去。
libstdc++-6-dev : Depends: libc6-dev (>= 2.13-5) but it is not going to be installed
最后问了dalao,原来是我添加的软件源版本错了,debian9和10的版本号代称我不了解,因此没有注意。我估计以上报错原因是,debian9的源没有高版本软件,因此检查依赖就过不了,但其实有的依赖根本就已经安装好了,只是源中找不到。
更新了源之后,软件可以正常安装,其中makeinfo命令not found,对应的软件包叫texinfo。
LFS官方提供了检查软件安装的脚本,它还提示我,/bin/sh没有指向/usr/bin/bash,我目前指向的是dash。dash是debian启用的新终端,但lfs手册既然说要指向bash,那就只好改了。
现在我要了解一下,软链接( ln -s source target )和硬链接( ln source target )是什么。以前学操作系统的时候提到过,硬链接的引用是在文件系统层面上,控制i-node块的指向实现的,而软链接相当于快捷方式,本身是另一个文件。那么这里就用软链接吧,如果是快捷方式,被误删也没关系。
接近12点,检查过所有软件包都安装后进入下一步。
http://www.linuxfromscratch.org/lfs/view/stable/chapter02/stages.html
这个页面告诉我,root用户需要设置LFS环境变量。从第5章开始,/mnt/lfs必须挂载,必须创建lfs用户,5.3是关键,如果有问题重新解压包。第6章开始,使用chroot要设置LFS环境变量,必须挂载虚拟文件系统(要在chroot命令外)。
我在百度云买了一台云主机,下载软件比较快,而且可以用不同的设备操作,因此实验环境在百度云上了。
现在的问题是分区,实验手册中制作lfs系统使用了lfslivecd,宿主系统并没有安装到磁盘上,但我现在是先装好debian,所以要从系统盘给lfs让出一个分区。
发现resize2fs可以调整分区容量,它提示我On-line shrinking not supported,也是哦,系统还在运行呢。【问题6】
遇到了非常恼人的问题,询问多人后发现无简单解决方案。Windows都可以在运行时压缩系统卷,Linux怎么就不行呢?
您好,十分抱歉,系统盘不支持分区,如果您想要进行分区的话,您可以选择购买cds磁盘挂载来充当您的数据盘,请您知悉,谢谢。
好吧,还是只能本地操作。
我下了Ubuntu19.10,打算提前分好区,免得对系统分区操作麻烦。至于百度的云服务器,就拿来给ipad当云电脑用,装个windows。
但是Ubuntu图形化安装界面总是在硬盘分区,新建分区表后卡死,背景变黑。【问题7】
实在无办法,只好先分区。下载了一个ElementaryOS,结果安装的时候没有选项。换openSUSE发行版试试。
openSUSE顺利分区,终于可以开始正式的工作了,此去已几天。
因为要复制脚本,所以用ssh连接,Parallel tools的linux版老是出错。结果能ping通,ssh却连接不上,初步判断防火墙。
幸好opensuse配置防火墙有图形化界面,配置还方便一点。
但是opensuse软件源又得配置,算了还是ubuntu省心,这次给ubuntu分配了更多的内存和显存,就没有卡死了。
ubuntu安装ssh server后继续操作,分区在安装时就设置好,进入系统后用’mount 设备 文件夹’命令挂载分区(挂载前先格式化成ext4)。
之后,我下载了所有需要的软件源码放在了$LFS/sources中。
二、制作工具链
为了避免错误操作造成的影响,这一步新建了lfs账户。
按部就班地解压文件,编译源码,这一步虽然要重复很多次而且很耗时,但只要跟着LFS手册就不会有问题。
但临时系统需要的软件编译完成后,就得准备编译内核和系统软件了,这个时候需要从lfs用户切换回root用户。切换操作只能exit,su会提示认证失败。【问题8】
三、构建内核
这一步开始需要chroot(改变根目录),进行最终的编译。
这一步只要根据LFS来就好了,但是却花了我两周的空闲时间。
温馨提示工具链+为lfs系统编译的软件总数100个左右,而且没有自动化脚本。(有的话lfs就没有diy的感觉了)
四、启动配置
System V是一个经典的启动程序,它包含init,Linux的启动level就是来自这里。
0 — halt 1 — Single user mode 2 — Multiuser, without networking 3 — Full multiuser mode 4 — User definable 5 — Full multiuser mode with display manager 6 — reboot
这里需要安装lfs-bootscript。
由于想改一下Ubuntu的启动配置,又新开了一个ssh窗口,没想到用户名密码都正确却提示Permission denied。【问题9】
我擦,原来是ssh的配置文件里有一句permitRootLogin prohibit-password,也就是只能用密钥。。赶紧注释掉。
出现了error : unknown filesystem错误。
我现在寄希望于boot-repair,在半个月后,问题仍然存在。我从liveCD启动后,添加ppa软件源和安装boot-repair出现了问题,提示依赖关系有问题,不能安装该软件。
于是在StackExchange上找到了答案,遗憾的是,我找不到Synaptic。
原来是liveCD默认不包含某些工具。https://askubuntu.com/questions/874854/package-synaptic-is-not-available-in-ubuntu-16-04
勾选了软件源列表后成功安装boot-repair,但是运行又出了问题。
五、GUI应用
六、窗口管理系统
待更新