前言:
對於搞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:
編譯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文件。
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 | 操作系統 |