自制Linux系統
1分區并創建文件系統
fdisk/dev/sdb
分兩個必要的分區
/dev/sdb1對應/boot /dev/sdb2對應根/
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
2掛載boot
mkdir/mnt/boot
mount /dev/sdb1 /mnt/boot
?
3安裝grub
grub-install –root-directory=/mnt/ dev/sdb
4、建立grub.conf:
vim /mnt/boot/grub/grub.conf
title wanglinux
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash
initrd /initramfs-2.6.32-642.el6.x86_64.img
5、恢復內核和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
6、創建一級目錄
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}
7、vim /mnt/sysroot/etc/fstab
/dev/sda1 /boot ext4 defaults 1 1
/dev/sda2 / ext4 defaults 1 2
8、復制bash和相關庫文件
9、復制相關命令及相關庫文件
如:ls,cat,vim,reboot,hostname等
/boot/config-2.6.32-504.el6.x86_64 這個文件記錄了這個系統所有的內置模塊,以及有沒有啟用信息。后面是y的就是打進vmlinuz-2.6.32-504.el6.x86_64這個內核文件里邊了,是M的就是以模塊形式放在/lib/modules.
需要在網上下載內核文件linux-3.18.41.tar.xz解壓縮然后創建個軟連接linux
編譯安裝內核之前,需要安裝編譯工具
yum grouplist
找到 Development Tools安裝
“`
(1)cp /boot/config-2.6.32-504.el6.x86_64 /usr/src/linux/.config
cd /usr/src/linux
make menuconfig
(配置內核選項)(因為拷貝過來的是模板,要挑選需要的模塊)
會報錯,需要安裝別的包
yum -y install "curses*"
make -j 內核數
“`
內核設計體系:單內核,微內核
linux:單內核,但充分借鑒微內核體系設計的優點:為內核引入了模塊化機制
內核的組成部分:
kernel:內核核心,一般為bzimage,通常位為/boot目錄,一般我們看到這個文件,就說明內核文件沒用了,在系統啟動時已經被加載過,開機后不在被使用,放在目錄里,方便我們后期管理.
kernel object:內核對象,即內核模塊,一般放置于/lib/modules/VERSION-release/.
A.內核模塊與內核核心版本一定要嚴格匹配;
B.內核模塊化的主要動因:為了能夠支持第三方廠商的硬件設備及其驅動程序,可以引進內核模塊化的方式設計,這樣每一個廠商都可以把自己的設備驅動寫成內核模塊,當用到這個設備時,單獨編譯這個內核模塊.針對于當前內核的源碼樹,編譯這個模塊,并裝載到內核上就可以使用了;
C.在對內核的編譯中,定義某個內核的功能,分為三種選擇:
[ ]:N 編譯時不啟動功能,留空
[M]:Module 編譯成內核模塊,用到時臨時裝載,只占用磁盤空間,不占用內核內存空間
[*]:Y 直接編譯進內核核心,只要內核在,功能就在,不用裝載.
D.內核:動態裝載和卸載
ramdisk:輔助性文件,并非必須,這取決于內核是否能直接驅動rootfs所在的設備;能直接驅動,ramdisk就不需要;不能驅動,就需要借助ramdisk封裝驅動,不僅包括設備的驅動程序,也可以包括設備上的格式化所提供的邏輯設備,比如說lVM,文件系統;如果都編譯成模塊的話,都可以加載到內核中.
借助于ramdisk,能加載的驅動,包括為:
目標設備驅動,例如:ISCSI設備的驅動
邏輯設備驅動,例如:LVM設備的驅動
文件系統,例如:XFS文件系統
ramdksk:是一個簡裝版的根文件系統;不能作為一個操作系統使用,因為運行在內存中,缺少長久性,所以操作系統必須在持久性存儲設備上,這也是做根切換的原因.提供設備驅動,僅僅是為了能夠讓內核找到真正的根文件系統.
內核信息查看:
uname命令:
-a, –all 全部顯示
-s, –kernel-name 內核名稱
-n, –nodename 節點名稱(主機名)
-r, –kernel-release 內核發行號
-v, –kernel-version 內核編譯版本號
-m, –machine 硬件架構類型
-p, –processor cpu類型
-i, –hardware-platform 硬件平臺名稱
-o, –operating-system 操作系統類型
模塊信息查看:
lsmod命令:顯示當前內核已加載的模塊名,模塊大小,被引用次數,被什么模塊所引用
抽取/proc/modules的信息,lsmod抽取內核自己的輸出接口的信息,以人性化的方式輸出.
modinfo命令:顯示指定模塊文件的詳細信息
無論模塊是否被裝載,都可以用modinfo查看,modinfo就是通過獲取/lib/modules目錄下與當前內核版本同名的目錄下的模塊原數據文件,加以顯示的.模塊原數據文件類似于rpm包的元數據數據庫,可以支持查詢操作,需要專門的命令.每個文件都是經過hash格式編碼,文件里面的都是鍵值對,從中查找數據的性能是O1(恒定)的,衡量一個算法的標準,O1,On,Olocaln..
選項:
-F:只顯示指定字段的信息
-a:
-n:顯示文件路徑,相當于 -F filename,
-k:默認顯示當前內核信息,要想顯示其他內核的相關模塊,使用-k選項指明kernel,和模塊名
模塊信息管理:
modprobe命令:模塊動態裝載和卸載
modpobe [-r] mod_name
模塊動態裝卸載也可以基于文件實現,-c指明配置文件,默認是/etc/modprobe.d/*.conf文件
選項:
裝載模塊: modprobe 模塊名 被依賴的模塊也會被裝載
卸載模塊: modprobe- r 模塊名 正在使用的和默認裝載的模塊千萬不要卸載,會影響系統使用
depmod命令:生成模塊依賴關系
內核模塊依賴關系文件及系統信息映射文件的生成工具
大多數命令選項,不使用;只有在新增模塊時,這個模塊依賴于其他模塊,不得不手動改寫模塊文件.自己手動執行drpmod命令
在對另外一個的內核文件生成依賴關系,并且保存文件也不放在/boot目錄下,才有必要使用-b,-F,-E 選項指明內核文件,和內核模塊
模塊裝載和卸載的另一組命令:
insmod命令:
insmod [filename][module options…]
filename:模塊文件的文件路徑,配合modinfo -n 查看模塊文件路徑
rmmod命令:
rmmod [module_name(模塊名)]
ramdisk文件的管理:
不是直接生成的,而是由命令管理的
(1)mkinitrd命令: centos5 但6,7也有連接
為當前使用中的內核重新制作ramdisk文件
文件名:
centos5:initrd-2.6.32-504.30.3.el6.x86_64kdump.img
centos6,7:initramfs-2.6.32-504.30.3.el6.x86_64.img
命令格式:
mkinitrd [OPTION…] [<initrd-image>] <kernel-version>
–with=<module>:除了默認的模塊之外需要裝載至initramfs中的模塊,重新制作ramdisk的重要原因,添加新的模塊.
–preload=<module>:initramfs所提供的模塊需要預先裝載的模塊;
示例: mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
(2)dracut命令 centos 6,7
較為底層的生成ramdisk文件的工具
#dracut [OPTION…] [<initrd-image>] <kernel-version>
示例:dracut /boot/initramfs-$(uname -r).img $(uname -r)
內核信息輸出的偽文件系統:
/proc/:內核狀態和統計信息的輸出接口.可以通過各種文件系統直接管理.同時,還提供一個配置接口,/proc/sys;
參數:
只讀:信息輸出;/proc下以數字命名的目錄,只是用來輸出某進程的相關信息./例如:/proc/#/*
可寫:可接受用戶指定一個"新值"來實現對內核某功能或特性的配置;寫權限只有管理員擁有./proc/sys/
專門用來修改用于支持修改其值的參數,從而能夠讓我們實現配置內核參數的
偽文件系統的參數與/proc/sys/目錄下的每個文件有映射關系,都相對與/proc/sys/目錄而言,每個參數對應著我們所看到的/proc/sys/目錄下的每個文件, 文件路徑中的斜杠分隔符替換成點號,就成為參數名;
示例:net/ipv4/ip_forward相當于net.ipv4.ip_forward
修改方式:
(1)sysclt命令
專用于查看或設定/proc/sys/目錄下參數的值
命令使用格式:
sysclt [options] [variable[=value]]
查看:
#sysclt -a 查看全部信息
#sysclt variable 指定參數名稱 variable為文件目錄的簡裝路徑,以點分隔
修改其值:
#sysclt -w variable=value
(2)文件系統命令(cat,echo)
偽文件系統,不能使用文本編輯器去直接編輯,而應該使用重定向的方式覆蓋原值
查看:
#cat /proc/sys/PATH/TO/SOME_KERNEL_FILE
設定:使用覆蓋重定向修改內核參數
echo "node1" > /proc/sys/kernel/hostname
注意:上述兩種方式的設定僅當前內核有效,內核或系統重啟,配置失效
(3)配置文件
有可能是兩種文件,
centos 5,6: /etc/sysctl.conf
centos7: /etc/sysctl.d/*.conf 分隔成多段配置
修改配置文件,不會立即生效,下次啟動系統
立即有效:重讀此配置文件,通知讓sysctl命令重讀此文件,并根據此文件的設定,來修改內核參數相關值即可
sysctl -p [/PATH/TO/CONFLG_FILE] 從指定文件中加載內核參數的相關設定,默認讀取/etc/sysctl.conf,可指定其他文件,但最好在/etc/sysctl.d/目錄下.
內核參數:
1.net.ipv4.ip_forward,核心路由轉發功能
2./proc/sys/vm/drop_caches:回收內存
0:
1:
2:
3./proc/sys/kernel.hostname:主機名
4./proc/sys/net/ipv4/icmp_exho_ignore_all
忽略別人ping自己,自己可以ping 別人
/sys/目錄:
掛載的是sysfs:輸出內核識別出的各硬件設備的相關屬性信息,也有內核對硬件特性的可設定參數;對此些參數的修改,即可定制硬件設備工作特性;
[root@Wencx ~]# ls /sys
block bus class dev devices firmware fs hypervisor kernel module power
塊設備,總線,
不同目錄,通過不同視角對各設備劃分的類別;根據總線劃分,根據類別劃分等等,另外也會根據某些特殊內容做些不同類的輸出,或者說很多文件,很多設備所輸出的位置不止一個目錄,但是在多個目錄下指向的同一個文件或設備.對一個linux主機來講,每一個硬件設備被訪問就要有設備文件,設備文件在/dev/目錄下,內核怎么知道不同用戶會有哪些硬件設備呢?事先不得而知.那應該準備怎樣的設備文件來讓內核識別呢?不知道的情況下,只能全部列出所有的設備文件,linux內核2.4以后在/dev/目錄下有兩萬多個設備文件,無法預測用戶用到哪些設備,所以把用戶但凡用到的全創建出來,那么有兩個問題?一.用戶使用的很少,大多數文件浪費,雖不占用磁盤空間,但文件數量過大,二,沒辦法通過設備文件判斷某個設備的存在./sys/目錄在linux2.6內核引入后,使得我們能夠按需創建設備文件,意思是說,每一次當內核系統完成自身初始化的時候,它會自動探測識別出每一個硬件設備信息,而后在把設備信息在系統啟動完后,在內核初始化完后,在根文件系統掛載后,在重新探測輸出到/sys/目錄下,有多少硬件都在/sys/目錄下顯示.但是有些設備沒有設備文件,就會臨時讀取/sys/目錄下的設備信息,給它按需創建設備文件.對/dev/目錄來說至關重要.
udev:通過讀取/sys/目錄下的硬件設備信息按需為各硬件設備創建設備文件.是用戶空間程序,不能直接跟硬件打交道,/sys/目錄的存在才讓udev讀取硬件設備信息.專用命令:devadmin,hotplug;
當根文件掛載完成后,系統初始化已經結束,系統就不會輸出硬件信息./sys/目錄的存在就會強制內核重新輸出一遍內核信息,把內核中的各硬設備信息輸出至/sys/目錄下,而這時候udev就會通過讀取/sys/目錄下的硬件設備信息按需為各硬件設備創建設備文件.
/dev/目錄下許多文件是Udev創建的,還有一些是內核創建的,比如說內核還要識別/sda硬盤,如果不能識別sda硬盤,標識為一個設備的話,怎么掛載設備?為了讓設備訪問正常,內核自動通過devtmpfs(設備臨時文件系統),為每個內核必須用到的設備創建一個設備文件,這些設備文件可以在根文件系統掛載以后,從內核直接移到/dev/目錄下,但不是完全移動,剩下的拷到udev,
udev為設備創建設備文件時,會讀取其事先定義好的規則文件,一般在/etc/udev/rules.d目錄下,以及在/usr/lib/rules.d/目錄下;
/etc/udev/rules.d/70-persistent-net.rules文件,更改網卡配置文件的定義,并更改
原創文章,作者:forest,如若轉載,請注明出處:http://www.www58058.com/46166
前面寫的比較簡單,后面對命令的總結很完整。實驗過程中復制bash和庫文件的腳本怎么沒有附加上來?我們應該盡量把整個實驗流程完整的寫下來哦。