Linux下编译build的命令,【linux基础】20、内核的编译
一、一般src.rpm包的安裝
有些軟件包是以.src.rpm結(jié)尾的,這類軟件包是包含了源代碼的rpm包,在安裝時(shí)需要進(jìn)行編譯。
src.rpm包=源代碼 + specs文件
#specs文件是將源碼制作成二進(jìn)制格式的步驟文件
這類軟件包有兩種安裝方法:
方法一:
1)創(chuàng)建mockbuild普通用戶
2)切換至mockbuild用戶,而后安裝src.rpm包?? #會(huì)在mockbuild家目錄下創(chuàng)建一個(gè)rpmbuild目錄
rpm -ivh NAME-VERSION.SRC.RPM[root@Note3?~]#?ls?rpmbuild/
SOURCES??SPECS
[root@Note3?~]#?cd?rpmbuild/
[root@Note3?rpmbuild]#?ls?SOURCES/
404.html??????nginx-1.0.15.tar.gz??????nginx-logo.png???ssl.conf
50x.html??????nginx-auto-cc-gcc.patch??nginx.logrotate??virtual.conf
default.conf??nginx.conf???????????????nginx.sysconfig
index.html????nginx.init???????????????poweredby.png
[root@Note3?rpmbuild]#?ls?SPECS/
nginx.spec
3)rpmbuild -bb|-ba ~/rpmbuild/SPECS/PACKAGE_NAME.spec
-ba ?編譯后做成.rpm和src.rpm(又還原成剛下載的NAME-VERSION.SRC.RPM包格式)-bb ?編譯后做成.rpm
-bp ?只執(zhí)行spec的%pre 段(解開源碼包并打補(bǔ)丁,即只做準(zhǔn)備)[root@Note3?rpmbuild]#?ls
BUILD??BUILDROOT??RPMS??SOURCES??SPECS??SRPMS
SOURCES:存放了該包的源碼包(壓縮格式)[root@Note3?rpmbuild]#?ls?SOURCES/
404.html??????nginx-1.0.15.tar.gz??????nginx-logo.png???ssl.conf
50x.html??????nginx-auto-cc-gcc.patch??nginx.logrotate??virtual.conf
default.conf??nginx.conf???????????????nginx.sysconfig
index.html????nginx.init???????????????poweredby.png
BUILD:源碼包解壓后的目錄[root@Note3?rpmbuild]#?ls?BUILD/nginx-1.0.15
auto?????CHANGES.ru??configure??html?????man?????src
CHANGES??conf????????contrib????LICENSE??README
RPMS:為生成的.rpm包[root@Note3?rpmbuild]#?ls?RPMS/x86_64/
nginx-1.0.15-5.el6.x86_64.rpm??nginx-debuginfo-1.0.15-5.el6.x86_64.rpm
SPECS:存放SPECS文件的目錄[root@Note3?rpmbuild]#?ls?SPECS/
nginx.spec
SRPMS:將源碼包制作成.src.rpm[root@Note3?rpmbuild]#?ls?SRPMS/
nginx-1.0.15-5.el6.src.rpm
4)制作完成的rpm包位于:~/rpmbuild/RPMS
方法二:
1)創(chuàng)建mockbuild普通用戶,別切換至mockbuild ? #不切換也可以,在家目錄下生成rpmbuild目錄
2)rpm -i your-package.src.rpm
3)rpmbuild -bp your-package.specs
-bp??#只執(zhí)行spec的%pre 段(解開源碼包并打補(bǔ)丁,即只做準(zhǔn)備)
4)cd ~/rpmbuild/BUILD/your-package/
5)./configure ? ? ? ?#這一步和編譯普通的源碼軟件一樣,可以加上參數(shù)
6)make
7)make install
二、編譯內(nèi)核
.src.rpm包安裝一下就變成.tar.gz的源碼包了
可能需要的模塊很多,紅帽或者centos提供的內(nèi)核版本更通用(適用的硬件多)
1、獲取并解壓至/usr/src[root@Note3?~]#?ls?/usr/src
debug??kernels
[root@Note3?~]#?tar?xf?linux-3.16.1.tar.xz?-C?/usr/src
[root@Note3?~]#?cd?/usr/src
[root@Note3?src]#?ls
debug??kernels??linux-3.16.1
[root@Note3?src]#?ln?-sv?linux-3.16.1/?linux????#創(chuàng)建一個(gè)鏈接,方便使用
"linux"?->?"linux-3.16.1/"
[root@Note3?src]#?ls
debug??kernels??linux??linux-3.16.1
[root@Note3?src]#?cd?linux
[root@Note3?linux]#?ls
arch?????Documentation??init?????lib??????????README??????????sound
block????drivers????????ipc??????MAINTAINERS??REPORTING-BUGS??tools
COPYING??firmware???????Kbuild???Makefile?????samples?????????usr
CREDITS??fs?????????????Kconfig??mm???????????scripts?????????virt
crypto???include????????kernel???net??????????security
2、配置內(nèi)核特性
配置內(nèi)核編譯時(shí)啟用哪些功能(特性或模塊),在系統(tǒng)中/boot/目錄下有centos編譯內(nèi)核時(shí)使用的內(nèi)核配置文件,我們可以使用這個(gè)模版來(lái)配置我們編譯內(nèi)核時(shí)的配置文件
配置文件中:
y:表示編譯進(jìn)核心
m:編譯成模塊
no set:不編譯
make的選項(xiàng)(生成配置文件):
make config ? ? ? ? ?#一項(xiàng)一項(xiàng)確定是否編譯該特性
make allyesconfig ? ? ?#全ye
make allnoconfig ? ? ?#能選的都no,值編譯必須的
make menuconfig ? ? ? #使用文本窗口選擇
make kconfig ? ? ? ? #在KDE桌面環(huán)境下,并且安裝了qt開發(fā)環(huán)境
make gconfig ? ? ? ? #在gnome桌面環(huán)境下,并且安裝了gtk開發(fā)環(huán)境[root@Note3?linux]#?make?menuconfig???????#必須在當(dāng)前目錄下執(zhí)行,且當(dāng)前會(huì)話的界面足夠大
在使用make menuconfig這個(gè)命令后,會(huì)出現(xiàn)如下的字符界面,我們就可以在這個(gè)界面上對(duì)內(nèi)核進(jìn)行配置。
查看硬件信息(根據(jù)硬件信息選擇驅(qū)動(dòng)):
lspci#pci設(shè)備
hal-device#查看pci設(shè)備詳細(xì)信息
lscpu
lsusb
lsblk#塊設(shè)備
lshal? ? ? ??#相當(dāng)于hal-device
dmidecode#查看BIOS中信息
注意:使用make menuconfig設(shè)置(如果你不是很熟)生成的配置文件,在內(nèi)核編譯時(shí)可能會(huì)出錯(cuò),建議使用系統(tǒng)上的/boot/config 配置文件做模版使用。[root@Note3?linux]#?ls?/boot/config-2.6.32-431.el6.x86_64
/boot/config-2.6.32-431.el6.x86_64
[root@Note3?linux-3.16.1]#?cp?/boot/config-2.6.32-431.el6.x86_64?.config
[root@Note3?linux-3.16.1]#?make?menuconfig????#再使用make?menuconfig修改自己需要的配置
3、編譯內(nèi)核
make#默認(rèn)使用一個(gè)線程編譯
make -j N ?#N為線程數(shù)(linux上顯示的核心數(shù))[root@Note3?linux]#?make?-j?4
4、安裝模塊
make modules_install
5、安裝內(nèi)核
make install[root@Note3?linux]#?ls?/boot???#安裝完成后
config-2.6.32-431.el6.x86_64?????????System.map
efi??????????????????????????????????System.map-2.6.32-431.el6.x86_64
grub?????????????????????????????????System.map-3.16.1
initramfs-2.6.32-431.el6.x86_64.img??vmlinuz
initramfs-3.16.1.img?????????????????vmlinuz-2.6.32-431.el6.x86_64
lost+found???????????????????????????vmlinuz-3.16.1
symvers-2.6.32-431.el6.x86_64.gz
[root@Note3?linux]#?cat?/boot/grub/grub.conf
#?grub.conf?generated?by?anaconda
#
#?Note?that?you?do?not?have?to?rerun?grub?after?making?changes?to?this?file
#?NOTICE:??You?have?a?/boot?partition.??This?means?that
#??????????all?kernel?and?initrd?paths?are?relative?to?/boot/,?eg.
#??????????root?(hd0,0)
#??????????kernel?/vmlinuz-version?ro?root=/dev/sda2
#??????????initrd?/initrd-[generic-]version.img
#boot=/dev/sda
default=1
timeout=5
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title?CentOS?(3.16.1)
root?(hd0,0)
kernel?/vmlinuz-3.16.1?ro?root=UUID=e0c0bc25-62e5-4896-8749-fce761bc3af7?rd_NO_LUKS?rd_NO_LVM?LANG=zh_CN.UTF-8?rd_NO_MD?SYSFONT=latarcyrheb-sun16?crashkernel=auto??KEYBOARDTYPE=pc?KEYTABLE=us?rd_NO_DM?rhgb?quiet
initrd?/initramfs-3.16.1.img
title?CentOS?(2.6.32-431.el6.x86_64)
root?(hd0,0)
kernel?/vmlinuz-2.6.32-431.el6.x86_64?ro?root=UUID=e0c0bc25-62e5-4896-8749-fce761bc3af7?rd_NO_LUKS?rd_NO_LVM?LANG=en_US.UTF-8?rd_NO_MD?SYSFONT=latarcyrheb-sun16?crashkernel=auto??KEYBOARDTYPE=pc?KEYTABLE=us?rd_NO_DM?rhgb?quiet
initrd?/initramfs-2.6.32-431.el6.x86_64.img
6、檢查、測(cè)試
檢查grub.conf中是否已經(jīng)有新內(nèi)核配置項(xiàng)
重啟系統(tǒng)以嘗試使用新內(nèi)核
注意:
1)screen命令的使用
screen可以在一個(gè)物理窗口上啟動(dòng)多個(gè)虛擬的小窗口
screen:打開一個(gè)新的screen
隱藏:Ctrl+a,d
重新打開隱藏的screen:
顯示各screen ID:screen -ls
重新打開:screen -r Screen_ID
2)二次編譯前要先做清理操作
make clean [all]只清理編譯生成的文件,但不刪除配置文件.config
make mrproper刪除編譯生成的文件和.config
make disclean重置源代碼樹[root@Note3?linux]#?ls?init????#編譯后會(huì)生成很多.o文件
built-in.mod.c??????do_mounts_initrd.o??initramfs.o??modules.builtin
built-in.o??????????do_mounts_md.c??????init_task.c??modules.order
calibrate.c?????????do_mounts_md.o??????init_task.o??mounts.mod.c
calibrate.o?????????do_mounts.o?????????Kconfig??????mounts.o
do_mounts.c?????????do_mounts_rd.c??????main.c???????noinitramfs.c
do_mounts.h?????????do_mounts_rd.o??????main.o???????version.c
do_mounts_initrd.c??initramfs.c?????????Makefile?????version.o
[root@Note3?linux]#?make?clean
[root@Note3?linux]#?ls?init/
calibrate.c??do_mounts_initrd.c??initramfs.c??main.c?????????version.c
do_mounts.c??do_mounts_md.c??????init_task.c??Makefile
do_mounts.h??do_mounts_rd.c??????Kconfig??????noinitramfs.c
3)將編譯后生成的文件放置于源碼不同的路徑
mkdir /path/to/somewhere
cd ?/path/to/somewhere
./configure --ksource=/usr/src/linux ??# --ksource指定源碼文件目錄,很少用這種方式
三、如何實(shí)現(xiàn)內(nèi)核的部分編譯
1.只編譯某子目錄下的相關(guān)代碼
cd /usr/src/linux
make 子目錄文件?? ?例如:make drivers/net/
或者:
make SUBDIR=arch/#指定子目錄
2.只編譯部分模塊
make M=path/to/dir/例如:make M=drivers/net/
3.只編譯某一個(gè)模塊
make path/to/dir/module_name.ko例如:make drivers/net/e1000/e1000.ko
4.將編譯后的結(jié)果放置于別的目錄中
make O=/path/to/somewhere#大寫的字母O
交叉編譯
編譯后的文件不是在本機(jī)使用,而是在別的機(jī)器上使用
make ARCH=架構(gòu)
以arm為例:
make ARCH=arm 默認(rèn)編譯文件
四、內(nèi)核參數(shù)的查看與配置
可配置的內(nèi)核參數(shù)都在/proc/sys/目錄下:
kernel,net,vm(虛擬內(nèi)存),fs
配置參數(shù):
echo "String" > /proc/sys/path/to/some_parameter
sysctl -w variable=value[root@Note3?~]#?cd?/proc/sys/
[root@Note3?sys]#?ls
abi??crypto??debug??dev??fs??kernel??net??vm
[root@Note3?sys]#?ls?net/ipv
ipv4/?ipv6/
[root@Note3?sys]#?ls?net/ipv4/icmp_echo_ignore_
icmp_echo_ignore_all?????????icmp_echo_ignore_broadcasts
[root@Note3?sys]#?cat?net/ipv4/icmp_echo_ignore_all
0
[root@Note3?sys]#?echo?1?>?net/ipv4/icmp_echo_ignore_all
[root@Note3?sys]#?cat?net/ipv4/icmp_echo_ignore_all???????#重啟失效
1
[root@Note3?sys]#?sysctl?-w?net.ipv4.icmp_echo_ignore_all=0
net.ipv4.icmp_echo_ignore_all?=?0
[root@Note3?sys]#?cat?net/ipv4/icmp_echo_ignore_all
0
配置文件:/etc/sysctl.conf
讓修改后的結(jié)果生效的方式:sysctl -p
kernel.hostname ? ? ? ? ??設(shè)置主機(jī)名
net.ipv4.ip_forward ? ? ? ?是否打開網(wǎng)絡(luò)間轉(zhuǎn)發(fā),默認(rèn)0,不打開
net.ipv4.icmp_echo_ignore_all是否關(guān)閉ICMP包回應(yīng)功能,默認(rèn)0,回應(yīng)
vm.drop_caches是否清空buffers,cached,默認(rèn)0,不清空,1表示都清空
五、硬件設(shè)備
硬件設(shè)備文件是如何產(chǎn)生的?
硬件設(shè)備:設(shè)備文件
在內(nèi)核2.4版本之前,設(shè)備文件都是在裝系統(tǒng)時(shí)事先生成的總共有數(shù)萬(wàn)個(gè)(2W+),硬件探測(cè)是在內(nèi)核展開,裝載完成后就開始的,此時(shí)還沒有根文件系統(tǒng)更沒有/dev目錄,
大大浪費(fèi)
udev:是用戶空間程序
kenrel硬件探測(cè)過程在根文件系統(tǒng)掛載前就已經(jīng)結(jié)束,啟動(dòng)udev daemon程序,要求內(nèi)核重新探測(cè)硬件信息,并輸出/sys目錄,由此udevadm工具就可以根據(jù)/sys目錄中硬件信息給每個(gè)硬件創(chuàng)建設(shè)備文件了
udev rules:udev規(guī)則文件,用于定義udev如何創(chuàng)建設(shè)備文件的,/etc/udev/rules.d/
kernel+initramfs(根文件系統(tǒng)所在設(shè)備的設(shè)備驅(qū)動(dòng)模塊)-->devtmps(用于在內(nèi)核初始化時(shí)為基本設(shè)備創(chuàng)建設(shè)備文件的臨時(shí)文件系統(tǒng))
如何手動(dòng)創(chuàng)建設(shè)備文件:
mknod
mknod [option]... NAME YTPE [MAJOR MINOR]
MAJOR:主設(shè)備號(hào),表示設(shè)備類型
MINOR:同一設(shè)備的不同文件
選項(xiàng):
-m MODE:指定權(quán)限
例子:
mknod -m 660 /dev/testdev b 100 0
總結(jié)
以上是生活随笔為你收集整理的Linux下编译build的命令,【linux基础】20、内核的编译的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 峰度 函数,Oracle
- 下一篇: linux共享内存变量 tiaojian