20-3.自制小型LINUX系統,內核編譯,busybox介紹

自制小型linux系統

分析得知:

  1. 引導grub,內核和initramfs三樣不可缺少。
  2. 執行的第一個進程/sbin/init因爲需要的配置文件太多也沒必要,我們可以直接進入系統後第一個進程改爲bash shell(讓/sbin/init指向它)
  3. 安裝(拷貝)需要的軟件程序到這個linux系統中(包括它需要的庫文件等),這樣一個簡單的liunx系統便完成了。

具體步驟

  1. 分區並創建文件系統
    fdisk /dev/sdb
    分兩個必要的分區
    /dev/sdb1對應/boot /dev/sdb2對應根 /
    mkfs.ext4 /dev/sdb1
    mkfs.ext4 /dev/sdb2
    (mkswap /dev/sdb3)
  2. 掛載boot
    mkdir /mnt/boot
    • 子目錄的目錄名必須爲boot,父目錄沒要求但下面要指明父目錄(因爲要用--root,詳細查看man幫助grub)
      mount /dev/sdb1 /mnt/boot (可以不掛載根/dev/sdb2)
  3. 安裝grub
    grub-install --root-directory=/mnt /dev/sdb
  4. 恢復內核和initramfs文件
    • 也可以kernel安裝包安裝,rpm --root=/dev/sdb2 --nodeps,不過這樣會沒有initramfs文件,因爲腳本會執行錯誤,所以還得手動生成它,不如直接拷貝
      - 或者更好的方法是yum --installroot=/dev/sdb2 install kernel.x86_64 ,前提是配置了yum源,這樣做不僅能裝好根和initramfs等,還能創建好許多必要的文件夾。
      cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/
      cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot
  5. 建立grub.conf
    vim /mnt/boot/grub/grub.conf
    • 注意有細微的幾項差別,以及注意了在這裏寫的root是sda2(雖然當前是sdb2,但是拆掉此設備到其他機器上時就是sda2了)
title simple_linux
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 
selinux=0  :selinux關閉
init=/bin/bash :指定bash
initrd /initramfs-2.6.32-642.el6.x86_64.img
chroot /mnt/sysroot
  1. 創建一級目錄
    mkdir /mnt/sysroot
    mount /dev/sdb2 /mnt/sysroot
    mkdir –pv /mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}
  2. 複製bash和相關庫文件(利用編寫的cpcmd腳本)
  3. 複製相關命令及相關庫文件
    如:ifconfig,insmod,ping,mount,ls,cat,df,lsblk,blkid等
    • 注意複製的時候也是要創建一個文件夾,然後把將來要作爲根分區的分區(sdb2)掛載上去,然後把cpcmd腳本中的目標目錄改爲此文件夾,進行拷貝即可。
    • 當然最好還是用busybox。

注意點

  1. 還是用yum安裝內核的方式比較好,因爲它會把所有的模塊也給安裝上,這樣的話網絡功能也能夠啓用,只需要進入bash shell之後把網絡驅動給載入即可(可以嘗試下用init啓動)。
    • insmod e1000.ko 命令來加載模塊,注意要提前拷貝這個模塊。
  2. 如果想要開機之後能把除了根之外的boot分區掛載上(包括其他分區),以及啓動網絡功能進行各種初始化操作。可以直接在grub.conf中的init=/bin/bash中自己寫一個bash腳本,然後添加上各種初始化設置,讓init指向它即可(當然也要把原本的bash給添加到這個腳本里面,就相當於再原來的bash腳本基礎上增添一些操作)

內核編譯

單內核體系設計、但充分借鑑了微內核設計體系的優點,爲內核引入模塊化機制

  • 內核組成部分:
    kernel:內核核心,一般爲bzImage,通常在/boot目錄下名稱爲 vmlinuz-VERSION-RELEASE
    kernel object:內核對象,一般放置於/lib/modules/VERSION-RELEASE/
    [ ]: N :代表不啓用此功能
    [M]: M :啓用此功能但是會把模塊放在lib/modules中
    [*]: Y :啓用功能並將模塊放在vmlinuz中
  • 輔助文件:ramdisk
    initrd
    initramfs

前提:

(1) 準備好開發環境
(2) 獲取目標主機上硬件設備的相關信息
(3) 獲取目標主機系統功能的相關信息
例如:需要啓用相應的文件系統
(4) 獲取內核源代碼包
www.kernel.org

開發環境準備

  • 包組
    Development Tools
  • 目標主機硬件設備相關信息
    CPU:
    cat /proc/cpuinfo
    x86info -a
    lscpu

硬件設備

  • PCI設備:
    lspci
    -v
    -vv
    lsusb
    -v
    -vv
    lsblk 塊設備
  • 瞭解全部硬件設備信息
    hal-device:CentOS 6

安裝系統

安裝開發包組
下載源碼文件
.config:準備文本配置文件
make menuconfig:配置內核選項
make [-j #]
make modules_install:安裝模塊
make install :安裝內核相關文件
安裝bzImage爲/boot/vmlinuz-VERSION-RELEASE
生成initramfs文件
編輯grub的配置文件

編譯內核示例

tar xf linux-VERSION.tar.xz -C /usr/src
cd /usr/src
#n -sv linux-4.20.2 linux
cd /usr/src/linux-VERSION
cp /boot/config-$(uname -r) ./.config
make help
make menuconfig :需要安裝一些包才能執行此命令
make -j 2
make modules_install
make install
reboot

編譯內核

  1. 配置內核選項
    支持“更新”模式進行配置:make help
    (a) make config:基於命令行以遍歷的方式配置內核中可配置的每個選項
    (b) make menuconfig:基於curses的文本窗口界面
    (c) make gconfig:基於GTK (GNOME)環境窗口界面
    (d) make xconfig:基於QT(KDE)環境的窗口界面
    支持“全新配置”模式進行配置
    (a) make defconfig:基於內核爲目標平臺提供的“默認”配置進行配置
    (b) make allyesconfig: 所有選項均回答爲“yes“
    (c) make allnoconfig: 所有選項均回答爲“no“

  2. 編譯
    全編譯:make [-j #]
    編譯內核的一部分功能:
    (a) 只編譯某子目錄中的相關代碼
    cd /usr/src/linux
    make dir/
    (b) 只編譯一個特定的模塊
    cd /usr/src/linux
    make dir/file.ko
    示例:只爲e1000編譯驅動:
    make drivers/net/ethernet/intel/e1000/e1000.ko

如何交叉編譯內核:

編譯的目標平臺與當前平臺不相同
make ARCH=arch_name

  • 要獲取特定目標平臺的使用幫助
    make ARCH=arch_name help
    示例:
    make ARCH=arm help

在已經執行過編譯操作的內核源碼樹做重新編譯

需要事先清理操作:
make clean:清理大多數編譯生成的文件,但會保留config文件等
make mrproper: 清理所有編譯生成的文件、 config及某些備份文件
make distclean:mrproper、清理patches以及編輯器備份文件

卸載內核

刪除/lib/modules/目錄下不需要的內核(對應內核的module)庫文件
(刪除/usr/src/linux/目錄下不需要的內核源碼:根據自己裝的源碼位置來刪除)
刪除/boot目錄下啓動的內核和內核映像文件
更改grub的配置文件,刪除不需要的內核啓動列表(6中手寫title的項目刪除,而7中在完成了前面步驟之後直接grub2-mkconfig重新生成就會自動刪除掉去掉的內核項)

注意點:

  1. 內核因爲配置項太多,因此用菜單模式來選擇。我們可以參考已有的文本配置文件來生成菜單並進行修改。
    • 這個已有的文本配置文件就是在已經編譯安裝好的linux內核中boot文件夾中的config_VERSION文件
    • 其中y代表打入內核,m代表模塊中,not set並註釋就代表沒有啓動此功能。
    • 將此已經存在的配置文件拷貝並命名爲.config作爲參考來執行下一步的make menuconfig
  2. 自己編譯內核可將NTFS文件系統功能給啓用,修改的時候用菜單方式修改(需要利用1中說的參考的文本配置文件,不然項目太多一個一個改也麻煩也不現實)
  3. 安裝時分爲安裝模塊和安裝內核兩步。
  4. 一個linux系統中可以同時裝多個內核,因此直接編譯安裝新內核即可。
    • 之前做過rpm安裝內核包的實驗,boot中會出現兩個內核文件和相對應的initramfs.img,以及lib/modules中也會出現兩個內核版本文件夾。
    • 開機的時候選擇載入哪個內核即可,(如果是手動添加的內核,當然這需要修改grub.conf中的設置,新加一個title即可。用命令make modules_install和make install命令添加的自動就會添加到grub.conf(或grub.cfg)文件中)
  5. make menuconfig需要安裝一些依賴的包才能執行,根據提示一個一個裝
    • 基於最小化的安裝包環境(裝包組的話太多了)
yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel
openssl openssl-devel systemd-devel zlib-devel vim lrzsz tree screen lsof tcpdump wget ntpdate net-tools iotop bc zip unzip nfs-utils
  1. menu通用設置中的local version可以自己書寫一下,其中寫的就是內核中前面主版本號後面寫的內容。注意最開頭處加上橫槓-比較好,比如-myversion-1.0.
    • 修改需要修改的項目比如NTFS之後保存,然後就會修改掉.config文件。之後便會根據它進行編譯。可以查看一下它是否確實修改了。
  2. 之後make -j N && echo -e "\a"進行編譯 即可(最好session或者nohup).如果報錯需要某些文件包則先裝好,然後再嘗試。
  3. 如果只爲了NTFS,NTFS文件格式的支持在epel源中有包可以進行操作。會多一個mount.ntfs命令,對NTFS格式文件系統的分區進行掛載之後便可可讀可寫。

Busybox

定製小型的Linux操作系統:linux內核+busybox(安卓手機就是類似如此)
官方網站:https://busybox.net/
busybox命令可能選項比較少,不過也基本夠用。同時它還集成了庫文件,不用再另外安裝拷貝了。

Busybox使用

busybox 的編譯過程與Linux內核的編譯類似
busybox的使用有三種方式:

  1. busybox後直接跟命令,如 busybox ls
  2. 直接將busybox重命名,如 cp busybox tar
  3. 創建符號鏈接,如 ln -s busybox rm

busybox的安裝

以上方法中,第三種方法最方便,但爲busybox中每個命令都創建一個軟鏈接,相當費事,busybox提供自動方法:busybox編譯成功後,執行make install,則會產生一個_install目錄,其中包含了busybox及每個命令的軟鏈接

編譯Busybox

yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel libmcrypt-devel glibc-static ncurses-devel
wget https://busybox.net/downloads/busybox-1.30.0.tar.bz2
tar xvf busybox-1.30.0.tar.bz2
cd busybox-1.30.0/
make menuconfig
  • 注意,在menu中按下面選擇,把busybox編譯成靜態二進制、不用共享庫,這樣的話這些二進制文件所需要的庫文件就會被打包集成在busybox中了而不是在當前操作系統的lib中
  • busybox本身就是一個程序,只不過功能衆多而已,被視爲多個程序的組合。實質上就是一個程序,要理解靜態編譯在這裏的作用)
  • 此時直接拷貝在其它機器上這個busybox也能執行了:
    Busybox Settings -->Build Options -->[*] Build BusyBox as a static binary (no shared libs)
    然後繼續下面命令
make  :只生成二進制文件不生成軟鏈接 
make install  :把軟鏈接也生成,以後執行命令就方便了
- 如果出錯,執行make clean後,重新執行上面命令
mkdir /mnt/sysroot/
cp -a _install/* /mnt/sysroot/ :真正的busybox就在_install/bin/busybox 其他的在此目錄內的命令都是軟鏈接

Busybox也可直接下載編譯好的二進制,在官網上有。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章