如何制作可引导的定制的Linux系统iso文件
前言:
对于搞Linux系统的人来说,Linux本身就像是一个灵魂,把它烧写到硬件上,原本死寂的硬件就能跑起来,这时候的你想来是有些小激动。不过对于不同的硬件,我们需要对Linux系统作相应的裁剪,也就是通常所说的系统定制了。
今天,我想写这样一篇文章。于我本人,可以当作笔记,到时不记得了可以有参考;于大家,可以当作学习教材,自己尝试做一篇加深对Linux系统的认识。本人所使用的编译环境为:Linux ubuntu 4.15.0-36-generic,如果大家使用的是其他环境,我这里没办法保证会和我的结果完全一致,另外在实际的编译当中,可能因为没有安装相对应的deb导致编译不成功,这个时候需要网上搜索一下具体的原因,将对应的deb安装上直到编译成功,所以这两点是需要注意的。好了费话不多说,进入正题。
Linux内核编译:
之前我在专栏
的第一篇有讲过怎么去编译Linux内核, 不过讲的不全面,也没有讲到定制的问题,今天我要写的更加全面。
首先,我们需要去 Linux官网下载一个稳定的内核版本,比方我自己下载的是linux-4.14.78. tar.xz,大家可以使用wget命令直接下载,然后解压,分别执行命令
xz -d linux-4.14.78.tar.xz
tar xvf linux-4.14.78.tar
这样就解压出了linux内核源码,如图所示。
进入linux-4.14.78,执行make menuconfig命令,来配置编译选项,比方我这里将USB/IP配置成编译进内核,这样这个模块就直接在编译启动时就加载了。
经过一两个小时之后, 我们可以将Linux内核编译完成,并找到bzImage文件。
这个bzImage文件正是我们需要制作可引导的iso文件的一个组件。
因为,我们最终希望把编译好的Linux制作成iso文件,所以这里还需要讲解如何制作rootfs和如何将initrd.img,bzImage和grub等文件制作成为可引导的iso文件。
使用busybox来制作rootfs:
- 下载 busybox,比方我这里下载的是busybox-1.29.0.tar.bz2
- 解压并编译
编译busybox和编译内核有几分相似,先执行make menuconfig,如图:
- 配置
选择Busybox Settings—>Build Options—>,选择[] Build Busybox as a static binary(no shared libs) ,按Y选中 ESC退出
成功编译后提示:
LINK busybox_unstripped
Static linking against glibc, can't use --gc-sections
Trying libraries: crypt m
Library crypt is not needed, excluding it
Library m is needed, can't exclude it (yet)
Final link with: m
DOC busybox.pod
DOC BusyBox.txt
DOC busybox.1
DOC BusyBox.html
注意这里的Static linking against glibc, can't use --gc-sections并不是错误。运行file命令查看busybox的属性。
执行make install安装busybox,在当前目录下可以看到有一个_install的目录产生,我们可以查看这个目录,其实就是各种Linux的命令行工具和一些配置文件的集合。
到这一步,我们可以说已经完成了rootfs的一半工作,接下来我们在/home/user/Linux_zhih u/目录建一个viz的目录,当然这个名字可以自己命名成其它的,并执行以下脚本:
#!/bin/sh
echo "------Create rootfs directons......"
mkdir rootfs
cd rootfs
echo "--------Create root,dev......"
mkdir root dev etc bin sbin mnt sys proc lib home tmp var usr
mkdir usr/sbin usr/bin usr/lib usr/modules
mkdir mnt/usb mnt/nfs mnt/etc mnt/etc/init.d
mkdir lib/modules
chmod 1777 tmp
cd ..
echo "-------make direction done---------"
并将busybox的_install目录下的文件都拷贝到这个新建的rootfs中,这样一个rootfs的框架就建立起来了。
- 创建设备文件
进入dev目录中执行以下两个命令来创建console和null两个字符设备
mknod -m 660 console c 5 1
mknod -m 660 null c 1 3
进入etc目录,编辑fstab,输入以下内容
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
mdev /dev ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
在etc下创建init.d目录,并在init.d目录下编辑rcS文件且加上可执行权限,输入以下内容
#! /bin/sh
/bin/mount -a
在etc下编辑inittab,输入以下内容
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/bin/umount -a -r
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff –a
在etc下编辑group文件,输入以下内容
root:*:0:
daemon:*:1:
bin:*:2:
sys:*:3:
adm:*:4:
tty:*:5:
disk:*:6:
lp:*:7:lp
mail:*:8:
news:*:9:
uucp:*:10:
proxy:*:13:
kmem:*:15:
dialout:*:20:
fax:*:21:
voice:*:22:
cdrom:*:24:
floppy:*:25:
tape:*:26:
sudo:*:27:
在etc下编辑profile文件,输入以下内容
# /etc/profile: system-wide .profile file for the Bourne shells
echo
echo "Mini2440 FileSystem is Ready ..."
echo
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]\# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
到此rootfs的制作就完成了,我们还需要将它制作成initrd.gz的根文件系统镜像文件,执行以下命令
ln -sv bin/busybox init
这个命令很重要,不然会有错误产生。
执行以下命令来产生initrd.gz的根文件系统压缩文件
find . | cpio -H newc -o | gzip -9 -n >/home/user/initrd.gz
到此, 我们有了两个重要的文件:bzImage和initrd.gz,有这两个文件我们就可以来制作iso文件了。
我们在viz目录下,创建一个iso的目录,并将bzImage和initrd.gz两个文件拷贝到该目录下。
现在我们还需要引导用的grub文件。
- 依次创建目录liveCD,liveCD/ttylinux,liveCD/boot及liveCD/boot/grub目录。
- 复制grub可引导的iso文件所需的引导程序
cp -rv /usr/share/grub/default/* boot/grub
3. 将bzImage和initrd.gz放到ttylinux目录下
4. 在boot/grub/目录下编辑grub.conf文件
default 0
timeout 10
title ttylinux for testing (make by xujiwei, xujiweigo@163.com)
root (cd)
kernel /ttylinux/bzImage load_ramdisk=1 prompt_ramdisk=0
ramdisk_size=8192 ro root=/dev/ram0
initrd /ttylinux/initrd.gz
5. 执行以下命令来产生iso文件
mkisofs -R -b ttylinux/bzImage -no-emul-boot -boot-load-size 4 -boot-info-table -o ttylinux.iso liveCD
执行成功后会看到如下信息
I: -input-charset not specified, using utf-8 (detected in locale settings)
Size of boot image is 4 sectors -> No emulation
Total translation table size: 2048
Total rockridge attributes bytes: 1287
Total directory bytes: 6144
Path table size(bytes): 50
Max brk space used 24000
4992 extents written (9 MB)
查看产生的ttylinux.iso文件
至此,我们已经做好了一个可引导的,定制的(加入了usb/ip模块),基于linux系统的iso文件,这个文件直接可以运行在vmware中。