shell 腳本進階 ,啟動流程和故障排錯

shell 腳本進階 ,啟動流程和故障排錯

1.條件選擇if語句?

單分支

if 判斷條件;

then 條件為真的分支代碼

fi ?

雙分支

if 判斷條件;? (命令可自行判斷是否為真不用查看echo $?的值來進行判斷)

then 條件為真的分支代碼 ? (命令可以不用加反向單引號也能執行命令)

else 條件為假的分支代碼

fi

多分支

if 判斷條件1;then

條件為真的分支代碼? (如果為真則結束)

elif 判斷條件2; then

條件為真的分支代碼? (如果為真則結束執行)

elif 判斷條件3; then

條件為真的分支代碼? (如果為真則結束執行)

else

以上條件都為假的分支代碼? (以上都為假則執行此命令)

fi ?

逐條件進行判斷,第一次遇為“真”條件時,執行其分支,而后結束整個if語句

for語句

for 變量名 in 列表;do

循環體

done

可多層嵌套for語句實現組和

例題:(循環體里面執行一遍里面執行5遍總共執行10×5=50次)

for? i? in? {1..10};do

foe j in {1..5};do

sum=

done

done

執行機制:

依次將列表中的元素賦值給“變量名”; 每次賦值后即執行一次循環體; 直 到列表中的元素耗盡,循環結束

 

條件判斷:case語句

case 變量引用 in

對變量進行匹配滿足變量)? (里面寫匹配變量的內容,一旦匹配則后續的匹配命令則不進行執行了)

echo ” ?? ”

; ;

對變量進行匹配滿足變量則)

echo ” ? ”

; ;

esac? (結束)

循環控制語句break

break [N]:提前結束第N層循環,最內層為第1層

循環控制shift命令

用于將參量列表 list 左移指定次數,缺省為左移一次。 ?

參量列表 list 一旦被移動,最左端的那個參數就從列表中刪除。while 循環遍 歷位置參量列表時,常用到 shift

創建無限循環體

while true; do

循環體 ?

done

until false; do

循環體

Done

while語法的運用

while 條件判斷(i <4) ;do ? ? ? ? ? ? ? ?? (當條件判斷值i>=4時則循環結束) ? 條件判斷不滿足時退出

循環體

i++ (每次執行完循環體后條件判斷變量+1)

done

unit語法的運用

unit? 條件判斷 (i>4);do ? (當條件判斷值i>4時則循環結束) 條件判斷滿足時退出

循環體

i++(每次執行完循環體后條件判斷變量+1)

done

select循環與菜單

select 循環主要用于創建菜單,按數字順序排列的菜單項將顯示在 標準錯誤上,并顯示 PS3 提示符,等待用戶輸入

例題:

捕獲22222222222

上圖簡單的小實驗,寫入腳本如下;

select menu in? yu xia rou ji ya? do ? ? ? ? ? ? ? ? menu為變量,in后面跟的時列表 do 結束

echo ? $menu

done

其中最后一行顯示#? 是由變量PS3來控制的,可以更改變量PS3來去掉#?只要在腳本里的最上頭添加

PS3=”please chose :”即可。下圖可實現簡單的select用法,每個命令后面添加break可實現選擇執行此命令結束后退出腳本。

捕獲21

運用此命令可創建菜單然后再每個選項后跟不同的命令來實現選擇則要執行的命令選項

elect 是個無限循環,因此要記住用 break 命令退出循環,或用 exit 命令終止腳本。

也可以按 ctrl+c 退出循環

select 經常和 case 聯合使用 ?與 for 循環類似,可以省略 in list,此時使用位置參量

信號捕捉trap

trap ‘觸發指令’ 信號 自定義進程收到系統發出的指定信號后,將執行觸發指令,而不會執行原操 作

在腳本中捕獲信號可以讓其不受外界信號的干擾繼續執行腳本。

trap ‘ ? ‘ 信號 忽略信號的操作 。什么也不做?

trap ‘-‘ 信號 恢復原信號的操作 ?

trap -p 列出自定義信號操作 ?

小例子: trap ? ‘echo? ctrl+c ‘? int

for i in {1..10};do

sum=sum+$i

done

echo sum=$sum

當腳本再運行時,捕捉到ctrl+c也不會停止程序而繼續執行。

 

函數介紹 與應用

函數function是由若干條shell命令組成的語句塊,實現代碼重用和模塊化編程

定義函數

語法: f_name () { 執行的命令即所謂的函數體;}

簡單小例子;f_name () {? echo lv; ? (此為定義函數,其中函數名可以不用加f_可自定義 ,但通常都加上)

} ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ({? }里命令的前后必須有空格,)

? ? f_name ? (此為調用函數) 結果就會輸出? lv

如果要刪除函數:unset? f_name ? (? unset? +定義的函數名即可)

函數在使用前必須定義,因此應將函數定義放在腳本開始部分,直至shell首次發現它 后才能使用 ?

調用函數僅使用其函數名即可 (如果函數體有定義的變量則需要加反向單引號,切函數里定義的變量只能夠在函數里調用,出了函數體就不行了)

例如:f_use () { dd=`df | grep “/dev/sda” | tr -s ‘ ‘ % | cut -d% -f5`

if [? $dd? -eq? 80 ];then

echo ” your disk? full ”

}

如果不是定義變量則無需加反向單引號,{} 可自動執行里面的命令

例如:f_use (){ df | grep “/dev/sda” | tr -s ‘ ‘ % | cut -d% -f5

}

f_use ? 即可調用函數

函數使用

函數的定義和使用: ?

可在交互式環境下定義函數 ?

可將函數放在腳本文件中作為它的一部分 ?

函數的返回值,可自定義然后用echo $? 來查看返回值應當與自己定義的一樣。

11

如果函數體執行失敗則不會顯示自己設定的返回值;只有執行成功才可以。

函數在腳本前面定義好了,在下面的程序中調用,需不需要加反向單引號視情況來決定,有時需要有時不需要,函數定義好了以后就相當與命令使用

231

函數的跨腳本的調用:

一般都把多個自定義的函數,寫到一個文件里,如果需要使用調用即可,可供多個腳本使用,大大提高使用的效率不必再每個腳本里重新定義函數了。

在腳本里調用函數庫里的函數:

例如:fun為存儲函數的文件

在編寫腳本的最上面添加一行:.? fun或者 source fun 即可調用函數了

系統里的函數庫在/etc/init.d/functions里面。(也可調用來使用)如果要調用使用則在腳本的前面添加一行 ? . /etc/init.d/functions 就行了。

環境函數

使子進程也可使用

聲明:export -f function_name

查看:export -f 或 declare -xf

函數遞歸示例

函數直接或間接調用自身

fork炸彈

fork炸彈是一種惡意程序,它的內部是一個不斷在fork進程的無限循環,實質是 一個簡單的遞歸程序。由于程序是遞歸的,如果沒有任何限制,這會導致這個 簡單的程序迅速耗盡系統里面的所有資源 ?

函數實現

:(){ :|:& };:

bomb() { bomb | bomb & }; bomb ?

腳本實現

cat Bomb.sh

#!/bin/bash

./$0|./$0&

數組

bash的數組支持稀疏格式(可自定義索引不連續的

聲明數組:

declare -a ARRAY_NAME :普通數組(及系統自定義的序列號從0開始向后編號)

declare -A ARRAY_NAME: 關聯數組 ? (自己定義數組的)
關聯數組必須先聲明后使用,普通數組則不是必須的,但一般建議聲明以便查看。

關聯數組:一個自定義編號對應一個元素,只要不是以數字為編號,

例如:? ceo——>mage

coo——>zhangsir

cto ——->wang

數組的使用:

1

上圖中兩種數組的復制(都是普通數組);可以一次賦值一個也可以一次賦值多個。如果是普通數組,

可以將后面小括號里的生成列表例如:(元素可命令生成也可組和生成如{1..5}{1..6}等)

交互式數組值對賦值 read -a? name ?? —–> lv li ch dd?

file? =(/etc/*) ? 及將/etc/的所有文件作為元素賦值給file數組里

name=(`cat /etc/passwd`)? 可以將文件里的內容賦值給數組

echo ${file[1] } ? 查看file數組里的第二個元素的文件

echo ${file[*]} 查看所有元素

echo? ${#file[*]} 查看數組file里的元素個數

顯示所有數組:declare -a

引用數組 :

引用數組所有元素:

${NAME[*]}

${NAME[@]}

查看數組的長度(數組中元素的個數):

${# NAME[*]}

${# NAME[@]}

刪除數組中的某元素:導致稀疏格式

unset? name[數組里元素的編號]?

刪除整個數組:

unset name

數組數據處理

數組切片:${name[*]:offset:number}

offset: 要跳過的元素個數

number: 要取出的元素個數

取要跳過元素個數之后的所有元素 ${name[*]:offset}

向數組中追加元素;name[${#name[*]}]=value (新的元素)

字符串切片:(字符串取出指定長度的內容)

(將變量定義`var=123456789`)

${#var}:查看字符串變量var的長度

${var:3}? :”456789″ 跳過前三個后面的都取出來

${var:3:4}:”45678″ 跳過前三個取緊接的后四個

${var:? -3}: “789” ? 取倒數三個-3前面必須要加空格

${var:3:-4}: “456”拋頭去尾留中間

${var: ?? -4:-2}: “67”取后四個之后再去掉后兩個? (此代碼再7上可以執行在6上不可以執行)

基于模式來取字符串

${var#*:word}:在變量var中從左到右一直找,直到找到word這個單詞開始停止,刪除找到word之前的內容

${var##*:word}:在變量var中從左到右一直找,直到找到word這個單詞最后一個開始停止,刪除找到word之前的內容? (為貪婪模式)

${var%word*}:在變量var中從右向左找,直到出現第一個word這個單詞后開始停止,刪除找到word前的

${var%%word*}:在變量var中從右向左找,直到出現最后一個word這個單詞后開始停止,刪除找到word前的。(為貪婪模式)

具體看下面的案例:

 

file=“var/log/messages”

${file#*/}: log/messages? (從前向后取丟棄以/為分界的第一段:非貪婪模式)

${file##*/}: messages ? ? ? ? (從前向后丟棄以/為分界的前n段只留下最后一段:此為貪婪模式)

${file%/*}: var/log (從后向前取丟棄以/為分界的第一段:非貪婪模式)
${file%%/*}: var (從后向前丟棄以/為分界的后n段只留下最后一段:此為貪婪模式)

下面為數組和字符串切片組和的案例

name=(`cat /etc/passwd`) (將/etc/passwd里的內容賦值到name組里)
echo ${name[*]%%:*} | tr ‘ ‘ “\n” (將變量name 查看組里的所有元素然后將元素切片取出最前面一段)

字符串的查找替換

${var/pattern/substr}:查找var所表示的字符串中,第一次被pattern所匹 配到的字符串,以substr替換之 ${var//pattern/substr}: 查找var所表示的字符串中,所有能被pattern所匹 配到的字符串,以substr替換之 ${var/#pattern/substr}:查找var所表示的字符串中,行首被pattern所匹 配到的字符串,以substr替換之 ${var/%pattern/substr}:查找var所表示的字符串中,行尾被pattern所匹 配到的字符串,以substr替換之

查找并刪除

${var/pattern}:刪除var所表示的字符串中第一次被pattern所匹配到的字符串

${var//pattern}:刪除var所表示的字符串中所有被pattern所匹配到的字符串

${var/#pattern}:刪除var所表示的字符串中所有以pattern為行首所匹配到的 字符串

${var/%pattern}:刪除var所表示的字符串中所有以pattern為行尾所匹配到的 字符串 ?

字符大小寫轉換

${var^^}:把var中的所有小寫字母轉換為大寫

${var,,}:把var中的所有大寫字母轉換為小寫

創建臨時文件

mktemp ? /data/XXXXX ? (在/data/下生成臨時的隨機文件XXX為大寫的來指定隨機文件名長度的大小)

mktemp? /data/msXXX ? ? (也可指定字符和隨機字符組和來創建文件名,但指定字符后最少要添加3個隨機的字符)

mktemp ? -d ? /data/XXXXX ? (此時創建的是目錄)

tmpdir=`mktemp –d /tmp/testdirXXX`? (生成的臨時文件或目錄最好放到一個變量里面,以便查找

安裝復制文件

選項:

-m MODE,默認755

-o OWNER

-g GROUP

示例:

install -m 700 -o wang -g admins ? /etc/passwd /? /data/passwd.txt ? (文件復制并且設定權限及屬性)

install –m 770 –d /testdir/installdir (-d? 創建文件夾并且設定好權限)

 

expect

主要應用于自動化交互式操作的場景,借助Expect處理交互的命令

expect 語法

新建一個expect 文件

vim? scp.exp

#!/usr/bin/expect ? (以expect為機制來編寫)

spawn ? scp /etc/fstab ?? wang@192.168.8.100:/app

expect {

“yes/no” { send “yes\n”;exp_continue } ? (捕捉是否有“yes/no”然后輸入yes并換行)

“password” { send “magedu\n” } ? ? ?? (捕捉是否有“passwd”的提示,然后輸入密碼并換行)

}

expect eof ? (以此為結尾)

此腳本加上執行權限后,自動執行遠程復制任務 ,執行時不能用bash來運行,因為不是基于bash的腳本

加上執行權限后,使用./scp.exp來執行 做實驗時傳送文件只能傳送單個文件

Linux的啟動與內核管理

具體的內部啟動細節流程

1? POST:Power-On-Self-Test,加電自檢,負責完成對CPU、主 板、內存、硬盤子系統、顯示子系統、串并行接口、鍵盤、CD-ROM光驅等硬件情況的檢測.(bootloader: 啟動操作系統專門的引導程序,給下面啟動操作系統時使用? bootloader :現在版 GRUB和GRUB2兩種 ,此軟件包安裝的時候并不是單一的存放某個目錄下,一部分就存放到了MBR里了)

MBR: 446: bootloader, 64: 分區表, 2: 55AA ?

GRUB: primary boot loader : 1 步驟,1.5? 步驟

secondary boot loader :2 步驟,分區文件

2? 446個字節啟動完成后開始試圖去找/boot分區,/boot分區里面存放了和內核相關的文件,其中還有GRUB的第二部分的文件,想要進入到/boot/GRUB的前提是要進入/boot的分區里。而/boot分區里存放內容是基于文件系統來存放的的,想要識別文件系統里的內容必須要加載文件系統的驅動,而文件系統的驅動又存放于/目錄下,446個字節存放不了系統驅動所以再進入/boot分區前要加載/boot分區的文件系統,他存放再MBR后面幾個扇區里 ,此為1.5的步驟。再執行第二步前要做的。(1步驟就是加載446個字節,他的作用就是告訴二步驟要加載的/boot下的內容再磁盤的什么位置)

kernel: (內核在完成前面的加載驅動成功之后開始下面的操作)

自身初始化:

探測可識別到的所有硬件設備

加載各種硬件驅動程序(借助于ramdisk加載驅動) (如網卡驅動,硬盤驅動)

以只讀方式掛載根文件系統 (這里要找根,要掛載根 ,則必須要識別根的文件系統,根的文件系統可能和boot的文件系統不一樣,因為他們再兩個不同的分區里面。而文件系統的驅動放在根下,則又有一個問題,無法查看根,則無法加載文件系統的一個死循環里面了。再boot里存放了根的文件系統驅動來解決了這個問題,此文件為虛擬文件系統,是安裝系統時臨時生成的,此文件為對應你所安裝時的環境及你所選擇的文件系統如果損壞不能復制一個,可用命令生成一個虛擬文件即可)

運行用戶空間的第一個應用程序:在centos6 中 運行第一個程序/sbin/init ,? 讀取配置文件/ etc/inittab ? ? ? 決定啟用的模式 initial(1-6)之后? 進行某些程序的初始化操作。(主機名,網絡設置),然后查看配置文件/etc/rc5.d 來決定啟動時那些程序需要自動加載的(5代表你所選擇的啟動模式里的配置文件所在的名稱如果選擇3模式其配置文件就會在/etc/rc3.d里面),此文件里只是程序腳本的名稱的軟連接,此文件里以K打頭的文件名為啟動時停止的腳本S打頭的為啟動時自動加載的腳本程序的名稱;在此/etc/init.d文件里真正加載上面軟鏈接名字的腳本程序。(/etc/rc3.d(軟連接列表)—–> /etc/init.d(真實腳本文件)

下圖中為決定啟用的模式,默認為5(圖形)模式,可以更改的,如果改為3則啟動時默認為字符界面

Inked捕獲1_LI

下圖為判斷所需要加載程序腳本的軟連接名稱K和S打頭的文件,其中S序號越靠后的,最后加載? K序號靠前的最先停止。如果一個腳本啟用時靠后則停用時要靠前。

命令ntsysv可以查看下圖列表中那些服務是停止的還是啟動的。(*號的代表啟動時要加載的項。選中按空格鍵可以改變為不啟動)

chkconfig –list ate ? ? ?? (此命令也可以查看單個程序在1-6的各種模式下處于什么狀態)

chkconfig? –list ? ? ? (查看所有啟動項在加載時的各種狀態)

chkconfig? –level ? 35? ate? off/on? (此命令代表在3和5模式下將ate設置為開機不加載啟動項/開機加載啟動項)

service? atd? start /stop ?? (臨時啟用并使之生效)

service ? –status-all ? (查看當前啟動加載項的狀態)

如果從3模式切換到5模式,在切換的過程中自動將5模式下的開機動和不啟動項重新加載一遍。

再此類表中各種模式下都會有一個文件再開機后最后啟動/etc/rc5.d/S99local? .此文件并不是一個腳本程序,如果把我們想要執行的命令放如此腳本里,開機就會自動執行。(再centos7中此腳本文件需要添加執行權才能夠運行)

捕獲3

下圖為具體加載運行的腳本程序;如果需要添加開機自啟動項時,需要將腳本文件加入到此目錄下,然后添加軟鏈接的名稱到上圖的文件中;用此命令來實現。

首先用vim? .testservise創建一個服務腳本

#!/bin/bash

#chkconfig ?? 35? 96? 3 ? (35代表在3和5模式下,95為他的啟動序列編號? 3為他的停止序列編號)

將此腳本加上執行權限,然后添加到/etc/init.d/列表里面 ? chkconfig? –add ? testservise? 刪除列表里的啟動加載項 ? chkconfig? –del? testservise?

如果此腳本存在錯誤可能會造成系統起不起來,這是我們需要進入到單用戶模式將此腳本在1-6模式下全部設置為off,正常啟動則會繞過此腳本,等待系統起來后再重新更改腳本文件。

捕獲2

瞬態服務 (也叫超級守護進程)

瞬態(Transient)服務被xinetd進程所管理, 進入的請求首先被xinetd代理 ,平時不啟動處于休眠狀態則不需要占用系統資源,只要添加進xinetd里,需要此服務時則會被xinetd服務喚醒。(此服務適用于一些不常用的啟動加載項但偶爾需要使用)

配置文件:/etc/xinetd.conf、/etc/xinetd.d/<service

xinetd服務默認沒有安裝,需要安裝一下。

打開啟動加載列表chkconfig? –list? 會發現多了xinetd服務列表如下圖

捕獲23

chkconfig rsync on/off? (啟用或停用,xinetd對rsync加載項的監控服務。)

再centos7中許多啟動加載項都由類似于xinetd的systemd來管理大大提高啟動速度。(反之帶來的問題時依賴性太高了,如果systemd起不起來則會造成系統的其他加載項都無法啟動的結果)

systemd的使用查看百度幫助

CentOS 6 init程序為: upstart, 其配置文件: /etc/inittab, /etc/init/*.conf,配置文件的語法 遵循 upstart配置文件語 法格式,和CentOS5不同

grub legacy

grub-install? /dev/sda? (可修復磁盤前512個字節及啟動的1和1.5階段)

在/boot/grub 里面的文件除了grub.conf和splash.xpm.gz 都可以刪除,也不影響正常啟動。再用grub-install? /dev/sda 來修復

再次生成文件? 如果時刪除以后修復生成的文件,再次刪除后則會影響正常啟動。

在單用戶下無需密碼即可登陸,如果需要添加密碼需要編輯/boot/grub/grub.conf 添加密碼;并生成加密的密碼如下圖所示

生成加密的密碼:grub-md5-crypt 之后輸入兩邊密碼然后生成加密密碼。

passwd ? –md5? +加密的密碼即可? (在進入單用戶模式也需要密碼才能進入)

捕獲

系統啟動的過程及各個階段所出現的問題的解決應對方法:

centos6 啟動流程
1 post 硬件環境? (加電自檢
2 mbr 446 grub stage1? (讀取磁盤的446個字節的驅動引導程序為第一階段
3 grub stage1.5 加載/boot 分區文件系統? (1.5階段加載/boot的文件系統驅動,在第一個扇區之后的27個扇區里面)
4 grub stage2 /boot/grub/grub.conf ?? (2階段加載/boot分區下的內核文件和驅動根的虛擬文件要通過grub.conf文件來執行加載內核和驅動
5 vmlinuz 加載/ /boot/initramfs.xxx.img (同上一階段在一起加載內核文件和文件系統的驅動
6 /sbin/init ? /etc/inittab id:3:? (開始執行根下第一個程序init并運行初始化腳本,和決定啟用那種用戶模式開啟的后面的加載項的內容)
7 /etc/rc.sysinit?運行初始化腳本的名字
8 /etc/rc3.d/S,Kxxx –> /etc/init.d/xxx ? (開始根據rc3.d的菜單所需要啟動的項,來運行init.d里的腳本
chkconfig –level N service on|off ? ? (通過此命令來查看和 更改加載項是啟動或者是關閉
9 /etc/rc.local ? (無論那種模式最后會運行的兜底文件,把想要執行的命令加入此文件里開機就會運行)
10 login ? (最后到登陸界面

 

案例:如果把上述的虛擬文件不小心刪掉后,造成系統無法無法讀取根里的內容而造成系統起不來;(第四項出現問題)

1 進入救援模式

2.用光盤啟動根目錄在,/mnt/sysimage 下需要切根 :chroot? /mnt/sysimage

3 .重新生成虛擬文件? mkinitrd /boot/initramfs-`uname -r`.img? `uname -r`

(其中`uname -r` 為用命令生成內核版本號 ,如果手工添加的話容易出錯)

4.查看文件生成后重啟即可? (reboot 命令失效。需要exit 退兩次 退到圖形界面來重啟)

如果把/boot下的內核文件刪除造成系統起不來;(第四項啟動出問題)

思路;在救援模式下將光盤里的相同地方的文件復制一份過來即可。

找到光盤的sr0的路徑? ,在/光盤路徑/iolinux目錄下,有個vmlinuz的文件,復制到自己的/boot下即可。

如果把/boot下的文件全部都刪除的話: (第四項啟動時出的問題)

還需要進入救援模式下來操作:

第一步:切根 chroot /mnt/sysimage

第二部:復制光盤里的內核文件到/boot下 ?? cp /mnt/isolinux/vmlinuz? /boot/

第三部:生成文件系統啟動的文件 ? ? ? ? ? ? ? mkinitrd ? /boot/initramfs-`uname -r`.img ‘uname -r’

第四部: 生成grub文件 ? ? ? ? ? ? ? ??grub-install /dev/sda

第五部: ? 編輯無法生成的文件/boot/grub/grub.conf? (此處的兩個文件編輯要和grub里的文件名稱一樣 “內核文件和虛擬文件兩個不然會造成無法找到grub里對應的內核真實文件”)

vim? grub.conf

default=0

timeout=5

title? lvchengyanglinux

kernel ?? /vmlinuz -`版本號寫全` ? root=/dev/sda2? (指明根的路徑)

initrd ?? /initramfs-`版本號寫全`.img

兩次退出重啟便可以。

第二種方法:
mkdir /mnt/cdrom
mount /dev/sr0 /mnt/cdrom
rpm -ivh /mnt/cdrom/Packages//Packages/kernel-2.6.32-696.el6.x86_64.rpm –root=/mnt/sysimage/ –forc (將內核安裝包強制安裝一下)

切根chroot? /mnt/sysimages

用grub-install /dev/sda安裝一下

再次編輯grub.conf文件就可以了。

如果/etc/rc3.d啟動項的腳本出現問題造成系統無法啟動:(第八項啟動時出的問題)

chkconfig –level 35 ate off/on (此命令代表在3和5模式下將ate設置為開機不加載啟動項/開機加載啟動項)

用上述命令在單用戶/救援模式下將出現問題的啟動加載項先暫停開機加載,等待系統起來時在解決問題。

如果把磁盤的446個驅動引導刪除出現的問題:(第二項啟動出現的問題)

在救援模式下;grub-install /dev/sda (可修復磁盤前512個字節及啟動的1和1.5階段)

如果將/etc/fstab和/boot的文件刪除,系統無法識別分區的文件系統類型造成的無法開機:

在救援模式下:無法判斷那個分區是根的分區

需要建一個文件夾/mnt/roots,然后分別掛載各個分區上來查看里面的內容來判斷那個是根分區,/boot分區以及其他的分區。找到根分區之后用vi編輯文件

vi? /mnt/roots/etc/fstab

/dev/sda1? /boot ?? ext4? defaults? 0 0

/dev/sda2 ?? / ? ? ? ? ext4? defaults ? 0 0

/dev/sda3 ? / data ? ? ? ? ext4 ? defaults ? 0 0

/dev/sda5 ? ? swap ? ? swap ? ? defaults ?? 0 0

(各個分區對應的名稱要具體看機器的實際對應結果此為示例)

文件系統創建完成之后退出重新啟動 ,即可 再次進入救援模式來修改即可。

如果將/sbin/init二進制文件刪除造成的無法啟動? (第六項啟動時出錯)

進入救援模式,此次救援模式聯網 .切根,然后

將別的機器上的二進制文件 拷貝 過來即可。 (或者拷貝一份相同的文件的/sbin/下也行)

chroot? /mnt/sysimage

scp 192.168.27.2 :/sbin/init ?? /sbin

還有一種方法;/sbin/init文件來自于upstart安裝包

可以將upstart包解壓也行

rpm2cpio /media/CentOS_6.9_Final/Packages/upstart-0.6.5-16.el6.x86_64.rpm | cpio -idv ./sbin/init

centos7的啟動管理

systemd

?配置文件:

/usr/lib/systemd/system:每個服務最主要的啟動腳本設置,類似于之前的 /etc/init.d/(6上的腳本)

/run/systemd/system:系統執行過程中自動產生的服務腳本,比上面目錄 優先運行

/etc/systemd/system:管理員建立的執行腳本,類似于 /etc/rc.d/rcN.d/S**K**文件的功能,比上面目錄優先運行

Systemctl –t help ? 查看unit類型

管理服務

啟動:service name start(6和7都可用) ==> systemctl start name (僅7上用,后面跟多個程序)?

停止:service name stop(6和7都可用) ==> systemctl stop name?(僅7上用,后面跟多個程序)

重啟:service name restart(6和7都可用) ==> systemctl restart name?(僅7上用,后面跟多個程序)

狀態:service name status(6和7都可用) ==> systemctl status name?(僅7上用,后面跟多個程序)

條件式重啟:已啟動才重啟,如果是關閉的不做操作

service name condrestart ==> systemctl try-restart name?

重載或重啟服務:先加載,再啟動

systemctl reload-or-restart name?

重載或條件式重啟服務:

systemctl reload-or-try-restart name ?

禁止自動和手動啟動:

systemctl mask name ?

取消禁止:

systemctl unmask name

服務查看

查看某服務當前激活與否的狀態:

systemctl is-active name ?

查看所有已經激活的服務:

systemctl list-units ?

查看所有服務: (包含已激活和未激活的所有程序)

systemctl list-units –all

chkconfig命令的對應關系: ?

設定某服務開機自啟:

chkconfig name on ==> systemctl enable name?

設定某服務開機禁止啟動:

chkconfig name off ==> systemctl disable name

查看服務是否開機自啟:

systemctl is-enabled name

查看所有服務的開機自啟狀態:

chkconfig –list ==> systemctl list-unit-files –type

用來列出該服務在哪些運行級別下啟用和禁用

chkconfig sshd –list ==> ls /etc/systemd/system/*.wants/sshd

CentOS7引導順序

UEFi或BIOS初始化,運行POST開機自檢 ?

選擇啟動設備 ?

引導裝載程序, centos7是grub2 ?

加載裝載程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg ?

加載initramfs驅動模塊 ?

加載內核選項 ?

內核初始化,centos7使用systemd代替init ?

執行initrd.target所有單元,包括掛載/etc/fstab ?

從initramfs根文件系統切換到磁盤根目錄 ?

systemd執行默認target配置,配置文件/etc/systemd/system/default.target

systemd執行sysinit.target初始化系統及basic.target準備操作系統 ?

systemd啟動multi-user.target下的本機與服務器服務 ?s

ystemd執行multi-user.target下的/etc/rc.d/rc.local ?

Systemd執行multi-user.target下的getty.target及登錄服務 ?

systemd執行graphical需要的服務

破解CentOS7的root口令方法一

啟動時任意鍵暫停啟動 ?

按e鍵進入編輯模式 ?

將光標移動linux16開始的行,添加內核參數rd.break ?

按ctrl ? + x啟動 ?

mount –o remount? rw /sysroot ?(重新以讀寫的方式掛載根通過查找/dev/sda2來看到/所在的路徑,原根文件只是只讀的方式,要加權限才能修改密碼)

chroot /sysroot ?(切根)

passwd root ? (重設密碼)

touch /.autorelabel ?(新建文件此步驟為必須要的)

exit ? (退出)

reboot

破解CentOS7的root口令方法二

啟動時任意鍵暫停啟動 ?

按e鍵進入編輯模式 ?

將光標移動linux16開始的行,改為rw init=/sysroot/bin/sh ?

按ctrl-x啟動 ?

chroot /sysroot ?

passwd root ?

touch /.autorelabel ?

exit ?

reboot

在centos7中修復GRUB2文件被刪除

先修復grub2文件:grub2-install /dev/sda

在修復grub2下的主要配置文件grub.cfg :grub2-mkconfig > /boot/grub2/grub.cfg ? (在centos6當中需要手動生成grub.conf文件)

這樣就修復了整個grub2文件及里面的內容(相當與cent0s6中的grub文件夾)

centos7下刪除/boot文件的修復方法

進入救援模式下:chroot? /mnt/sysimage? (切根)

1 首先修復/boot里的文件用rpm重新將內核安裝一遍即可(需要進入/boot目錄下強制安裝–force)

rpm -ivh /run/media/root/CentOS\ 7\ x86_64/(可以寫上要掛載光盤的目錄來安裝)Packages/kernel-3.10.0-693.el7.x86_64.rpm –force

(需要將光盤掛載到新建的一個空目錄下來完成內核安裝完成后將生成/boot下的主要文件,除了grub2文件要單獨生成)

2 .生成grub2下的文件和grub2/grub.cfg文件,兩個文件需要兩步操作才可完成。

grub2-install? /dev/sda ? (生成grub2/下的文件,但不能生成grub.cfg文件)

grub2-mkconfig > /boot/grub2/grub.cfg? (生成主配置文件grub.cfg文件 ,如果不重定向默認輸出到界面所以要重定向到文件里才可以。)

調整默認啟動內核 (如果有多個內核選項可以設置默認啟動的內核為哪個通過更改以下配置文件)

vim /etc/default/grub

GRUB_DEFAULT=0 ? (從0開始在啟動時看到的第幾項,選第幾項就改為第幾項,此文件不能直接生效的)

再用grub2-mkconfig > /boot/grub2/grub.cfg 命令生成新的文件將原本的文件覆蓋掉,同時會更改grub.cfg

文件里關于默認啟動內核的設置(在這一行:else ;set ? default=”…”

或者直接更改/boot/grub2/grub.cfg 里的文件中的 set? default=”? …” 也可以 (一般不建議修改配置文件)

 

 

 

 

 

 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/97582

(1)
無所謂無所謂
上一篇 2018-05-05
下一篇 2018-05-06

相關推薦

欧美性久久久久