日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux下编译build的命令,【linux基础】20、内核的编译

發(fā)布時間:2024/4/18 linux 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux下编译build的命令,【linux基础】20、内核的编译 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、一般src.rpm包的安裝

有些軟件包是以.src.rpm結(jié)尾的,這類軟件包是包含了源代碼的rpm包,在安裝時需要進行編譯。

src.rpm包=源代碼 + specs文件

#specs文件是將源碼制作成二進制格式的步驟文件

這類軟件包有兩種安裝方法:

方法一:

1)創(chuàng)建mockbuild普通用戶

2)切換至mockbuild用戶,而后安裝src.rpm包?? #會在mockbuild家目錄下創(chuàng)建一個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 段(解開源碼包并打補丁,即只做準(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 段(解開源碼包并打補丁,即只做準(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)建一個鏈接,方便使用

"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)核編譯時啟用哪些功能(特性或模塊),在系統(tǒng)中/boot/目錄下有centos編譯內(nèi)核時使用的內(nèi)核配置文件,我們可以使用這個模版來配置我們編譯內(nèi)核時的配置文件

配置文件中:

y:表示編譯進核心

m:編譯成模塊

no set:不編譯

make的選項(生成配置文件):

make config ? ? ? ? ?#一項一項確定是否編譯該特性

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)前會話的界面足夠大

在使用make menuconfig這個命令后,會出現(xiàn)如下的字符界面,我們就可以在這個界面上對內(nèi)核進行配置。

查看硬件信息(根據(jù)硬件信息選擇驅(qū)動):

lspci#pci設(shè)備

hal-device#查看pci設(shè)備詳細信息

lscpu

lsusb

lsblk#塊設(shè)備

lshal? ? ? ??#相當(dāng)于hal-device

dmidecode#查看BIOS中信息

注意:使用make menuconfig設(shè)置(如果你不是很熟)生成的配置文件,在內(nèi)核編譯時可能會出錯,建議使用系統(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#默認使用一個線程編譯

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、檢查、測試

檢查grub.conf中是否已經(jīng)有新內(nèi)核配置項

重啟系統(tǒng)以嘗試使用新內(nèi)核

注意:

1)screen命令的使用

screen可以在一個物理窗口上啟動多個虛擬的小窗口

screen:打開一個新的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????#編譯后會生成很多.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指定源碼文件目錄,很少用這種方式

三、如何實現(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.只編譯某一個模塊

make path/to/dir/module_name.ko例如:make drivers/net/e1000/e1000.ko

4.將編譯后的結(jié)果放置于別的目錄中

make O=/path/to/somewhere#大寫的字母O

交叉編譯

編譯后的文件不是在本機使用,而是在別的機器上使用

make ARCH=架構(gòu)

以arm為例:

make ARCH=arm 默認編譯文件

四、內(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è)置主機名

net.ipv4.ip_forward ? ? ? ?是否打開網(wǎng)絡(luò)間轉(zhuǎn)發(fā),默認0,不打開

net.ipv4.icmp_echo_ignore_all是否關(guān)閉ICMP包回應(yīng)功能,默認0,回應(yīng)

vm.drop_caches是否清空buffers,cached,默認0,不清空,1表示都清空

五、硬件設(shè)備

硬件設(shè)備文件是如何產(chǎn)生的?

硬件設(shè)備:設(shè)備文件

在內(nèi)核2.4版本之前,設(shè)備文件都是在裝系統(tǒng)時事先生成的總共有數(shù)萬個(2W+),硬件探測是在內(nèi)核展開,裝載完成后就開始的,此時還沒有根文件系統(tǒng)更沒有/dev目錄,

大大浪費

udev:是用戶空間程序

kenrel硬件探測過程在根文件系統(tǒng)掛載前就已經(jīng)結(jié)束,啟動udev daemon程序,要求內(nèi)核重新探測硬件信息,并輸出/sys目錄,由此udevadm工具就可以根據(jù)/sys目錄中硬件信息給每個硬件創(chuàng)建設(shè)備文件了

udev rules:udev規(guī)則文件,用于定義udev如何創(chuàng)建設(shè)備文件的,/etc/udev/rules.d/

kernel+initramfs(根文件系統(tǒng)所在設(shè)備的設(shè)備驅(qū)動模塊)-->devtmps(用于在內(nèi)核初始化時為基本設(shè)備創(chuàng)建設(shè)備文件的臨時文件系統(tǒng))

如何手動創(chuàng)建設(shè)備文件:

mknod

mknod [option]... NAME YTPE [MAJOR MINOR]

MAJOR:主設(shè)備號,表示設(shè)備類型

MINOR:同一設(shè)備的不同文件

選項:

-m MODE:指定權(quán)限

例子:

mknod -m 660 /dev/testdev b 100 0

總結(jié)

以上是生活随笔為你收集整理的Linux下编译build的命令,【linux基础】20、内核的编译的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。