任务内容
利用现有的互联网资源搭建TUI的一个Linux操作系统并能够成功启动。
推荐使用的环境及编译对象: 宿主机:Ubuntu18.04.5,编译器:gcc-4.4.7,Glibc:glibc-2.20,编译的Linux内核:Linux-3.12.10,外壳:busybox-1.33.1
任务概述
(1)搭建系统设计的环境
(2)从网上下载Linux某一历史内核,编译;
(3)从网上下载外壳busybox,编译,并和内核打包。
(4)利用shell命令配置系统,启动后能和宿主机进行网络通信。
准备源码
1.源码下载
本次实验所需源码有:
- gcc-4.4.7
- glibc-2.20
- gmp-4.3.2
- mpc-1.0.3
- mpfr-3.1.4
- linux-3.12.10
- busybox-1.33.1
上述源码均可从中科大源中获取
下载完成后,将源码传入VMware中的虚拟机Ubuntu18.04中,我放在/usr/local
文件夹下
在该目录下分别创建gcc-4.4.7
,glibc-2.20
,gmp-4.3.2
,mpc-1.0.3
,mpfr-3.1.4
,linux-3.12.10
,busybox-1.33.1
文件夹,用于后续的编译和安装。
mkdir gcc-4.4.7
mkdir glibc-2.20
mkdir gmp-4.3.2
mkdir mpc-1.0.3
mkdir mpfr-3.1.4
mkdir linux-3.12.10
mkdir busybox-1.33.1
利用tar
命令将压缩包解压到对应文件夹。
有些依赖不能在原始目录安装,必须在空文件夹中进行配置。
2.安装gcc及其依赖
ubuntu18.04原本自带的gcc版本为gcc-7.5.0
而我们要编译的linux内核为linux-3.12.10,高版本的gcc无法编译老版本的linux,所以我们必须安装一个合适的gcc版本。这里我才用的是gcc-4.4.7
2.1 gcc安装
gcc是Linux下的C/C++ 编译器,安装gcc之前我们必须安装与其配套的三个依赖,分别为gmp
,mpc
,mpfr
。并且必须依照顺序安装,否则将安装失败。
2.1.1 安装gmp-4.3.2
//进入gmp-4.3.2文件夹
cd gmp-4.3.2
//配置
/usr/local/gmp-4.3.2/configure --prefix=/usr/local/gmp-4.3.2
这里我提示缺少m4和gawk组件,安装。
sudo apt-get install m4
sudo apt-get install gawk
再执行配置,编译,安装。
make && make install
configure文件是一个可执行的脚本文件,它有很多选项,在待安装的源码目录下使用命令./configure –help可以输出详细的选项列表。
其中--prefix选项是配置安装目录,如果不配置该选项,安装后可执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr /local/share,比较凌乱。
2.1.2 安装mpfr3.1.4
//进入mpfr3.1.4文件夹
cd mpfr3.1.4
//配置
/usr/local/project/mpfr-3.1.4/configure --prefix=/usr/local/mpfr-3.1.4 --with-gmp=/usr/local/gmp-4.3.2
这里特别要注意,配置时必须在命令后加上--with-gmp=/usr/local/gmp-4.3.2
引用之前安装的gmp,在下面几步中也需要使用到。
编译安装
make && make install
2.1.3 安装mpc-1.0.3
//进入mpc-1.0.3文件夹
cd mpc-1.0.3
//配置
/usr/local/mpc-1.0.3/configure --prefix=/usr/local/mpc-1.0.3 --with-gmp=/usr/local/gmp-4.3.2 --with-mpfr=/usr/local/mpfr-3.1.4
//编译安装
make && make install
2.1.4安装glibc-2.20
cd glibc-2.20
./configure
提示需要在空文件夹下配置
新建一个文件夹mkdir bulid
重新配置,编译,安装。
配置glibc环境变量。
export LD_LIBRARY_PATH=/usr/local/glibc-2.20/bulid
2.1.5 安装gcc-1.33.1
安装之前先配置环境变量
//配置环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpc-1.0.3/lib:/usr/local/gmp-4.3.2/lib:/usr/local/mpfr-3.1.4/lib
/usr/local/project/gcc-4.4.7/configure --prefix=/usr/local/gcc-4.4.7 -enable-threads=posix -disable-checking -disable-multilib -enable-languages=c,c++ --with-gmp=/usr/local/gmp-4.3.2 --with-mpfr=/usr/local/mpfr-3.1.4 --with-mpc=/usr/local/mpc-1.0.3
make && make install
对新安装的gcc设置优先级,相当于软连接,否则默认gcc版本仍为系统自带版本。
sudo update-alternatives --install /usr/local/gcc gcc /usr/local/gcc-4.4.7 100
后方数字可随意设置,也可将自带gcc添加软连接,系统将按照优先级自动选择gcc版本。
成功安装后,输入gcc -v
查看当前gcc版本
2.2 安装busybox-1.33.1
//进入busybox-1.33.1目录
cd busybox-1.33.1
//进入配置界面
make menuconfig
运行make menuconfig
,必须调大你的命令窗口,否则会弹出如下报错。Your display is too small to run Menuconfig! It must be at least 19 lines by 80 columns.
进入配置界面后,使用空格键 勾选,↑↓键选择,Esc 退出。
这里我们采用动态编译,静态编译在后续网络上会出问题
Setting-->
Bulid static binary(no shared libs)
然后编译安装
make && make install
安装完成
因为gcc是动态编译,需要将查看bin和sbin下的命令需要什么动态.so文件,使用ldd指令查看即可
ldd _install/bin/ping
3. 编译linux-3.12.10内核
进入解压后的linxu-3.12.10目录
cd linux-3.12.10
设置
make menuconfig
我们需要内核支持ramdisk驱动,勾选这些选项。
①General setup下的
Initial RAM filesystem and RAM disk (initramfs/initrd) support
②Device Drivers下的
Block devices --->
RAM block device support
配置完成后,开始编译并指定编译后的生成路径
mkdir ../linux
make O=../linux
编译时间一般在1~2个小时,耐心等待。
4. 制作启动文件
创建1024M(1G)启动文件,模拟物理磁盘
dd if=/dev/zero of=./disk.img bs=1M count=1024
分区
fdisk disk.img
执行该命令后依次输入n
,p
,回车
,回车
,w
。
通过hd disk.img -n 512
可查看分区前512字节(后面作为mbr结构)的内容
5.制作rootfs根文件系统
查看当前宿主机哪一个设备为空闲状态。
sudo losetup -f
5.1 关联设备
sudo losetup /dev/loop23 disk.img
将disk.img关联到/dev/loop22设备,这样linux操作系统可以将disk.img当作块设备(磁盘)来进行操作。
5.2 格式化文件系统
将disk.img格式化为ext4文件系统
sudo mkfs.ext4 /dev/loop23
5.3 将目录挂载到设备
新建一个目录
并挂载到设备上
mkdir /usr/local/rootfs
mount /dev/loop23 /usr/local/rootfs
输入df -h
命令可以查看Linux系统上的文件系统的磁盘使用情况。红色方框就是我们刚刚挂载的。
将我们先前编译的busybox根目录下的_install文件夹下所有文件拷贝至根文件系统下。
cp -r _install/* /usr/local/rootfs
5.4 安装 grub 引导
sudo grub-install --root-directory=/usr/local/rootfs/ /dev/loop23