日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Linux操作系統(tǒng)分析(7)

 絲廣里 2019-11-14

提要

         linux的啟動過程,包括BIOS的加電自檢POST,拷貝MBR的信息(啟動BootLoader),加載內(nèi)核,掛載根文件安系統(tǒng)這幾大步熟悉grub的話會知道linux啟動時grub中有三項:root,kernel,initrd。其三項的作用分別是:

1.指定內(nèi)核所在的目錄
2.指定內(nèi)核的名稱,以及掛載根目錄的方式,還有向內(nèi)核傳遞一定的參數(shù)
3.initrd實際就是個小的linux系統(tǒng),在一般的系統(tǒng)中initrd的作用是:啟動一個很小的linux用來掛載真實的linux。

       今天的目的就是從內(nèi)核開始,打造一個屬于自己的linux。

環(huán)境:Ubuntu13.04 gcc4.7.3

相關(guān)的準(zhǔn)備工作:

內(nèi)核的編譯

qemu的安裝

 制作根系統(tǒng)目錄

1)創(chuàng)建init程序 
首先創(chuàng)建一個init.c文件,代碼如下:
#include<stdio.h>int main(){ printf('Welcome! My student No. is sa*****310.\n'); return 0;}

 靜態(tài)編譯成一個可執(zhí)行文件。
gcc -static -o init init.c

2)建立引導(dǎo)根目錄映像
終端運行:
dd if=/dev/zero of=initrd.img bs=4096 count=1024
mkfs.ext3 initrd.img
 有提示,輸入y。

關(guān)于dd

dd 是 Linux/UNIX 下的一個非常有用的命令,作用是用指定大小的塊拷貝一個文件,并在拷貝的同時進(jìn)行指定的轉(zhuǎn)換。
語法:dd [選項] 
if =輸入文件(或設(shè)備名稱)。 
of =輸出文件(或設(shè)備名稱)。 
ibs = bytes 一次讀取bytes字節(jié),即讀入緩沖區(qū)的字節(jié)數(shù)。 

...



3)創(chuàng)建rootfs目錄,并掛載
mkdir rootfs
sudo mount -o loop initrd.img rootfs

4)在rootfs中添加一些文件
將init拷貝到initrd4M.img的目標(biāo)根目錄下(因為linux啟動后期會在根目錄中尋找一個應(yīng)用程序來運行,在根目錄下提供init是一種可選方案)
cp init rootfs/
準(zhǔn)備dev目錄:
sudo mkdir rootfs/dev
linux啟動過程中會啟用console設(shè)備:
sudo mknod rootfs/dev/console c 5 1
另外需要提供一個linux根設(shè)備,我們使用ram:
sudo mknod rootfs/dev/ram b 1 0
sudo umount rootfs
至此,一個包含簡單應(yīng)用程序的根目錄initrd4M.img映像就準(zhǔn)備好。

mknod 
用于制作字符或塊相關(guān)文件


用qemu跑一下:
qemu -kernel ../linux-3.9.2/arch/x86/boot/bzImage -initrd initrd.img -append 'root=/dev/ram init=/init'




整合busybox


busybox簡介

           BusyBox 是一個集成了一百多個最常用linux命令和工具的軟件。BusyBox 包含了一些簡單的工具,例如ls、cat和echo等等,還包含了一些更大、更復(fù)雜的工具,例如grep、find、mount以及telnet。有些人將 BusyBox 稱為 Linux 工具里的瑞士軍刀。簡單的說BusyBox就好像是個大工具箱,它集成壓縮了 Linux 的許多工具和命令,也包含了 Android 系統(tǒng)的自帶的shell。
            BusyBox 將許多具有共性的小版本的UNIX工具結(jié)合到一個單一的可執(zhí)行文件。這樣的集合可以替代大部分常用工具比如的GNU fileutils , shellutils等工具,BusyBox提供了一個比較完善的環(huán)境,可以適用于任何小的或嵌入式系統(tǒng)。

下載源碼:http://www./

這里選擇1.20穩(wěn)定版。

解壓,終端進(jìn)入目錄執(zhí)行:

make menuconfig

勾選下面的選項:

Build Options
Build BusyBox as a static binary (no shared libs)


這個選項是一定要選擇的,這樣才能把busybox編譯成靜態(tài)鏈接的可執(zhí)行文件,運行時才獨立于其他函數(shù)庫.否則必需要其他庫文件才能運行,在單一個linux內(nèi)核不能使他正常工作.

現(xiàn)在直接make的話會報錯:‘RLIMIT_FSIZE’ undeclared

論壇上的回答是沒有包含  sys/resource.h,則在include/libbb.h 中添加:

#include <sys/resource.h>

接下來執(zhí)行:

#編譯busybox

make 

#安裝busybox
make install 

 

安裝好之后在文件夾下出現(xiàn)一個_install文件夾,編譯完成。

下面來整合根文件系統(tǒng)。

新建一個文件夾,終端cd進(jìn)去,將之前的initrd.img拷貝進(jìn)來。

#創(chuàng)建文件夾

mkdir rootfs

#掛載鏡像

sudo mount -o loop initrd.img rootfs/ 

#將busybox添加進(jìn)來

cd ../busybox-1.20.2/

sudo make CONFIG_PREFIX=../Opuntu/rootfs/ install

#查看rootfs中結(jié)構(gòu)

cd ../Opuntu

ls rootfs

 #卸載分區(qū)

sudo umount rootfs/

運行命令時注意目錄結(jié)構(gòu)!

linux的系統(tǒng)下的目錄都是干嘛的?

linux下的文件結(jié)構(gòu),看看每個文件夾都是干嗎用的
/bin 二進(jìn)制可執(zhí)行命令 
/dev 設(shè)備特殊文件 
/etc 系統(tǒng)管理和配置文件 
/etc/rc.d 啟動的配置文件和腳本 
/home 用戶主目錄的基點,比如用戶user的主目錄就是/home/user,可以用~user表示 
/lib 標(biāo)準(zhǔn)程序設(shè)計庫,又叫動態(tài)鏈接共享庫,作用類似windows里的.dll文件 
/sbin 系統(tǒng)管理命令,這里存放的是系統(tǒng)管理員使用的管理程序 
/tmp 公用的臨時文件存儲點 
/root 系統(tǒng)管理員的主目錄(呵呵,特權(quán)階級) 
/mnt 系統(tǒng)提供這個目錄是讓用戶臨時掛載其他的文件系統(tǒng)。 

...

最后生成的 initrd.img文件就是根文件系統(tǒng)了!

#qemu測試

qemu -kernel ../linux-3.9.2/arch/x86/boot/bzImage -initrd initrd.img -append 'root=/dev/ram init=/bin/sh'

裝載好之后可以在qemu中運行busybox的命令,效果如下:


整合grub

關(guān)于Grub

        GNU GRUB(簡稱“GRUB”)是一個來自GNU項目的多操作系統(tǒng)啟動程序。GRUB是多啟動規(guī)范的實現(xiàn),它允許用戶可以在計算機(jī)內(nèi)同時擁有多個操作系統(tǒng),并在計算機(jī)啟動時選擇希望運行的操作系統(tǒng)。GRUB可用于選擇操作系統(tǒng)分區(qū)上的不同內(nèi)核,也可用于向這些內(nèi)核傳遞啟動參數(shù)。

首先來測試一下grub.

從ftp://alpha.gnu.org/gnu/grub/下載GRUB Legacy的最后一個版本0.97的編譯好的文件grub-0.97-i386-pc.tar.gz.

解壓之后中端cd進(jìn)去,執(zhí)行下面的命令。

#建立軟盤映像:
dd if=/dev/zero of=boot.img bs=512 count=2880
#在boot.img中安裝grub:
sudo losetup /dev/loop0 boot.img
sudo dd if=./grub-0.97-i386-pc/boot/grub/stage1 of=/dev/loop0 bs=512 count=1
sudo dd if=./grub-0.97-i386-pc/boot/grub/stage2 of=/dev/loop0 bs=512 seek=1
sudo losetup -d /dev/loop0

在qemu中測試是否可以進(jìn)入grub

qemu -fda boot.img



OK.

接下來將grub,kernel,busybox一起整合,離勝利只還有一步 - - 。

先你自己發(fā)行版取一個庫一些的名字,比如Opuntu...(Opensuse+ubuntu),創(chuàng)建一個以它命名的文件夾。

#拷貝boot.img到當(dāng)前目錄

sudo cp ../grub-0.97-i386-pc/boot.img ./

#創(chuàng)建rootfs文件夾

mkdir rootfs

#創(chuàng)建一個32M的磁盤鏡像文件
dd if=/dev/zero of=/dev/zero of=Opuntu.img bs=4096 count=8192
#給磁盤映像分區(qū)
fdisk -C 16065 -H 255 -S 63 Opuntu.img


解釋:設(shè)置Opuntu.img的磁頭數(shù)為255、磁道數(shù)為16065、扇區(qū)數(shù)為63,同時給磁盤分區(qū)。
這里我們只分一個區(qū),并設(shè)置該分區(qū)為引導(dǎo)分區(qū)。示意圖如下:


#格式化分區(qū)
sudo losetup -o 1048576 /dev/loop0 Opuntu.img

sudo mkfs.ext3 -m 0 /dev/loop0


解釋:我們把前面的2048個扇區(qū)(0~2047)作為引導(dǎo)扇區(qū)使用,格式化分區(qū)從第2048個扇區(qū)開始,所以1048576=2048*512

#拷貝之前做好的initrd.img和bzImage.img到rootfs

sudo mount /dev/loop0 rootfs/
sudo cp ../linux-3.9.2/arch/x86/boot/bzImage ./rootfs/
sudo cp ../rootfs/initrd.img ./rootfs/


#添加grub

sudo mkdir rootfs/boot
sudo mkdir rootfs/boot/grub

sudo cp ../grub-0.97-i386-pc/boot/grub/* ./rootfs/boot/grub
sudo vi ./rootfs/boot/grub/menu.lst

內(nèi)容:

default 0timeout 30title linux on 32M.imgroot (hd0,0)kernel (hd0,0)/bzImage root=/dev/ram init=/bin/ashinitrd (hd0,0)/initrd.img

#卸載磁盤鏡像

sudo umount rootfs
sudo losetup -d /dev/loop0

#利用grub啟動軟盤,在硬盤映像上添加grub功能
qemu -boot a -fda boot.img -hda Opuntu.img

執(zhí)行圖中的兩步(注意空格):


運行成功之后,Opuntu.img就是我們的最終成果了,集成了busybox,grub,linux kernel3.92!

qemu -hda Opuntu.img

用qemu跑起來:



參考:

鳥哥私房菜 第二十二章:開關(guān)機(jī)流程與loader

制作可用grub引導(dǎo)Linux系統(tǒng)的磁盤映像文件 - http://blog.sina.com.cn/s/blog_70dd169101013gcw.html

詳細(xì)講解Linux啟動流程及啟動用到的配置文件及腳本 - http://guodayong.blog.51cto.com/263451/1168731

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多