Linux From Scratch 7.10 最新版成功实现

in Linux with 0 comment

linux from scratch 7.10 最新版

开始之前先来看看一般的linux发行版都干了些什么,然后再考虑构建自己的linux发行版
image

linux from scratch就是以源码的方式有选择的编译安装自己的系统,只安装需要的软件,这点比较自由,因此开始之前要有一个编译的环境,这个环境由宿主主机来提供

我是依据官网最新版本的教程做的,最新版本为7.10,开始宿主主机选择Ubuntu 14.04 server 32位版

安装之前要检测宿主主机的环境套件,官方提供一个shell script用来检测,有几点需要注意

  1. server版本默认最小化安装,连gcc都没有,安装之 apt-get install gcc g++ automake autoconf make libtool ncurses-dev
  2. bison 2.3版本,这个直接google对应的版本编译安装就行
  3. 有一个makeinfo这个在ubuntu下对应 apt-get install texinfo
  4. ubuntu默认 /bin/sh----/bin/dash,改之为 /bin/sh----/bin/bash
  5. 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来安装这些东东,不要手动搞,包依赖会很麻烦

image

最后换为Ubuntu Server 16.10 32位系统检测,缺少的东东用apt-get来安装,切记

image

开始do it

首先要给LSF系统空间,有两种方法给分区,一种是在vmware硬盘上点击扩容,因为之前分给宿主系统的20G空间已经分区好了,扩展20G之后再用fdisk /dev/sda再把新加的空间给分成一个区,这里是 /dev/sda4 是主分区用来安装LFS.

其实还有一种方法也是比较推荐的方法是给vmware新加一块SCSI硬盘,这样再对这块新的硬盘进行分区,可以分成我们想要的几个区/boot , / , /swap等,并且现实中一块硬盘的容量大小是固定的不可能再增加对吧,由于我是第一种方法分的就打算拿这个 /dev/sda4来安装LFS了,内存够用没建swap分区

image

格式化分区 /dev/sda4 为ext4文件系统 mkfs -t ext4 /dev/sda4

image

然后挂载

image

image

让 /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后编译工具就算搞好了,要测试一下

image

cp 命令

image

第II部分是在构建 Constructing a Temporary System 临时系统,它不再依赖宿主系统进行编译之类的工作,这样做主要是为了得到一个干净的系统,不再依赖宿主系统的库等文件,第三部分构建LFS系统就是在这个临时系统上编译完成的 temporary mini Linux system,构建在 /tools文件夹下的

su root 切换到root来干活
考虑以后还想搞的话可以把/tools打包备份下来

虚拟内核文件系统

image

准备进入chroot环境了

image

进入chroot之后

image

依据标准构建目录树 standard directory tree,依据 目录结构标准(FHS)

image

创建好必要的目录设定好属性之后下边建立/etc/passwd /etc/group文件,touch几个日志文件记录系统信息并设定好权限,然后就可以以root的身份开始工作了

工作时的编译环境为/tools下的各种工具binary files可执行文件工作,有些项目要求绝对路径,这里也要做一些软链接

安装GMP的时候

image

Sysklogd-1.5.1这个包括klogd,syslogd两个程序,一个截取内核信息,一个记录系统program的登录信息

Sysvinit-2.88dsf 控制系统开机,运行与关机 有init ,halt,shutdown,killall5,poweroff,runlevel,bootlogd

此时的/tools为临时系统

image

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模块才行呢

内核编译好后

image

image

image

最后还以为没成功呢,实际上已经可以用root登录啦

image

评论