任务内容

利用现有的互联网资源搭建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组件,安装。

安装m4
安装m4

安装gawk
安装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

mpfr
mpfr

这里特别要注意,配置时必须在命令后加上--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

mpc
mpc

2.1.4安装glibc-2.20

cd glibc-2.20
./configure

glibc.png
glibc.png

提示需要在空文件夹下配置
新建一个文件夹
mkdir bulid
重新配置,编译,安装。
配置glibc环境变量。

export LD_LIBRARY_PATH=/usr/local/glibc-2.20/bulid

glibc环境变量.png
glibc环境变量.png

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版本

gcc4.4.7
gcc4.4.7

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.

busybox
busybox

进入配置界面后,使用空格键 勾选,↑↓键选择,Esc 退出。
这里我们采用动态编译,静态编译在后续网络上会出问题
Setting-->
Bulid static binary(no shared libs)

busybox动态编译.png
busybox动态编译.png

然后编译安装

make && make install

安装完成

busybox.png
busybox.png

因为gcc是动态编译,需要将查看bin和sbin下的命令需要什么动态.so文件,使用ldd指令查看即可

ldd _install/bin/ping

bin/ping
bin/ping

3. 编译linux-3.12.10内核

进入解压后的linxu-3.12.10目录

cd linux-3.12.10

设置

make menuconfig

linux_make_menuconfig.png
linux_make_menuconfig.png

我们需要内核支持ramdisk驱动,勾选这些选项。
①General setup下的
Initial RAM filesystem and RAM disk (initramfs/initrd) support
②Device Drivers下的
Block devices --->
RAM block device support

linux配置1.png
linux配置1.png

linux配置2.png
linux配置2.png

配置完成后,开始编译并指定编译后的生成路径

mkdir ../linux
make O=../linux

指定编译路径.png
指定编译路径.png

编译时间一般在1~2个小时,耐心等待。

4. 制作启动文件

创建1024M(1G)启动文件,模拟物理磁盘

dd if=/dev/zero of=./disk.img bs=1M count=1024

disk_img.png
disk_img.png

分区

fdisk disk.img

fdisk.png
fdisk.png

执行该命令后依次输入n,p,回车,回车,w

通过hd disk.img -n 512可查看分区前512字节(后面作为mbr结构)的内容

hd.png
hd.png

5.制作rootfs根文件系统

查看当前宿主机哪一个设备为空闲状态。

sudo losetup -f

losetup_f.png
losetup_f.png

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

mkfs.png
mkfs.png

5.3 将目录挂载到设备

新建一个目录
并挂载到设备上

mkdir /usr/local/rootfs
mount /dev/loop23 /usr/local/rootfs

输入df -h命令可以查看Linux系统上的文件系统的磁盘使用情况。红色方框就是我们刚刚挂载的。

df_h.png
df_h.png

将我们先前编译的busybox根目录下的_install文件夹下所有文件拷贝至根文件系统下。

cp -r _install/* /usr/local/rootfs

5.4 安装 grub 引导

sudo grub-install --root-directory=/usr/local/rootfs/ /dev/loop23