1、解压Linux内核源码包至/usr/src/目录下,并软连接至linux中。
2、进入linux文件夹中,使用make help获取帮助。执行make allnoconfig关闭所有可选的配置。
3、执行make menuconfig对内核进行编译前的功能模块进行配置。以下的配置选项是根据自己的需要和对主机适配信息选择。可通过lsmod、lscpu、lspci等进行查看。
4、进行编译。编译的最终的结果在当前目录下的arch/x86/boot/bzImage。
5、前面四步完成后,为主机添加一个新的硬盘。
6、为新的硬盘创建sdb1和sdb2两个分区,并格式化成ext4文件系统。
7、将sdb1挂载到/mnt/boot/作为新系统的boot分区,sdb2挂载到/mnt/sysroot/作为新系统的根目录。
8、在sdb设备上安装grub,并在boot下配置grub.conf文件,然后创建一些必须的文件夹。
9、使用编写的shell脚本复制本机的一些常用命令至sdb中的相应文件夹中。(shell脚本命令代码在文末)
10、可以增加额外init脚本实现开机挂载文件系统。
11、一切准备就绪之后,将上述编译好的内核系统 bzImage 复制到/mnt/boot/下之后执行sync命令。
12、新建虚拟机,注意的一项是到 选择现有磁盘 这一步时需要找到相应的新建磁盘设备。miniLinux启动成功并且发现复制过来的命令也可以执行生效了。(宿主机需要挂起或者关闭)
通过上述的实验基本上可以实现一个自定制的miniLinux系统,但是实际应用中我们需要与busyBox相互结合实现一个具有实质应用的系统。在上述的基础上:
1、我们需要以静态的方式对busyBox进行编译,首先安装glibc-static模块。
2、解压busyBox后,在解压目录下执行 make menuconfig对其进行配置。详情:https://www.busybox.net
3、编译安装busyBox。
4、编译安装完成后,生成的文件在_install目录下,并将其全部复制到/mnt/sysroot/目录下。(前面步骤所创建的文件夹和命令可全部删除,使用busyBox代替即可)
附-复制命令脚本:
#!/bin/bash
#
target=/mnt/sysroot
[ -d $target ] || mkdir /mnt/sysroot
read -p "A command: " command
libcp() {
for lib in $(ldd $1 | grep -o "[^[:space:]]*/lib[^[:space:]]*"); do
libdir=$(dirname $lib)
[ -d $target$libdir ] || mkdir -p $target$libdir
[ -f $target$lib ] || cp $lib $target$lib
done
}
while [ "$command" != 'quit' ]; do
if ! which $command &> /dev/null; then
read -p "No such command, enter again: " command
continue
fi
command=$(which --skip-alias $command)
cmnddir=$(dirname $command)
[ -d $target$cmnddir ] || mkdir -p $target$cmnddir
[ -f $target$command ] || cp $command $target$command
libcp $command
read -p "Another command(quit): " command
done