如何製作可引導的定製的Linux系統iso文件

前言:

對於搞Linux系統的人來說,Linux本身就像是一個靈魂,把它燒寫到硬體上,原本死寂的硬體就能跑起來,這時候的你想來是有些小激動。不過對於不同的硬體,我們需要對Linux系統作相應的裁剪,也就是通常所說的系統定製了。

今天,我想寫這樣一篇文章。於我本人,可以當作筆記,到時不記得了可以有參考;於大家,可以當作學習教材,自己嘗試做一篇加深對Linux系統的認識。本人所使用的編譯環境為:Linux ubuntu 4.15.0-36-generic,如果大家使用的是其他環境,我這裡沒辦法保證會和我的結果完全一致,另外在實際的編譯當中,可能因為沒有安裝相對應的deb導致編譯不成功,這個時候需要網上搜索一下具體的原因,將對應的deb安裝上直到編譯成功,所以這兩點是需要注意的。好了費話不多說,進入正題。

Linux內核編譯:

之前我在專欄

Linux 4.x 內核API淺析?

zhuanlan.zhihu.com圖標

的第一篇有講過怎麼去編譯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:

  1. 下載busybox,比方我這裡下載的是busybox-1.29.0.tar.bz2
  2. 解壓並編譯

編譯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, cant use --gc-sections
Trying libraries: crypt m
Library crypt is not needed, excluding it
Library m is needed, cant exclude it (yet)
Final link with: m
DOC busybox.pod
DOC BusyBox.txt
DOC busybox.1
DOC BusyBox.html

注意這裡的Static linking against glibc, cant 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文件。

  1. 依次創建目錄liveCD,liveCD/ttylinux,liveCD/boot及liveCD/boot/grub目錄。
  2. 複製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中。


推薦閱讀:

TAG:Ubuntu | Linux | 操作系統 |