linux內核啟動參數
❶ 如何修改 linux 內核配置
由於Linux的內核參數信息都存在內存中,因此可以通過命令直接修改,並且修改後直接生效。但是,當系統重新啟動後,原來設置的參數值就會丟失,而系統每次啟動時都會自動去/etc/sysctl.conf文件中讀取內核參數,因此將內核的參數配置寫入這個文件中,是一個比較好的選擇。
首先打開/etc/sysctl.conf文件,查看如下兩行的設置值,這里是:
kernel.shmall
=
2097152
kernel.shmmax
=
4294967295
如果系統默認的配置比這里給出的值大,就不要修改原有配置。同時在/etc/sysctl.conf文件最後,添加以下內容:
fs.file-max
=
6553600
kernel.shmmni
=
4096
kernel.sem
=
250
32000
100
128
net.ipv4.ip_local_port_range
=
1024
65000
net.core.rmem_default
=
4194304
net.core.rmem_max
=
4194304
net.core.wmem_default
=
262144
net.core.wmem_max
=
262144
這里的「fs.file-max
=
6553600」其實是由「fs.file-max
=
512
*
PROCESSES」得到的,我們指定PROCESSES的值為12800,即為「fs.file-max
=512
*12800」。
sysctl.conf文件修改完畢後,接著執行「sysctl
-p」使設置生效。
[root@localhost
~]#
sysctl
-p
常用的內核參數的含義如下。
kernel.shmmax:表示單個共享內存段的最大值,以位元組為單位,此值一般為物理內存的一半,不過大一點也沒關系,這里設定的為4GB,即「4294967295/1024/1024/1024=4G」。
kernel.shmmni:表示單個共享內存段的最小值,一般為4kB,即4096bit.
kernel.shmall:表示可用共享內存的總量,單位是頁,在32位系統上一頁等於4kB,也就是4096位元組。
fs.file-max:表示文件句柄的最大數量。文件句柄表示在Linux系統中可以打開的文件數量。
ip_local_port_range:表示埠的范圍,為指定的內容。
kernel.sem:表示設置的信號量,這4個參數內容大小固定。
net.core.rmem_default:表示接收套接字緩沖區大小的預設值(以位元組為單位)。
net.core.rmem_max
:表示接收套接字緩沖區大小的最大值(以位元組為單位)
net.core.wmem_default:表示發送套接字緩沖區大小的預設值(以位元組為單位)。
net.core.wmem_max:表示發送套接字緩沖區大小的最大值(以位元組為單位)。
❷ 如何在Linux上通過GRUB添加內核參數
如果你在使用GRUB引導裝載程序,想修改或添加內核參數,你可以編輯GRUB配置文件。下面是針對特定發行版在GRUB的配置文件中添加內核啟動參數的方法。
在Debian或Ubuntu上添加內核啟動參數在基於Debian的系統上,如果你想在系統啟動時添加內核參數,你可以編輯 /etc/default/grub 目錄下的GRUB配置模板。在 GRUB_CMDLINE_LINUX_DEFAULT 變數中以 「name=value」 的格式添加內核參數。
$ sudo -e /etc/default/grub GRUB_CMDLINE_LINUX_DEFAULT="...... name=value"
然後運行下面的命令來生成一個GRUB的配置文件。
$ sudo update-grub 如果無法找到 update-grub 命令,你可以通過下面的命令安裝它。
$ sudo apt-get install grub2-common 在Fedora上添加內核啟動參數在Fedora上,想要在啟動時添加內核參數,你可以編輯 /etc/default/grub目錄下的 GRUB 配置模板。在 GRUB_CMDLINE_LINUX 變數中以 「name=value」 的格式添加內核參數。
$ sudo -e /etc/default/grub GRUB_CMDLINE_LINUX="...... name=value"
然後運行下面的命令生成 GRUB2 配置文件。
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg 在CentOS上添加內核啟動參數在CentOS上,想要在啟動時添加內核參數,你可以直接編輯GRUB配置文件 /boot/grub/grub.conf。在配置文件中,找到描述默認使用的Linux映像的條目。文件中最頂行的字元串 「default=N」會指示哪一個條目是默認的映像。
找到默認的映像條目後,在以 「kernel /vmlinuz-」 開頭的那一段的結尾附加上內核參數。參數的格式為 「name=value」 。
❸ Linux如何在系統運行過程中修改內核參數
RedHat向管理員提供了非常好的方法,使我們可以在系統運行時更改內核參數,而不需要重新引導系統。這是通過/PRoc虛擬文件系統實現的。/proc/sys目錄下存放著大多數的內核參數,並且設計成可以在系統運行的同時進行更改。下面我們以打開內核的 ip轉發功能為例說明在系統運行時修改內核參數的兩種方法。IP轉發是指允許系統對來源和目的地都不是本機的數據包通過網路,RedHat默認屏蔽此功能,在 需要用本機作為路由器、NAT等情況下需要開啟此功能。 方法一:修改/proc下內核參數文件內容 直接修改內核參數ip_forward對應在/proc下的文件/proc/sys/net/ipv4/ip_forward。用下面命令查看ip_forward文件內容: # cat /proc/sys/net/ipv4/ip_forward 該文件默認值0是禁止ip轉發,修改為1即開啟ip轉發功能。修改命令如下: # echo 1 >/proc/sys/net/ipv4/ip_forward 修改過後就馬上生效,即內核已經打開ip轉發功能。但如果系統重啟後則又恢復為默認值0,如果想永久打開需要通過修改/etc/sysctl.conf文件的內容來實現。 方法二.修改/etc/sysctl.conf文件 默認sysctl.conf文件中有一個變數是 net.ipv4.ip_forward = 0 將後面值改為1,然後保存文件。因為每次系統啟動時初始化腳本/etc/rc.d/rc.sysinit會讀取/etc/sysctl.conf文件的內容,所以修改後每次系統啟動時都會開啟ip轉發功能。但只是修改sysctl文件不會馬上生效,如果想使修改馬上生效可以執行下面的命令: # sysctl –p 在修改其他內核參數時可以向/etc/sysctl.conf文件中添加相應變數即可,下面介紹/proc/sys下內核文件與配置文件 sysctl.conf中變數的對應關系,由於可以修改的內核參數都在/proc/sys目錄下,所以sysctl.conf的變數名省略了目錄的前面部 分(/proc/sys)。 將/proc/sys中的文件轉換成sysctl中的變數依據下面兩個簡單的規則: 1.去掉前面部分/proc/sys 2.將文件名中的斜杠變為點 這兩條規則可以將/proc/sys中的任一文件名轉換成sysctl中的變數名。 例如: /proc/sys/net/ipv4/ip_forward =》 net.ipv4.ip_forward /proc/sys/kernel/hostname =》 kernel.hostname 可以使用下面命令查詢所有可修改的變數名 # sysctl –a 下面例舉幾個簡單的內核參數: 1./proc/sys/kernel/shmmax 該文件指定內核所允許的最大共享內存段的大小。 2./proc/sys/kernel/threads-max 該文件指定內核所能使用的線程的最大數目。 3./proc/sys/kernel/hostname 該文件允許您配置網路主機名。
❹ linux 內核參數優化
一、Sysctl命令用來配置與顯示在/proc/sys目錄中的內核參數.如果想使參數長期保存,可以通過編輯/etc/sysctl.conf文件來實現。
命令格式:
sysctl [-n] [-e] -w variable=value
sysctl [-n] [-e] -p (default /etc/sysctl.conf)
sysctl [-n] [-e] –a
常用參數的意義:
-w 臨時改變某個指定參數的值,如
# sysctl -w net.ipv4.ip_forward=1
-a 顯示所有的系統參數
-p從指定的文件載入系統參數,默認從/etc/sysctl.conf 文件中載入,如:
以上兩種方法都可能立即開啟路由功能,但如果系統重啟,或執行了
# service network restart
命令,所設置的值即會丟失,如果想永久保留配置,可以修改/etc/sysctl.conf文件,將 net.ipv4.ip_forward=0改為net.ipv4.ip_forward=1
二、linux內核參數調整:linux 內核參數調整有兩種方式
方法一:修改/proc下內核參數文件內容,不能使用編輯器來修改內核參數文件,理由是由於內核隨時可能更改這些文件中的任意一個,另外,這些內核參數文件都是虛擬文件,實際中不存在,因此不能使用編輯器進行編輯,而是使用echo命令,然後從命令行將輸出重定向至 /proc 下所選定的文件中。如:將 timeout_timewait 參數設置為30秒:
參數修改後立即生效,但是重啟系統後,該參數又恢復成默認值。因此,想永久更改內核參數,需要修改/etc/sysctl.conf文件
方法二.修改/etc/sysctl.conf文件。檢查sysctl.conf文件,如果已經包含需要修改的參數,則修改該參數的值,如果沒有需要修改的參數,在sysctl.conf文件中添加參數。如:
net.ipv4.tcp_fin_timeout=30
保存退出後,可以重啟機器使參數生效,如果想使參數馬上生效,也可以執行如下命令:
三、sysctl.conf 文件中參數設置及說明
proc/sys/net/core/wmem_max
最大socket寫buffer,可參考的優化值:873200
/proc/sys/net/core/rmem_max
最大socket讀buffer,可參考的優化值:873200
/proc/sys/net/ipv4/tcp_wmem
TCP寫buffer,可參考的優化值: 8192 436600 873200
/proc/sys/net/ipv4/tcp_rmem
TCP讀buffer,可參考的優化值: 32768 436600 873200
/proc/sys/net/ipv4/tcp_mem
同樣有3個值,意思是:
net.ipv4.tcp_mem[0]:低於此值,TCP沒有內存壓力.
net.ipv4.tcp_mem[1]:在此值下,進入內存壓力階段.
net.ipv4.tcp_mem[2]:高於此值,TCP拒絕分配socket.
上述內存單位是頁,而不是位元組.可參考的優化值是:786432 1048576 1572864
/proc/sys/net/core/netdev_max_backlog
進入包的最大設備隊列.默認是300,對重負載伺服器而言,該值太低,可調整到1000
/proc/sys/net/core/somaxconn
listen()的默認參數,掛起請求的最大數量.默認是128.對繁忙的伺服器,增加該值有助於網路性能.可調整到256.
/proc/sys/net/core/optmem_max
socket buffer的最大初始化值,默認10K
/proc/sys/net/ipv4/tcp_max_syn_backlog
進入SYN包的最大請求隊列.默認1024.對重負載伺服器,可調整到2048
/proc/sys/net/ipv4/tcp_retries2
TCP失敗重傳次數,默認值15,意味著重傳15次才徹底放棄.可減少到5,盡早釋放內核資源.
/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
這3個參數與TCP KeepAlive有關.默認值是:
tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds
意思是如果某個TCP連接在idle 2個小時後,內核才發起probe.如果probe 9次(每次75秒)不成功,內核才徹底放棄,認為該連接已失效.對伺服器而言,顯然上述值太大. 可調整到:
/proc/sys/net/ipv4/tcp_keepalive_time 1800
/proc/sys/net/ipv4/tcp_keepalive_intvl 30
/proc/sys/net/ipv4/tcp_keepalive_probes 3
/proc/sys/net/ipv4/ip_local_port_range
指定埠范圍的一個配置,默認是32768 61000,已夠大.
net.ipv4.tcp_syncookies = 1
表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,默認為0,表示關閉;
net.ipv4.tcp_tw_reuse = 1
表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0,表示關閉;
net.ipv4.tcp_tw_recycle = 1
表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。
net.ipv4.tcp_fin_timeout = 30
表示如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。
net.ipv4.tcp_keepalive_time = 1200
表示當keepalive起用的時候,TCP發送keepalive消息的頻度。預設是2小時,改為20分鍾。
net.ipv4.ip_local_port_range = 1024 65000
表示用於向外連接的埠范圍。預設情況下很小:32768到61000,改為1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192
表示SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網路連接數。
net.ipv4.tcp_max_tw_buckets = 5000
表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除並列印警告信息。默認為 180000,改為 5000。對於Apache、Nginx等伺服器,上幾行的參數可以很好地減少TIME_WAIT套接字數量,但是對於Squid,效果卻不大。此項參數可以控制TIME_WAIT套接字的最大數量,避免Squid伺服器被大量的TIME_WAIT套接字拖死。
Linux上的NAT與iptables
談起Linux上的NAT,大多數人會跟你提到iptables。原因是因為iptables是目前在linux上實現NAT的一個非常好的介面。它通過和內核級直接操作網路包,效率和穩定性都非常高。這里簡單列舉一些NAT相關的iptables實例命令,可能對於大多數實現有多幫助。
這里說明一下,為了節省篇幅,這里把准備工作的命令略去了,僅僅列出核心步驟命令,所以如果你單單執行這些沒有實現功能的話,很可能由於准備工作沒有做好。如果你對整個命令細節感興趣的話,可以直接訪問我的《如何讓你的Linux網關更強大》系列文章,其中對於各個腳本有詳細的說明和描述。
EXTERNAL="eth0"
INTERNAL="eth1"
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o $EXTERNAL -j MASQUERADE
LOCAL_EX_IP=11.22.33.44 #設定網關的外網卡ip,對於多ip情況,參考《如何讓你的Linux網關更強大》系列文章
LOCAL_IN_IP=192.168.1.1 #設定網關的內網卡ip
INTERNAL="eth1" #設定內網卡
echo 1 > /proc/sys/net/ipv4/ip_forward
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -t nat -A PREROUTING -d $LOCAL_EX_IP -p tcp --dport 80 -j DNAT --to 192.168.1.10
iptables -t nat -A POSTROUTING -d 192.168.1.10 -p tcp --dport 80 -j SNAT --to $LOCAL_IN_IP
iptables -A FORWARD -o $INTERNAL -d 192.168.1.10 -p tcp --dport 80 -j ACCEPT
iptables -t nat -A OUTPUT -d $LOCAL_EX_IP -p tcp --dport 80 -j DNAT --to 192.168.1.10
獲取系統中的NAT信息和診斷錯誤
了解/proc目錄的意義
在Linux系統中,/proc是一個特殊的目錄,proc文件系統是一個偽文件系統,它只存在內存當中,而不佔用外存空間。它包含當前系統的一些參數(variables)和狀態(status)情況。它以文件系統的方式為訪問系統內核數據的操作提供介面
通過/proc可以了解到系統當前的一些重要信息,包括磁碟使用情況,內存使用狀況,硬體信息,網路使用情況等等,很多系統監控工具(如HotSaNIC)都通過/proc目錄獲取系統數據。
另一方面通過直接操作/proc中的參數可以實現系統內核參數的調節,比如是否允許ip轉發,syn-cookie是否打開,tcp超時時間等。
獲得參數的方式:
第一種:cat /proc/xxx/xxx,如 cat /proc/sys/net/ipv4/conf/all/rp_filter
第二種:sysctl xxx.xxx.xxx,如 sysctl net.ipv4.conf.all.rp_filter
改變參數的方式:
第一種:echo value > /proc/xxx/xxx,如 echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
第二種:sysctl [-w] variable=value,如 sysctl [-w] net.ipv4.conf.all.rp_filter=1
以上設定系統參數的方式只對當前系統有效,重起系統就沒了,想要保存下來,需要寫入/etc/sysctl.conf文件中
通過執行 man 5 proc可以獲得一些關於proc目錄的介紹
查看系統中的NAT情況
和NAT相關的系統變數
/proc/slabinfo:內核緩存使用情況統計信息(Kernel slab allocator statistics)
/proc/sys/net/ipv4/ip_conntrack_max:系統支持的最大ipv4連接數,默認65536(事實上這也是理論最大值)
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established 已建立的tcp連接的超時時間,默認432000,也就是5天
和NAT相關的狀態值
/proc/net/ip_conntrack:當前的前被跟蹤的連接狀況,nat翻譯表就在這里體現(對於一個網關為主要功能的Linux主機,裡面大部分信息是NAT翻譯表)
/proc/sys/net/ipv4/ip_local_port_range:本地開放埠范圍,這個范圍同樣會間接限制NAT表規模
cat /proc/sys/net/ipv4/ip_conntrack_max
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
cat /proc/net/ip_conntrack
cat /proc/sys/net/ipv4/ip_local_port_range
wc -l /proc/net/ip_conntrack
grep ip_conntrack /proc/slabinfo | grep -v expect | awk '{print 2;}'
grep ip_conntrack /proc/slabinfo | grep -v expect | awk '{print 3;}'
cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 10
cat /proc/net/ip_conntrack | perl -pe s/^(.*?)src/src/g | cut -d ' ' -f1 | cut -d '=' -f2 | sort | uniq -c | sort -nr | head -n 10
❺ 如何在Linux上通過GRUB添加內核參數
編輯修改grub引導配置文件,在載入內核命令(對於grub legacy,為kernel,grub2為linux)那一行後面添加需要的參數;或者直接在命令行界面輸入相應命令後面添加參數。
❻ 如何在linux上通過GRUB添加內核參數
如果你想在系統啟動時載入一個內核參數,需修改GRUB的配置模板(/etc/default /grub),添加"名稱=值」的鍵值對到GRUB_CMDLINE_LINUX變數,添加多個時用空格隔開,例如GRUB_CMDLINE_LINUX="...... name=value"(如果沒有GRUB_CMDLINE_LINUX變數時,用GRUB_CMDLINE_LINUX_DEFAULT替代即可).
1. Debian or Ubuntu
$ sudo update-grub //生成grub的配置文件
$ sudo apt-get install grub2-common //沒有 update-grub命令時,先運行這個安裝命令
2. Fedora or CentOS7
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg //生成grub2的配置文件
$ sudo yum install grub2-tools.x86_64 //沒有grub2-mkconfig命令時,先安裝grub2-tools
帶EFI的系統,grub.cfg文件會是在/boot/efi下,比如CentOS7:/boot/efi/EFI/centos/grub.cfg
❼ [重慶思庄每日技術分享]-linux 系統 修改內核參數導致不能啟動的問題
錯誤原因:
錯誤修改了 /etc/selinux/config文件。
錯誤信息:
重啟後發現出現錯誤,不能繼續啟動
Kernel panic - not syncing: Attempted to kill init
解決方案:
1.系統啟動的時候,按下『e』鍵進入grub編輯界面,編輯grub菜單,選擇「kernel /vmlinuz-2.6.23.1-42.fc8 ro root=/dev/vogroup00/logvol00 rhgb quiet」 一欄,按『e』鍵進入編輯,在末尾增加enforcing=0,即:
kernel /vmlinuz-2.6.23.1-42.fc8 ro root=/dev/vogroup00/logvol00 rhgb quiet enforcing=0 或者selinux=0
按『b』鍵繼續引導,OK順利前進。
2.後來發現,通過改變/etc/grub.conf 在倒數第二行添加selinux=0 也可。
3.(推薦) 檢查/etc/selinux/config文件是否出錯
注意事項:
1.系統啟動後,按e ,如果沒有對應kerne選項繼續按e 找到
2.在出現命令行後 空格加入 enforing=0 回車
3.除保存編輯不要按回車,esc等按鍵。輸入enforing=0後直接按b 繼續啟動。
❽ 嵌入式linux系統的啟動流程是什麼樣的
1)
初始化
RAM
因為
Linux
內核一般都會在
RAM
中運行,所以在調用
Linux
內核之前
Bootloader
必須設置和初始化
RAM,為調用
Linux內核
做好准備。初始化
RAM
的任務包括設置
CPU
的控制寄存器參數,以便能正常使用
RAM
以及檢測RAM
大小等。
2)
初始化串口埠
在
Linux
的啟動過程中有著非常重要的作用,它是
Linux內核和用戶交互的方式之一。Linux
在啟動過程中可以將信息通過串口輸出,這樣便可清楚的了解
Linux
的啟動過程。雖然它並不是
Bootloader
必須要完成的工作,但是通過串口輸出信息是調試
Bootloader
和Linux
內核的強有力的工具,所以一般的
Bootloader
都會在執行過程中初始化一個串口作為調試埠。
3)
檢測
處理器類型
Bootloader在調用
Linux內核前必須檢測系統的處理器類型,並將其保存到某個常量中提供給
Linux
內核。Linux
內核在啟動過程中會根據該處理器類型調用相應的初始化程序。
4)
設置
Linux啟動參數
Bootloader在執行過程中必須設置和初始化
Linux
的內核啟動參數。
5)
調用
Linux內核映像
Bootloader完成的最後一項工作便是調用
Linux內核。如果
Linux
內核存放在
Flash
中,並且可直接在上面運行(這里的
Flash
指
Nor
Flash),那麼可直接跳轉到內核中去執行。但由於在
Flash
中執行代碼會有種種限制,而且速度也遠不及
RAM
快,所以一般的
嵌入式系統
都是將
Linux內核拷貝到
RAM
中,然後跳轉到
RAM
中去執行。