自制linux系統
分區並創建文件系統
- 可以用u盤或者硬盤來安裝製作一個精簡版linux
- 將要安裝linux的u盤或設備分區
fdisk /dev/sdb
分兩個必要的分區
/dev/sdb1對應/boot /dev/sdb2對應根 /
mkfs.ext4 /dev/sdb1
掛載boot
- mkdir /mnt/boot 子目錄必須爲boot
- mount /dev/sdb1 /mnt/boot
安裝grub
grub-install --root-directory=/mnt /dev/sdb
恢復內核和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
- 裝內核文件時可以用rpm 安裝要指定root在哪
rpm -ivh /mnt/cd1/Packages/kernel-2.6.32-696.el6.x86_64.rpm --root=/mnt
- 這樣裝不只是裝庫文件和initramfs文件了,還會把/lib/modules驅動模塊文件裝上所所以我們直接複製主機上的
建立grub.conf
vim /mnt/boot/grub.conf
title wanglinux
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash //因爲沒有init進程,所以我們指定bash進程爲init
initrd /initramfs-2.6.32-642.el6.x86_64.img
- chroot /mnt/sysroot 切根進入剛剛創建的linux系統。
創建一級目錄
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}
複製bash和相關庫文件
- 使用腳本文件,用此腳本將命令複製指定目錄
#!/bin/bash
cpTopath=/app
findcmd(){
filePathe=`which $1`
fileDir=$cpTopath`dirname $filePath`
if [ ! -d "$fileDir" ];then
mkdir -p $fileDir
cp -a $filePath $fileDir
else
cp -a $filePath $fileDir
fi
}
findlib() {
libPath=`which $1`
libDir=$cpToPath/lib64
if [ ! -d "$libDir" ] ; then
mkdir -p $libDir
fi
for i in `ldd $libPath |grep -Eo "/lib64/.*\.so.[0-9]\b"`;do
cp -a $i $libDir
cp -a `ls -l $i | sed -nr 's#.* -> (.*)$#/lib64/\1#p'` $libDir &>/dev/null
done
}
testCmd() {
type $1 $>/dev/null
if [ "$?" -eq 0 ]; then
cmdType=`type $1`
if [[ "$cmdType" =~ ^.*builtin$ ]];then
echo "$cmdType,No need to copy!"
continue
fi
else
echo -e "\033[31;5m\tInput error!\033[0m" && echo_prompt
continue
fi
}
echo_prompt() {
echo -e "\t====================================================="
echo
echo -e "\t\033[31m(1)input need to copy command.(like:ls,ip)"
echo -e "\t(2)if your need to quit ,input:quit \033[0m"
echo
echo -e "\t======================================================"
}
echo_prompt
while true ;do
read -p "please input command :" cmd
if [ "$cmd" == quit ] ;then
break
else
testCmd $cmd
findcmd $cmd
findlib $cmd
fi
done
複製相關命令及相關庫文件
- 如:ifconfig,insmod,ping,mount,ls,cat等
內核編譯
- 單內核體系設計、但充分借鑑了微內核設計體系的優點,爲內核引入模塊化機制
- 一般不推薦編譯安裝,除非有特種需求,因爲編譯安裝無法知道內核是否穩定
- 內核組成部分:
- kernel: 內核核心,一般爲bzImage,通常在/boot目錄下,名稱爲vmlinuz-VERSION-RELEASE
- kernel object: 內核對象,一般放置於/lib/modules/VERSION-RELEASE/
- [ ]: N 不要此功能
- [M]: M 表示生成/lib/moudules/版本號/這個目錄裏
- [*]: Y 表示生成vmlinuz-version-release這個文件裏
- 輔助文件:ramdisk
- initrd
- initramfs
內核版本
uname命令:
uname - print system information
uname [OPTION]…
-n: 顯示主機名稱
-r: 顯示VERSION-RELEASE
-a:顯示所有信息
內核模塊命令
lsmod命令:
顯示由核心已經裝載的內核模塊
顯示的內容來自於: /proc/modules文件
- 模塊是有依賴性的,可以被多個模塊使用
modinfo命令:
顯示模塊的詳細描述信息
modinfo [ -k kernel ] [ modulename|filename… ]
-n: 只顯示模塊文件路徑
-p: 顯示模塊參數
-a: author
-d: description
-l: license
lsmod |grep xfs;modinfo xfs
內核模塊管理
modprobe命令: 裝載或卸載內核模塊 rmmod 模塊名
modprobe [ -C config-file ] [ modulename ] [ moduleparame-ters… ]
- 配置文件:/etc/modprobe.conf,/etc/modprobe.d/*.conf
- modprobe [ -r ] modulename…
depmod命令
內核模塊依賴關係文件及系統信息映射文件的生成工具裝載或卸載內核模塊
insmod命令:指定模塊文件,不自動解決依賴模塊,這個命令要寫模塊路徑
insmod [ filename ] [ module options… ]
insmodmodinfo –n exportfs
//可以用modinfo -n 模塊,調出模塊路徑
lnsmodmodinfo –n xfs
rmmod命令:卸載模塊
rmmod [ modulename ]
rmmod xfs
rmmod exportfs
編譯內核
- 前提
- 準備好開發環境
- 獲取目標主機上硬件設備的相關信息
- 獲取目標主機系統功能的相關信息
- 例如:需要啓用相應的文件系統
- 獲取內核源代碼包
- www.kernel.org
開發環境準備
- 包組(CentOS 6)
Server Platform Development
Development Tools
- 目標主機硬件設備相關信息
CPU:
cat /proc/cpuinfo
x86info -a /默認是沒有安裝的,安裝包是x86info
lscpu
硬件設備
- lspci
- -v 顯示詳細內容
- -vv 顯示更詳細內容
- lsusb
- -v
- -vv
- lsblk 塊設備
瞭解全部硬件設備信息
hal-device:在CentOS6中可以看
- ntfs分區在linux系統中無法識別,也無法掛載,當然可以安裝NTFS驅動模塊就可以支持
- 在boot分區中這個文件存放那個些模塊在內核中哪些在/lib/modules
- 這裏y集成在內核核心裏,就是boot下vmlinuz中
- m是以模塊方式來存在的
- 還有一種no set 表示不啓用此功能
內核編譯安裝系統
- 安裝開發包組
- 下載源碼文件並解包
[root@centos7 app]# tar xvf linux-4.14.12.tar.xz
[root@centos7 app]# du -sh linux-4.14.12/
882M linux-4.14.12/
- 因爲這裏功能模塊太多,我們要實現讓linux支持ntfs文件系統,所有把/boot/config-3.10.0.697.el7.x86_64 這個文件複製到剛剛解壓縮的linux目錄中,並命名爲.config把這個當模板,我們在這之上加上ntfs,這個文件是編譯時選擇啓用或禁用那些功能的模板
- .config:準備文本配置文件
- make menuconfig:配置內核選項
- make [-j #]
- make modules_install:安裝模塊
- make install :安裝內核相關文件
- 安裝bzImage爲/boot/vmlinuz-VERSION-RELEASE
- 生成initramfs文件
- 編輯grub的配置文件
編譯安裝內核示例
- tar xf linux-3.10.67.tar.xz -C /usr/src
- cd /usr/src
- ln -sv linux-3.10.67 linux
- cd /usr/src/linux
- cp /boot/config-$(uname -r) ./.config
- make help
- make menuconfig
- make -j 2
- make modules_install
- make install
- reboot
編譯內核
- 配置內核選項
- 支持“更新”模式進行配置:make help
- make config:基於命令行以遍歷的方式去配置內核中可配置的每個選項
- make menuconfig:基於curses的文本窗口界面
- make gconfig:基於GTK (GNOME)環境窗口界面
- make xconfig:基於QT(KDE)環境的窗口界面支持“全新配置”模式進行配置
- make defconfig:基於內核爲目標平臺提供的“默認”配置進行配置
- make allyesconfig: 所有選項均回答爲“yes“
- make allnoconfig: 所有選項均回答爲”no“
- 編譯
- 全編譯:make [-j #]
- 編譯內核的一部分功能
- 只編譯某子目錄中的相關代碼
bash
cd /usr/src/linux //就是進入解壓縮的目錄中
make dir/
- 只編譯一個特定的模塊
bash
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/目錄下不需要的內核庫文件
- 刪除/usr/src/linux/目錄下不需要的內核源碼
- 刪除/boot目錄下啓動的內核和內核映像文件
- 更改grub的配置文件,刪除不需要的內核啓動列表
- 刪除centos7時是grub2目錄,並且grub.conf改爲grub.cfg文件要刪除
- 相當於grub.conf中從title 到initrd的內容
- 如果grub2/grub.cfg文件刪除了,可以用grub2-make -o grub.cfg 生成此文件
編譯內核操作
- 選擇下載linux,kernel包,在選擇內核包時最最好不要相差2個大版本
- 下載源碼文件並解包
[root@centos7 app]# tar xvf linux-4.14.12.tar.xz
[root@centos7 app]# du -sh linux-4.14.12/
882M linux-4.14.12/
- 準備.config文件,這個文件定義了那些功能啓用或禁用,可以參考現有的linux系統中/boot/config-3.10.0-693.el7.x86_64 這個文件
- 由於功能很多,所有直接用現有的config-3.10.0-693.el7.x86_64文件,並且改名爲.config
[root@centos7 app]# cp /boot/config-3.10.0-693.el7.x86_64 /app/linux-4.14.12/.config
- 以菜單的方式來定製功能,用make menuconfig,要進入解壓包裏
- 但是可能會包這樣的錯誤缺少一些包組,我們安裝
- 安裝對應的包組,先用yum grouplist 查看一下
- 安裝包組
[root@centos7 linux-4.14.12]# yum groupinstall Development\ Tools
- 我們在次進行打開菜單發現還是缺少包,根據提示安裝對應的包,這個包是一個字符界面的窗口庫
yum install -y ncurses-devel
- 這樣就不缺少包了
- 這是菜單界面,後面有—> 這種的就是由子菜單可以進去,先進入總的設置,按+或-是上下功能鍵
- 這個就是我們用uname -r 命令看到的最後幾位數字的設置
- 現在我們也添加一個自己的標識,按照對應的格式來寫
- 其它的設置不想改了,可以按exit返回上一級菜單
- 在繼續設置其它的,因爲我們想要linux支持ntfs格式的找文件系統這一個選項
- 找到這一個選項,進去
- 按空格鍵可以選擇是否啓用或禁用,以及生成模塊文件,這裏選擇啓用成模塊
- 啓用ntfs時會出來兩個選項,這裏我們一併也啓用,支持ntfs寫,這樣就完成了,退出保存
- 剛剛菜單操作就是更改.config文件,相當於編譯安裝成中.configrue這一步
-
- 編譯
- -j是指定用幾個核心編譯,當然是根據電腦自身配置,內核越多編譯越快
- 因爲編譯時間較長我們可以設置編譯完後打出響聲來提示我們,這樣我們就可以幹其它事情
[root@centos7 linux-4.14.12]# make -j 4 ; for i in {1..10};do sleep 0.3;echo -e "\a" ;done
- 這裏還缺少一些庫文件,我們直接安裝就好,這裏只有裝其中一個就行
linux 內核編譯時出現scripts/sign-file.c:23:30: fatal error: openssl/opensslv.h錯誤的解決辦法yum install openssl-devel
編譯安裝完後執行make modules_install 安裝模塊
- 安裝前
[root@centos7 linux-4.14.12]# ls /lib/modules
3.10.0-693.el7.x86_64
- 安裝後
[root@centos7 linux-4.14.12]# make modules_install
[root@centos7 linux-4.14.12]# ls /lib/modules
3.10.0-693.el7.x86_64 4.14.12-1.0-wawa
make install :安裝內核相關文件
- 安裝bzImage爲/boot/vmlinuz-VERSION-RELEASE
- 生成initramfs文件
- 編輯grub的配置文件
- 查看一下grub2目錄中grub2.cfg文件
- 完成後重啓機器然後用新內核啓動
[root@1234 ~]# uname -r
4.14.12-1.0-wawa
測試
- 將u盤插進系統看是否識別
- 但是我們發生是隻讀模式,重新掛載一下變成讀寫的
[root@1234 ~]# mount -o rw,remount /run/media/root/老毛桃u盤/
mount: cannot remount /dev/sdb1 read-write, is write-protected
- 發現無法變成只讀模式,如果想寫入,要安裝ntfs-3g 這個包,視頻epel源的