电竞比分网-中国电竞赛事及体育赛事平台

分享

帶你閱讀linux內(nèi)核源碼:下載源碼、編譯內(nèi)核并運(yùn)行一個(gè)最小系統(tǒng)

 15所 2020-07-11

要學(xué)習(xí)linux內(nèi)核,先要能夠編譯內(nèi)核,還需要了解內(nèi)核如何啟動(dòng)根文件系統(tǒng)。這樣你才能在修改linux內(nèi)核代碼之后,完成驗(yàn)證的過程。

本文教你完成下列過程:

1.下載linux并編譯linux內(nèi)核源碼

2.編譯busybox

3.制作一個(gè)最小的根文件系統(tǒng)

4.qemu啟動(dòng)你編譯好的內(nèi)核和根文件系統(tǒng)

帶你閱讀linux內(nèi)核源碼:下載源碼、編譯內(nèi)核并運(yùn)行一個(gè)最小系統(tǒng)

linux源碼下載地址:

https://mirrors.edge./pub/linux/kernel/

我選擇的版本是:4.9.229

https://cdn./pub/linux/kernel/v4.x/linux-4.9.229.tar.xz

下載到本地,解壓,然后進(jìn)入linux-4.9.229目錄:

1.指定硬件體系架構(gòu)。

為了減少安裝編譯器的過程,我在本例中使用的是x86,因?yàn)槲业拈_發(fā)環(huán)境就是x86。如果你要編譯arm的內(nèi)核,則指定ARCH=arm且需要安裝交叉編譯器。

# export ARCH=x86

2.配置board config,此處配置為 x86_64_defconfig。好了,我們點(diǎn)好菜了,菜單就是x86_64_defconfig

# make  x86_64_defconfig

3.配置內(nèi)核

這一步其實(shí)是對第2步的菜單進(jìn)行微調(diào),我們需要內(nèi)核支持ramdisk驅(qū)動(dòng),所以需要選中如下配置:

General setup ---> ----> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support Device Drivers ---> [*] Block devices ---> <*> RAM block device support (65536) Default RAM disk size (kbytes)

4.編譯內(nèi)核

# make

編譯成功后的內(nèi)核位于:arch/x86_64/boot/bzImage

帶你閱讀linux內(nèi)核源碼:下載源碼、編譯內(nèi)核并運(yùn)行一個(gè)最小系統(tǒng)

下載buysbox源碼,下載地址:

https:///downloads/

我使用的版本是busybox-1.30.0

1.解壓buysbox源碼

# tar xvf busybox-1.30.0.tar.bz2

2.配置buysbox源碼

在這里我們把busybox配置為靜態(tài)編譯,這樣busybox在運(yùn)行的時(shí)候就不需要額外的動(dòng)態(tài)鏈接庫了。

# make menuconfigBusybox Settings  --->      Build Options  --->            [*] Build BusyBox as a static binary (no shared libs)

3.編譯和安裝

#make && make install

4.編譯完成后的busybox就安裝在源碼根目錄下的_install目錄了,我們進(jìn)入_install目錄,補(bǔ)充一些必要的文件或目錄,相關(guān)的shell命令如下:

# mkdir etc dev mnt# mkdir -p etc/init.d/# vim etc/fstabproc  /proc proc  defaults 0 0temps /tmp  rpoc  defaults 0 0none  /tmp  ramfs defaults 0 0sysfs /sys  sysfs defaults 0 0mdev  /dev  ramfs defaults 0 0# vim etc/init.d/rcSmkdir -p /procmkdir -p /tmpmkdir -p /sysmkdir -p /mnt/bin/mount -amkdir -p /dev/ptsmount -t devpts devpts /dev/ptsecho /sbin/mdev > /proc/sys/kernel/hotplugmdev -s# chmod 755 etc/init.d/rcS# vim etc/inittab::sysinit:/etc/init.d/rcS::respawn:-/bin/sh::askfirst:-/bin/sh::cttlaltdel:/bin/umount -a -r# chmod 755 etc/inittab# cd dev# mknod console c 5 1# mknod null c 1 3# mknod tty1 c 4 1 

這樣一個(gè)最小的、完整的可以被內(nèi)核啟動(dòng)的文件系統(tǒng)就齊活啦。

帶你閱讀linux內(nèi)核源碼:下載源碼、編譯內(nèi)核并運(yùn)行一個(gè)最小系統(tǒng)

制作根文件系統(tǒng)鏡像文件。

思路:

1.先制作一個(gè)空的鏡像文件;

2.然后把此鏡像文件格式化為ext3格式;

3.然后把此鏡像文件掛載,并把根文件系統(tǒng)復(fù)制到掛載目錄;

4.卸載該鏡像文件。

5.打成gzip包。

#!/bin/bashrm -rf rootfs.ext3rm -rf fsdd if=/dev/zero of=./rootfs.ext3 bs=1M count=32mkfs.ext3 rootfs.ext3mkdir fsmount -o loop rootfs.ext3 ./fscp -rf ./_install/* ./fsumount ./fsgzip --best -c rootfs.ext3 > rootfs.img.gz

最終生成的文件系統(tǒng)鏡像名字為:rootfs.img.gz

準(zhǔn)備好了內(nèi)核和文件系統(tǒng)鏡像,幸福的一刻馬上來臨了:

帶你閱讀linux內(nèi)核源碼:下載源碼、編譯內(nèi)核并運(yùn)行一個(gè)最小系統(tǒng)

通過qemu模擬器啟動(dòng)我們自己編譯的內(nèi)核和文件系統(tǒng):

# qemu-system-x86_64 \  -kernel ./linux-4.9.229/arch/x86_64/boot/bzImage  \  -initrd ./busybox-1.30.0/rootfs.img.gz   \  -append 'root=/dev/ram init=/linuxrc'  \  -serial file:output.txt

這樣一個(gè)完整的最小linux系統(tǒng)就起來啦:

帶你閱讀linux內(nèi)核源碼:下載源碼、編譯內(nèi)核并運(yùn)行一個(gè)最小系統(tǒng)

好了,經(jīng)過以上的步驟,你可以自己編譯一個(gè)內(nèi)核和文件系統(tǒng)。有了這樣的基礎(chǔ),你在之后就可以自由的修改linux內(nèi)核代碼并run起來進(jìn)行驗(yàn)證啦。

記得關(guān)注“技術(shù)簡說”,持續(xù)分享linux內(nèi)核知識(shí),讓你一步一步成為linux內(nèi)核高手。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多