mini kernel
基礎概念
內核編譯步驟(下載源碼解壓)
內核編譯步驟(添加硬盤安裝grub文件)
內核編譯步驟(添加硬盤,復制程序及其依賴的庫文件腳本)
內核編譯步驟(內核配置,硬件平台驅動選定)
內核編譯步驟(內核配置,定義內核)
內核編譯步驟(創建init腳本)
內核編譯步驟(復制內核)
kernel+busybox
kernel+busybox基礎概念
下載busybox源碼包及編譯依賴的包
完善系統(添加軟件應用)
完善系統(修改grub啟動項)
完善系統(創建目錄)
完善系統(創建inittab)
完善系統(創建系統初始化腳本)
完善系統(設置主機名)
完善系統(設置管理員)
完善系統(創建fstab文件)
完善系統(添加ssh)
啟動這個內核
啟動這個內核(修改提示符)
啟動這個內核(啟動ssh)
基礎概念
內核編譯步驟(下載源碼解壓)
列出group
安裝開發環境
centos6
centos7
下載內核源碼
ln -s 軟鏈接(符號鏈接) -v 顯示詳細的處理過程
關掉內核所有的功能特性
可以看到有一個.config文件,里面的功能大多數都被-y關掉了,-m的極少
查看系統平台硬件的各種狀態信息
注意硬盤接口的類型,這里是虛擬機模擬出來的
內核編譯步驟(添加硬盤安裝grub文件)
添加一塊磁盤為SCSI,用作放置編譯好的內核
查看磁盤
n添加一個新分區
p主要(0個主要,0個擴展,4個免費)
w將表寫入磁盤並退出
格式化硬盤
mke2fs命令是專門用於管理ext系列文件系統的一個專門的工具。
-t 指定文件系統類型
創建兩個目錄,用於掛載硬盤
使用 grub-install 命令在要啟動的分區中安裝 GRUB 相關文件
-root-directory=DIR:DIR 為實際目錄,也就是手工指定 GRUB 相關文件的安裝目錄
cntos7
參考鏈接:https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/168.html
參考鏈接:https://www.cnblogs.com/f-ck-need-u/archive/2017/06/29/7094693.html#auto_id_8
創建目錄
內核編譯步驟(添加硬盤,復制程序及其依賴的庫文件腳本)
編寫腳本,復制程序及其依賴的庫文件腳本
#!/bin/bash
#
target=/mnt/sysroot
[ -d $target ] || mkdir /mnt/sysroot
read -p "A command:" command
libcp() {
for lib in $(ldd $1 | grep -o "[^[:space:]]*/lib[^[:space:]]*"); do
libdir=$(dirname $lib)
[ -d $target$libdir ] || mkdir -p $target$libdir
[ -f $target$lib ] || cp $lib $target$lib
done
}
while [ "$command" != 'quit' ]; do
if ! which $command &> /dev/null; then
read -p "No such command, enter again:" command
continue
fi
command=$(which --skip-alias $command)
cmnddir=$(dirname $command)
[ -d $target$cmnddir ] || mkdir -p $target$cmnddir
[ -f $target$command ] || cp $command $target$command
libcp $command
read -p "Another command(quit):" command
done
target=/mnt/sysroot
表示目標目錄
[ -d $target] || mkdir /mnt/sysroot
表示如果目標不存在.就創建,
-d filename 如果 filename為目錄,則為真,
|| 否則,執行后面的
read -p "A command:" command
表示read命令接收標准輸入(鍵盤)的輸入,或者其他文件描述符的輸入。得到輸入后,read命令將數據放入一個標准變量中。
-p參數,允許在read命令行中直接指定一個提示
libcp() {
for lib in $(ldd $1 | grep -o "[[:space:]]*/lib[[:space:]]*");do
libcp() 創建一個函數,復制一個命令的庫文件路徑
對$1命令做ldd命令取出命令庫文件路徑,保存在lib變量中,do開始循環,復制庫文件
grep -o -o代表的是只輸出匹配的選項
$0 就是你寫的shell腳本本身的名字,$1 是你給你寫的shell腳本傳的第一個參數,$2 是你給你寫的shell腳本傳的第二個參數
libdir=$(dirname $lib)
取出lib變量中文件的目錄,保存在libdir中
[ -d $target$libdir ] || mkdir -p $target$libdir
判斷$target目錄下是否有$libdir中的目錄,是否存在 如果不存在,就創建在$target下創建$libdir
[ -f $target$lib ] || cp $lib $target$lib
done
判斷$target下是否有$lib目錄存在,|| 如果不存在,cp $lib到$target下仍然保存為$lib,done結束
while [ "$command" != 'quit' ]; do
while循環 如果$command,!=不等於quit do就進入循環
if ! which $command &> /dev/null; then
如果which $command你給的命令不存在 &>送給/dev/null; then執行后面的命令
read -p "No such command, enter again:" command
重新讀取,仍然保存在command中
continue
continue語句的作用是跳過本次循環體中余下尚未執行的語句,立即進行下一次的循環條件判定,可以理解為僅結束本次循環。
command=$(which --skip-alias $command)
(which --skip-alias $command) 表示程序絕對路徑
賦值進command當中,覆蓋之前的變量
cmnddir=$(dirname $command)dirname 返回路徑中的目錄部分
賦值進cmnddir當中
[ -d $target$comnddir ] || mkdir -p $target$cmnddir
[ -f $target$command ] || cp $command $target$command
libcp $command
調用libcp把$command傳遞給他
-f filename 如果 filename為常規文件,則為真
read -p "Another command(quit):" command
繼續復制
內核編譯步驟(內核配置,硬件平台驅動選定)
make menuconfig'需要ncurses庫
編譯內核前先做一些配置,選擇一些特性
64-bit kernel 64位內核
Enable loadable odule support 支持模塊裝載 Module unloading 支持模塊卸載
Processor type and features 選擇與當前cpu平台,所兼容的接口類型 Syanetric nulti-processing support cpu多核心支持 Processor fanily (Generic-x86-64) 處理器平台,通用x86_64位的 Generic-x86-64 通用x86_64位的
File systens 文件系統
可以支持多種,文件系統,一般來說其實只選擇支持exit4就可以了The Extended(ext4) filesysten
Executable file fornats / Enulations 可執行文件格式
Kernel support for ELF binaries 對ELF二進制文件的內核支持
Write ELF core dunps with partial segments (NEW) 編寫帶有部分段的ELF核心轉儲(新)
Kernel support for scripts starting vith !# 對以!#開頭的腳本的內核支持
Bus options (PCI etc。)pci總線
啟用pci總線
Device Drivers 裝載硬盤驅動
SCSI device support 啟動底層硬盤驅動,否則pci接口驅動無法啟動
SCSI disk support SCSI設備支持 SCSI disk support SCSI磁盤支持
Input device support 輸入設備的驅動的支持
Keyhoards 鍵盤
AT keyboard (HEW)標准鍵盤
Mice 鼠標,如果是usb接口的,還需要加載usb驅動
USB support USB支持
主機usb
Enable USB persist by default(NEW) 主機usb設備
EHCI HCD (USB 2.0) support usb2.0驅動
xHCI HCD (USB 3.0) support usb3.0驅動
OHCI HCD support usb1.1驅動
UHCI HCD (most Intel and VIA) support usb1.1驅動
Generic Driver Options 通用驅動程序選項
Maintain a devtnpfs filesysten to lount at /dev 把內核所識別的所有設備文件,通通導出到/dev目錄下,把文件輸出出來
硬盤接口類型
Fusion IPT device support(HEW) 啟動Fusion-MPT,pci接口支持
Fusion IPT ScsiHost drivers for SPI,如果不確定可以把,FC,SAS都編譯進內核 Fusion IPT nisc device (ioctl) dri ver Fusion-MPT,MPT設備 Fusion IPT logging facility 日志,這個沒有必要
Networking support 網絡支持
Networking options 聯網選項
TCP/IP networking TCP/IP網絡
IP: multicasting IP:多播
IP: advanced router IP:高級路由器
IP: kernel level autoconfiguration IP:內核級自動配置
網絡功能驅動
Device Drivers 設備驅動程序
Network device support 網絡設備支持(網絡設備驅動)
Ethernet driver support(NEW) 以太網驅動程序支持(新)
設備上硬件時英特爾的設備,關閉所有只保留,英特爾驅動,*編譯進內核
設備上硬件時英特爾的設備,關閉所有只保留,英特爾驅動,M編譯為模塊
make bzImage,可以去除之前編譯進內核的網絡功能
找到英特爾網絡模塊
查看這個驅動有沒有依賴的其他模塊,如果有一並復制
編譯模塊
seve 保存
內核編譯步驟(內核配置,定義內核)
只編譯內核文件,編譯內核需要bc命令
bc 命令是任意精度計算器語言,通常在linux下當計算器用
make 關鍵字
-j 指定幾個內核
4 4個內核
bzImage 表示只編譯bz2壓縮格式的內核
sync 表示把內存中的數據同步到磁盤中
System is 1645 kB 表示只有1.6M大小編譯
后內核所在路徑,復制到指定的磁盤目錄
內核編譯步驟(創建init腳本)
#!/bin/bash
#
echo -e \tWelcone to \033[32mMini\033[Om Linux #Welcone顏色控制 \t打印一個制表符
mount -n -t proc proc /proc #掛載proc目錄
mount -n -t sysfs sysfs /sys #掛載到sys目錄下
mount -n -o remount, rw /dev/sda2 / #把/dev/sda2,以讀寫方式掛載之根上
/bin/bash #在執行一下bash
-n, --no-mtab,
不將掛載信息寫入 /etc/mtab ,當此 /etc 位於只讀文件系統上的時候,通常就需要使用它```。
-t, --types vfstype
指定要掛載的文件系統類型。可以使用逗號分割多種類型。當前可用的類型有(實際情況取決於內核的配置):
-o<選項> 指定加載文件系統時的選項。有些選項也可在/etc/fstab中使用。這些選項包括:
添加權限
內核編譯步驟(復制內核)
硬件驅動信息已經編譯進內核,直接配置grup配置文件,加載內核
default=0 默認啟動第一個系統
tineout=3 等待超時時間3秒
hiddenmenu # 隱藏菜單,若要顯式,在啟動時按下ESC
title Mini Linux (3.10.67)定義操作系統的說明信
root (hd0,0) root (hd0,0)定義grub識別的根
kernel /bzInage ro root=/dev/sda2 kernel定義內核文件的路徑和啟動參數,ro表示只讀,指定根文件系統所在的分區
kernel+busybox基礎概念
下載busybox源碼包及編譯依賴的包
Busybox功能選擇
Busybox Settings Busybox設定
Build Options 制作編譯構建選項
Build BusyBox as a static binary (no shared libs) 將BusyBox構建為靜態二進制文件(無共享庫,不使用共享庫
Installation Options (ake install“ behavior) 安裝時的選項(執行“安裝”行為)
What kind of applet links to install (as soft-links) 要安裝哪種小程序鏈接(作為軟鏈接)這是默認項,各種應用程序都表現為符號鏈接就是這個定義的,把BusyBox符號鏈接成哪個命令的名字,他就能模擬哪個命令的工作行為
(./_install) BusyBox installation prefix (HEW) 安裝在哪個目錄下,./表示安裝在編譯的當前目錄下
as soft-links 作為軟鏈接
as hard-links 作為硬鏈接
Busybox編譯
完善系統(添加軟件應用)
刪除這些之前創建的目錄
復制Busybox創建的鏈接文件
如果mount命令無法使用,手動復制mount命令
重命名Busybox鏈接的mount
復制mount命令
cp -a 保留原文件屬性的前提下復制文件
刪除linuxrc文件,這個文件是提供init的,Busybox提供init文件
完善系統(修改grub啟動項)
修改grub啟動項
完善系統(創建目錄)
創建目錄
完善系統(創建inittab)
創建inittab
::sysinit:/etc/rc. d/rc.sysinit
console::respawn:-/bin/sh
tty1::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
這是init文件冒號隔開的四個字段,第一個字段id,用來唯一標識這個行為,第二個字段表示運行級別,第三個字段表示要執行的行為,第四個字段是一個應用程序
tty1 虛擬終端,askfirst表示默認不打開虛擬終端,需要啟動終端敲回車就可以了,如果需要運行/bin/sh
sysinit這是一個系統初始化系統,去讀取/etc/rc. d/rc. sysinit
ctrlaltdel 如果用戶同時按下ctrl+alt+del這個組合鍵,直接執行/sbin/reboot重啟系統
shutdown 如果用戶執行shutdown操作,就執行/bin/umount -a -r先去卸載所有文件系統
respawn:當process終止后馬上啟動一個新的,/sbin/getty這是一個串行終端,9600工作速率每秒鍾可以傳遞的字節數,指明啟動在tty1上
完善系統(創建系統初始化腳本)
insnod /lib/modules/e1000.ko
設置啟動加載模塊
ifconfig etho 172. 16. 100. 20 up ifconfig lo 127.0. 0.1 up
設置ip地址,啟動網卡
[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
判斷有沒有這個文件,如果有執行這個文件
[ -z '$HOSTNAME' -o '$HOSTNAME' == '(none)'] && HOSTNAME='localhost'
如果這個$HOSTNAME變量值為空,-o或者$HOSTNAME等於(none),如果有的話,這兩項符合條件 &&執行把他的主機名定義為
hostname $HOSTNAME
hostname命令設置主機名$HOSTNAME
完善系統(設置主機名)
完善系統(設置管理員)
復制當前主機系統的root密碼
如果這個sha512密碼解析不了換成md5的
替換掉
覆蓋到相對路徑下的shadow文件中,並修改權限
完善系統(創建fstab文件)
完善系統(添加ssh)
修改issus,系統啟動打印信息
下載dropbear,編譯./config默認安裝在/usr/local目錄下
還可以選擇選項,在編譯
直接make編譯安裝
復制程序目錄
創建遠程pts文件,並掛載一個偽文件系統
mode=620表示訪問這個文件的權限
創建密鑰文件
看一下名字是否對
錯了就改一下
創建安全shells
創建解析文件
passwd: files files表示etc/passwd,后面一樣
hosts: files dns 表示先找/etc/hosts,后找dns
cp -d -d:若源文件為連接文件杜屬性,則復制連接文件屬性而非文件本身
啟動這個內核
選在這個磁盤作為啟動盤,啟動mini linux
密碼也可以使用
所有的文件系統都被掛載了,有三個虛擬終端也是可以使用的
網卡也是可執行的
*編譯進內核的
M編譯為模塊的,使用insmod命令需要手動裝載一下模塊
啟動這個內核(修改提示符)
exit重新登陸
啟動這個內核(啟動ssh)
添加變量
exit重新登陸
啟動dropbear
dropbear -F -E 在前台啟動dropbear
查看監聽的端口
pts沒有掛載成功,手動掛載一下,可能之前的/dev/pts文件沒有創建
遠程登陸成功,但是命令沒找到
定義全局配置文件
成功