在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
使用静态编译的方式,将所需要的模块编译进内核,所以没有initrd文件。
1、查看CPU硬件信息:
2、查看主板信息:
注意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、定义当前编译系统的版本,可自定义:
3、选择CPU类型,在选项上选择与目标主机CPU类型最接近的一项:
选择将对称多处理器支持和多核调度。
4、选择是否允许以后为了扩展而加载模块,可以不选:
5、选择总线选项:开启选项即可,很重要,要勾选。
6、选择磁盘选项:首先在编译首页面要选择启用块层,然后在设备驱动中选择支持SCSI设备和SCSI磁盘,根据需要选择Fusion MPT设备选项。
7、选择支持的文件系统:
8、选择支持的可执行文件类型,是指支持的系统初始化文件的文件类型:
9、添加键盘鼠标的驱动:
现在鼠标键盘大多是USB口类型,需要开启USB支持,将所需要的类型添加进选项。
10、编译内核使内核识别的设备文件自动输出至/dev目录下,该选项在device driver中:
11、选择使用网络功能:
在Device driver目录中,添加所需网卡设备驱动,里面对应的网卡设备很多,只选择机器识别的网卡型号,其他型号都可以不勾选:
# 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
# make && make install
busybox安装完成后在编译目录下生成_install目录将,该目录下的所有内容复制到/mnt/sysroot目录下
# cp -a _install/* /mnt/sysroot
三、编译安装后的配置操作:
1、系统运行所需要的应用程序由busybox提供工作完成后,后续需要完成系统的初始化工作,这个流程首先需要提供inittab文件,里面定义了系统初始化过程,使用busybox作为init程序后,busybox首先会读取这个文件内的定义,然后按照里面的内容对系统进行初始化工作,但这个文件是需要手动编辑提供的,否则系统无法引导:
# vim /mnt/sysroot/etc/inittab
这个文件内的定义了系统初始化脚本的位置在/etc/rc.d/目录下的rc.sysinit,然后启动时会启动终端,定义按下ctrlaltdel键时系统的操作,以及关机时系统的操作等。
2、提供rc.sysinit脚本:
3、提供文件系统配置文件/etc/fstab,在宿主机上编辑时,文件位置为/mnt/sysroot/etc/fstab
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
# vim /mnt/sysroot/etc/group
用户的密码是由md5单向加密算法生成的,生成密码的方式:
# openssl passwd -1 -salt `openssl rand -hex 4`
编辑shadow文件将生成的密码复制在文件中:
# vim /mnt/sysroot/etc/shadow
四、启动小型的Linux系统:
在终端登录:
如果没有在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系统制作完成。