在Vmware虚拟机上手动制作微型Linux:

一、准备工作:编译内核前确认硬件设备准确信息:

1、在一台宿主机上新建一块磁盘,作为目标的微型Linux主机磁盘使用,之后在宿主机上编译内核后移植到目标主机。在宿主机端新添加的磁盘为/dev/sdb,创建两个分区,/dev/sdb1,50M,/dev/sdb2,512M格式化为ext4磁盘类型,挂载同时安装好grub。

# mkdir /mnt/{boot,sysroot}

# mount /dev/sdb1 /mnt/boot

# mount /dev/sdb2 /mnt/sysroot

# grub-install --root-directory=/mnt /dev/sdb

为目标主机的grub程序提供grub配置文件:

# vim /mnt/boot/grub/grub.conf

wKiom1P3-RyiYqXpAACNKkYR0IQ537.jpg

使用静态编译的方式,将所需要的模块编译进内核,所以没有initrd文件。

1、查看CPU硬件信息:

wKiom1P38umAtsHYAADWSH_l-pI129.jpg

2、查看主板信息:

wKiom1P386GCbaQvAAKBIh8cVCE454.jpg

wKiom1P39EeSBm37AAFY6xv3f4k092.jpg

注意PCI设备、桥芯片厂商类型,硬盘(SCSI storage信息)、USB控制器、Ethernet controller信息。

3、编译前准备好编译环境,安装“Development tools"和”Server Platform Development"两个开发包组。

# yum -y groupinstall "Development tools"

# yum -y groupinstall "Server Platform Development"

二、编译:

# make allnoconfig;除必选选项意外将所有编译选项都去除;

编译选项,要勾选成*,静态编译进内核:

# make menuconfig;启动编译选择界面

1、选择是否使用64位版本or32位版本:64位CPU的机型通常勾选。

2、定义当前编译系统的版本,可自定义:

wKioL1P3_2HDTCaoAADM7tUC2cY004.jpg


3、选择CPU类型,在选项上选择与目标主机CPU类型最接近的一项:

wKiom1P3-rKyhfA0AAEhGi_J16k221.jpg


选择将对称多处理器支持和多核调度。

wKiom1P3_g-SJdNaAAICMBCVgXE033.jpg

4、选择是否允许以后为了扩展而加载模块,可以不选:

5、选择总线选项:开启选项即可,很重要,要勾选。

6、选择磁盘选项:首先在编译首页面要选择启用块层,然后在设备驱动中选择支持SCSI设备和SCSI磁盘,根据需要选择Fusion MPT设备选项。

wKiom1P3_ZawlNLiAAFtbYSnzc8816.jpg

wKioL1P3_obwYlcZAAF4eXa_kGw651.jpg

7、选择支持的文件系统:

wKiom1P3_UWC2WzaAAEvjp7sdfk414.jpg

8、选择支持的可执行文件类型,是指支持的系统初始化文件的文件类型:

wKiom1P3_sqyB_RvAAFKyL0rVV8794.jpg

9、添加键盘鼠标的驱动:

wKioL1P4ADzgRjwCAAHhQ4ElaBE649.jpg

现在鼠标键盘大多是USB口类型,需要开启USB支持,将所需要的类型添加进选项。

wKiom1P3_27ToTJvAAJxlyoyI8c638.jpg

10、编译内核使内核识别的设备文件自动输出至/dev目录下,该选项在device driver中:

wKiom1P4AMrQCIevAAFDcflh6aY928.jpg

11、选择使用网络功能:

wKioL1P4AnjTyHh2AAKOR3b9FnU924.jpg

在Device driver目录中,添加所需网卡设备驱动,里面对应的网卡设备很多,只选择机器识别的网卡型号,其他型号都可以不勾选:

wKiom1P4AczhG99LAAFeduH4NX0741.jpg

# make bzImage && make install

核心编译安装完成后在编译的主目录下arch/x86/boot/会生成bzImage文件,将该内核文件复制到/mnt/boot目录下

# cp arch/x86/boot/bzImage /mnt/boot

12、为编译的系统提供init程序,这个程序是系统初始化必备的程序,可以在grub配置文件中选择手动指定启动的程序实现开机启动的第一个程序,通常默认为/sbin/init,而busybox可以实现相同的功能,可以用busybox来替换init程序。编译安装busybox,选择以静态编译的方式安装编译busybox:

实现静态编译busybox,需要提前解决依赖关系,安装glibc-static包:

# yum install -y glibc-static

# make menuconfig

wKiom1P4BKOyp5Z8AAFIB9L27qw827.jpg

# make && make install

busybox安装完成后在编译目录下生成_install目录将,该目录下的所有内容复制到/mnt/sysroot目录下

# cp -a _install/* /mnt/sysroot

三、编译安装后的配置操作:

1、系统运行所需要的应用程序由busybox提供工作完成后,后续需要完成系统的初始化工作,这个流程首先需要提供inittab文件,里面定义了系统初始化过程,使用busybox作为init程序后,busybox首先会读取这个文件内的定义,然后按照里面的内容对系统进行初始化工作,但这个文件是需要手动编辑提供的,否则系统无法引导:

# vim /mnt/sysroot/etc/inittab

wKioL1P4DzKieZpFAACOn_74X9A367.jpg

这个文件内的定义了系统初始化脚本的位置在/etc/rc.d/目录下的rc.sysinit,然后启动时会启动终端,定义按下ctrlaltdel键时系统的操作,以及关机时系统的操作等。

2、提供rc.sysinit脚本:

wKioL1P4EJTy9OxzAAFYN5hIAek727.jpg

3、提供文件系统配置文件/etc/fstab,在宿主机上编辑时,文件位置为/mnt/sysroot/etc/fstab

wKioL1P4ETKDbpQkAACNuWEkkeg343.jpg

4、提供主机名的配置文件/mnt/sysroot/etc/sysconfig/network:

# mkdir /mnt/sysroot/etc/sysconfig

# vim /mnt/sysroot/etc/sysconfig/network

添加主机名称的定义即可

5、提供用户输入提示符的配置文件/mnt/sysroot/etc/profile,添加内容:

export PS1='[\u@\h \W]\$'

6、手动编辑passwd,group,shadow三个文件为目标的Linux主机提供用户账号:

# vim /mnt/sysroot/etc/passwd

wKioL1P4EwXidqxDAAA-D1tFJ7M749.jpg

# vim /mnt/sysroot/etc/group

wKiom1P4EhfQTI5uAAApKZ8P3Og668.jpg

用户的密码是由md5单向加密算法生成的,生成密码的方式:

# openssl passwd -1 -salt `openssl rand -hex 4`

编辑shadow文件将生成的密码复制在文件中:

# vim /mnt/sysroot/etc/shadow

wKiom1P4ErLw_X5yAABlBeDKVnA020.jpg

四、启动小型的Linux系统:

wKiom1P4FWrh8vCdAAL7M0WOeoM768.jpg

在终端登录:

wKiom1P4FcjxusMuAABjqu9bdXs430.jpg

如果没有在rc.sysinit文件中定义加载HOSTNAME主机名的内容,那么启动终端的时候主机名的部分为none,所以在rc.sysinit中有source /etc/sysconfig/network的定义。而且,如果用户习惯用bash终端登录程序的话,那么主机名部分由于bash并不是在busybox中直接提供的,需要将bash移植到/bin/目录中,对应于宿主是/mnt/sysroot/bin/目录,同时还要复制对应的库文件到目标主机的/lib64目录下,但是登录后用户名部分是空的,因为bash程序需要借助nsswitch来实现用户名和密码的解析,所以如果要使用bash登录,需要移植nsswitch的应用程序和库文件及相应的工具文件到目标主机中。复制的过程中要注意保留原文件的属性信息。

# cp -a -d /lib64/libnss_files* /mnt/sysroot/lib64

# mkdir /mnt/sysroot/usr/lib64

# cp -a -d /usr/lib64/libnss3.so /mnt/sysroot/usr/lib64

# cp -a -d /usr/lib64/libnss_files.so /mnt/sysroot/usr/lib64

# cp -a -d /usr/lib64/libnsspem.so /usr/lib64/libnsssysinit.so /usr/lib64/libnssutil3.so /mnt/sysroot/usr/lib64

为nsswitch提供配置文件,从宿主机一端复制配置文件到目标主机的相应目录:

# cp /etc/nsswitch.conf /mnt/sysroot/etc

手动制作的小型Linux系统制作完成。