鳥哥的Linux私房菜基礎學習篇(第四版)

2021-05-14 20:00:26

前言:我只總結了我不太清晰的點,需要完整觀看書籍的可以下載:https://u15372029.pipipan.com/fs/15372029-393101184

第一部分 Linux的規則與安裝

第5章 Linux的檔案與目錄

許可權結構分析:檔案型別,所有者,所屬組,其他人

檔案型別分為:
-	普通檔案
d	目錄檔案
l	符號連結檔案
b	塊裝置檔案
c	字元裝置檔案
p	管道檔案
s	通訊端許可權

檔案/目錄的許可權含義:
在這裡插入圖片描述

r:4	w:2	x:1
owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others = --- = 0+0+0 = 0

當使用者user1,對/testdir 目錄有寫和執行許可權時,該目錄下的唯讀檔案file1是否可修改和刪除?
答:不可修改,可刪除

預設許可權:

  • 修改方法:
    臨時修改:umask 0022
    永久修改:組態檔:/etc/profile
    許可權掩碼的目的是為了保證新建檔案擁有預設許可權,一般不需要手工設定

特殊許可權:

  • 許可權型別:Set UID、Set GID、Sticky Bit
    Set UID:
    當檔案設定了setuid位後,任何能夠執行此檔案的使用者都有與檔案屬主相同的許可權,即使得任意使用者在執行該檔案時,都繫結了檔案屬主的許可權。例如,某個程式為root擁有,又設定了setuid位,那即使是一個普通使用者執行該程式,該程式的身份一樣是root的身份,可以存取所有隻有root可以存取的資源
    在這裡插入圖片描述

sudo許可權

  • 給普通使用者提權
    在這裡插入圖片描述

檔案系統屬性許可權

  • 系統檔案鎖
    在這裡插入圖片描述

chgrp:修改檔案所屬使用者組
chown:修改檔案擁有者

chown [-R] 賬戶名稱 檔案或目錄
chown [-R] 賬戶名稱:使用者組名稱 檔案或目錄

chmod:修改檔案的許可權,SUID、SGID、SBIT等的特性。

數位型別修改檔案許可權
chmod [-R] xyz 檔案或目錄
chmod 777 檔案或目錄

符號型別修改檔案許可權
u	g	o	a
+(加入)	-(移除)	=(設定)

範例:
chmod u=rwx,go=rx .bashrc

目錄的相關操作

. 代表此層目錄
.. 代表上一層目錄
- 代表前一個工作目錄
~ 代表目前使用者身份所在的家目錄
~account 代表account這個使用者的家目錄(account是個賬戶名稱)

第二部分 Linux檔案、目錄與磁碟格式(詳細看書)

第三部分 學習Shell

第9章 Vim程式編輯器

Vim:https://blog.csdn.net/qq_39578545/article/details/104848900

(1)Vim基本操作

vim三種模式:

  • 指令模式:vi開啟一個檔案就直接進入到指令模式
  • 編輯模式:輸入【i,I,A,R】
  • 命令模式:輸入【: / ?】

在這裡插入圖片描述

快捷鍵

nG	n為數位,移動到這個檔案的第n行。例如20G則會移動到這個檔案的第20行(可配合:set nu)
gg	移動到這個檔案的第一行,相當於1G(常用)
G	按G到最後一行

/word	向遊標之下尋找一個名稱為word的字串。例如要在檔案內搜尋vbird這個字串,就輸入 /vbird即可
?word	向遊標之上尋找一個字串名稱為word的字串
n	向下搜尋
N	向上搜尋

dd	刪除行
ndd	刪除指定行
d1G 刪除遊標到第一行的所有資料
dG	刪除遊標到最後一行的所有資料
yy	複製遊標所在的那一行
nyy n為數位。複製遊標所在向下20行,例如20yy則是複製20行(常用)
yG	複製遊標所在列到第一列的所有資料
p	貼上,遊標在20行,則在21行開始貼
P	貼上,遊標在20行,那麼原本的第20行會被推到變成30行
u	復原
ctrl + r 重做上一個動作

在這裡插入圖片描述

在這裡插入圖片描述


vim的暫存檔、救援回覆與開啟時的警告訊息
在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

(2)區塊選擇

區塊選擇(Visual Block),當我們按下 v 或者 V 或者 【ctrl + v】
在這裡插入圖片描述

(3)多檔案編輯

:r filename 來讀入某個檔案的內容
:n	編輯下一個檔案
:N	編輯上一個檔案
:files	列出目前這個vim的開啟的所有檔案

範例:將hosts內的前四列IP資料複製到/etc/hosts檔案內

  1. 透過【vim hosts /etc/hosts 】指令來使用一個vim開啟兩個檔案:
  2. 在vim中先使用 【:files】來列出編輯的檔案,然後按下【任意鍵】就會回到vim的一般指令模式中!
  3. 在第一行輸入 【4yy】複製4行
  4. 在vim的環境下輸入 【:n】會來到第二個編輯的檔案,亦即 /etc/hosts 內;
  5. 在/etc/hosts下按【G】到最後一行,再輸入【p】貼上;

(4)多視窗功能

在指令列模式輸入【:sp {filename}】,如果想要在新視窗啟動另一個檔案,就加入檔名,否則僅輸入【:sp】時,出現的則是同一個檔案在兩個視窗間。

可以利用【ctrl+w+↑】及【ctrl+w+↓】,在兩個視窗之間移動。

(5)vim環境設定與記錄:~/.vimrc,~/.viminfo

可以通過一般指令模式時輸入【:set all】來查閱所有設定引數。

整體vim的設定值一般是放置在 /etc/vimrc 這個檔案,不過,不建議修改。可以修改~/.vimrc這個檔案。

第四部分 Linux使用者管理(詳細看書)

第五部分 Linux系統管理員

第17章 認識系統服務(daemon)

systemd是一個啟動服務機制,早期是通過init進行管理。現在是systemd佔主流,init佔一小部分。

systemd的好處:

  • 平行處理所有服務,加速開機流程:
    舊的init啟動指令碼是【一項一項任務依序啟動】的模式,因此不相依的服務也是得要一個一個的等待。但目前我們的硬體主機系統與作業系統幾乎都支援多核心架構了,沒道理未相依的服務不能同時啟動啊!
    systemd就是可以讓所有的服務同時啟動,因此你會發現到,系統啟動的速度變快了!
  • 一經要求就響應的on-demand啟動方式:
    systemd全部就是僅有一隻systemd 服務搭配systemctl指令來處理,無須其他額外的指令來支援。不像systemV還要init,chkconfig,service…等等指令。此外,systemd由於常駐記憶體,因此任何要求(on-demand)都可以立即處理後續的daemon啟動的任務。
  • 服務相依性的自我檢查:
    由於systemd可以自定義服務相依性的檢查,因此如果B服務是架構在A服務上面啟動的,那當你在沒有啟動A服務的情況下僅手動啟動B服務時,systemd會自動幫你啟動A服務喔!這樣就可以免去管理員得要一項一項服務去分析的麻煩~(如果讀者不是新手,應該會有印象,當你沒有啟動網路,但卻啟動NIS/NFS時,那個開機時的timeout 甚至可達到10~30分鐘…)依daemon功能分類:
    systemd旗下管理的服務非常多,包山包海啦~為了釐清所有服務的功能,因此,首先systemd先定義所有的服務為一個服務單位(unit),並將該unit 歸類到不同的服務型別(type)去。舊的init僅分為stand alone與super daemon 實在不夠看,systemd將服務單位(unit)區分為service,socket,target,path,snapshot,timer等多種不同的型別(type),方便管理員的分類與記憶。
  • 將多個daemons集合成為一個群組:
    如同systemV的init 裡頭有個runlevel的特色,systemd亦將許多的功能集合成為一個所謂的target專案,這個專案主要在設計操作環境的建置,所以是集合了許多的daemons,亦即是執行某個target就是執行好多個daemon的意思!
  • 向下相容舊有的init 服務指令碼:
    基本上,systemd是可以相容於init的啟動指令碼的,因此,舊的init啟動指令碼也能夠透過systemd來管理,只是更進階的systemd功能就沒有辦法支援就是了。

雖然如此,不過systemd也是有些地方無法完全取代init的!包括:

  • 在runlevel的對應上,大概僅有runlevel1,3,5有對應到systemd的某些target型別而已,沒有全部對應;
  • 全部的systemd都用systemctl這個管理程式管理,而systemctl支援的語法有限制,不像/etc/init.d/daemon 就是純指令碼可以自定義引數,systemctl不可自定義引數;
  • 如果某個服務啟動是管理員自己手動執行啟動,而不是使用systemcl去啟動的(例如你自己手動輸入crond 以啟動crond服務),那麼systemd將無法偵測到該服務,而無法進一步管理。
    systemd啟動過程中,無法與管理員透過standard input傳入訊息!因此,自行撰寫systemd的啟動設定時,務必要取消互動機制~(連透過啟動時傳進的標準輸入訊息也要避免!)

systemd的組態檔放置目錄:
基本上,systemd將過去所謂的daemon執行指令碼通通稱為一個服務單位(unit),而每種服務單位依據功能來區分時,就分類為不同的型別(type)。基本的型別有包括系統服務、資料監聽與交換的插槽檔服務(socket)、儲存系統狀態的快照型別、提供不同類似執行等級分類的操作環境(target)等。

  • /usr/lib/systemd/system/:每個服務最主要的啟動指令碼設定,有點類似以前的/etc/init.d底下的檔案;
  • /run/systemd/system/:系統執行過程中所產生的服務指令碼,這些指令碼的優先序要比/usr/lib/systemd/system/高!
  • /etc/systemd/system/:管理員依據主機系統的需求所建立的執行指令碼,其實這個目錄有點像以前/etc/rc.d/rc5.d/Sxx 之類的功能!執行優先序又比/run/systemd/system/高

也就是說,到底系統開機會不會執行某些服務其實是看/etc/systemd/system/底下的設定,所以該目錄底下就是一大堆連結檔(如target)。而實際執行的systemd啟動指令碼組態檔,其實都是放置在/usr/lib/systemd/system/底下的喔!因此如果你想要修改某個服務啟動的設定,應該要去/usr/lib/systemd/system/底下修改才對!/etc/systemd/system/僅是連結到正確的執行指令碼組態檔而已。所以想要看執行指令碼設定,應該就得要到/usr/lib/systemd/system/底下去查閱才對!


systemd的unit型別分類說明
在這裡插入圖片描述
vsftpd 與crond 其實算是系統服務(service),而multi-user要算是執行環境相關的型別(target type)。根據這些擴充套件名的型別,我們大概可以找到幾種比較常見的systemd的服務型別如下:
在這裡插入圖片描述


systemd管理服務
系統上面有多少的服務存在?這個時候就得透過list-units(預設)list-unit-files來觀察了。
在這裡插入圖片描述
在這裡插入圖片描述


具體systemctl請看PDF。


第18章 紀錄檔檔案

ryslog紀錄檔管理https://blog.csdn.net/qq_39578545/article/details/105030690

1、登入檔紀錄檔檔案

  • /var/log/boot.log:開機的時候系統核心會去偵測與啟動硬體,接下來開始各種核心支援的功能啟動等。這些流程都會記錄在/var/log/boot.log裡面!不過這個檔案只會存在這次開機啟動的資訊,前次開機的資訊並不會被保留下來!
  • /var/log/cron:你的crontab有沒有實際被進行?進行過程有沒有發生錯誤?你的/etc/crontab是否撰寫正確?在這個登入檔內查詢看看。
  • /var/log/dmesg:記錄系統在開機的時候核心偵測過程所產生的各項資訊。由於CentOS預設將開機時核心的硬體偵測過程取消顯示,因此額外將資料記錄一份在這個檔案中;
  • /var/log/lastlog:可以記錄系統上面所有的賬號最近一次登入系統時的相關資訊
  • /var/log/maillog 或/var/log/mail/*:記錄郵件的往來資訊,其實主要是記錄postfix(SMTP協定提供者)與dovecot(POP3協定提供者)所產生的訊息啦。SMTP是發信所使用的通訊協定,POP3則是收信使用的通訊協定。postfix與dovecot 則分別是兩套達成通訊協定的軟體。
  • /var/log/messages:這個檔案相當的重要,幾乎系統發生的錯誤訊息(或者是重要的資訊)都會記錄在這個檔案中;如果系統發生莫名的錯誤時,這個檔案是一定要查閱的登入檔之一。
  • /var/log/secure:基本上,只要牽涉到了需要輸入賬號密碼]的軟體,那麼當登入時(不管登入正確或錯誤)都會被記錄在此檔案中。包括系統的login程式、圖形介面登入所使用的gdm程式、su,sudo等程式、還有網路聯機的ssh,telnet等程式,登入資訊都會被記載在這裡;
  • /var/log/wtmp,/var/log/faillog:這兩個檔案可以記錄正確登入系統者的帳戶資訊(wtmp)與錯誤登入時所使用的帳戶資訊(faillog)!我們在第十章談到的last就是讀取wtmp來顯示的,這對於追蹤一般賬號者的使用行為很有幫助!
  • /var/log/httpd/*,/var/log/samba/:
    不同的網路服務會使用它們自己的登入檔案來記載它們自己產生的各項訊息!上述的目錄內則是個別服務所制訂的登入檔。

2、logrotate紀錄檔輪轉

所謂的logrotate基本上,就是將舊的登入檔更改名稱,然後建立一個空的登入檔,如此一來,新的登入檔案將重新開始記錄,然後只要將舊的登入檔留下一陣子,嗯!那就可以達到將登入檔【輪轉】

  • systemd-journald.service:最主要的訊息收受者,由systemd提供的;
  • rsyslog.service:主要登入系統與網路等服務的訊息;
  • logrotate:主要在進行登入檔案的輪替功能。

使用systemd提供的journalctl紀錄檔管理
系統上所有經由systemd啟動的服務,如果再啟動或結束的過程中發生一些問題或者是正常的訊息,就會將該訊息由systemd-journald.service以二進位制的方式記錄下來(它的記錄主要都放置於記憶體中),之後再將這個訊息傳送給rsyslog.service做進一步的記載。

rsyslog.service的組態檔/etc/rsyslog.conf,這個檔案規定了【(1)什麼服務、(2)什麼等級訊息、(3)需要記錄在哪裡】。
在這裡插入圖片描述

訊息等級
在這裡插入圖片描述
在0(emerg)到6(info)的等級之間,等級數值越高代表越沒事。
在這裡插入圖片描述

rsyslog.conf語法練習
在這裡插入圖片描述

(1)登入檔的安全性設定

chattr +a,加入了這個屬性之後,你的/var/log/admin.log登入檔從此就僅能被增加,而不能被刪除,直到root以【chattr-a /var/log/admin.log】取消這個a的引數之後,才能被刪除或移動喔!
在這裡插入圖片描述
這個旗標最大的用處除了在保護你登入檔案的資料外,他還可以幫助你避免掉不小心寫入登入檔的狀況喔。要注意的是,當[你不小心「手動「更動過登入檔後,例如那個
/var/log/messages,你不小心用vi開啟他,離開卻下達:wq的引數!【】麼該檔案未來將不會再繼續進行登入動作!】這個問題真的很常發生!由於你以vi儲存了登入檔,則rsyslogd 會誤判為該檔案已被更動過,將導致rsyslogd不再寫入該檔案新的內容。

要讓該登入檔可以繼續寫入,你只要重新啟動rsyslogd.service即可。

不過,也因為這個+a的屬性讓該檔案無法被刪除與修改,所以當我們進行登入檔案輪替時
(logrotate),將會無法移動該登入檔的檔名。這個困擾雖然可以使用logrotate的組態檔來解決,但是,還是先將登入檔的+a旗標拿掉吧!

下面的chattr的解決方案有解決方案。


(2)登入檔伺服器的設定

讓某一部主機當成【登入檔案伺服器】,用他來記錄所有的十部Linux主機的資訊。

CentOS 7.x預設的rsyslogd本身就已經具有這個登入檔案伺服器的功能了,只是預設並沒有啟動該功能而已。
在這裡插入圖片描述
伺服器端設定:
在這裡插入圖片描述
使用者端設定:
在這裡插入圖片描述
再重新啟動rsyslog.service後,在主機上面的登入檔案/var/log/admin.log當中,每一行的【主機名】就會顯示來自不同主機的資訊。


(3)登入檔的輪替(logrotate)

特別留意:rsyslogd利用的是daemon的方式來啟動的,當有需求的時候立刻就會被執行的,但是logrotate卻是在規定的時間到了之後才來進行登入檔的輪替,所以這個logrotate程式是掛載cron底下進行,可以通過/etc/cron.daily/logrotate記錄了每天要進行的登入檔輪替的行為,工作原理如下:
在這裡插入圖片描述
檢視一下/etc/logrotate.conf檔案
在這裡插入圖片描述
以/etc/logrotate.d/syslog這個輪替rsyslog.service服務的檔案。
在這裡插入圖片描述

(4)chattr的解決方案

假設我們有針對/var/log/messages 這個檔案增加chattr+a的屬性時,依據 logrotate的工作原理,我們知道,這個/var/log/messages將會被更名成為/var/log/messages.1才是。但是由於加上這個+a的引數啊,所以更名是不可能成功的!那怎麼辦呢?呵呵!就利用prerotate與postrotate來進行登入檔輪替前、後所需要作的動作啊!!!
在這裡插入圖片描述
在這裡插入圖片描述
先給他去掉a這個屬性,讓登入檔案/var/log/mesages可以進行輪替的動作,然後執行了輪替之後,再給他加入這個屬性!請特別留意的是,那個/bin/kill -HUP…的意義,這一行的目的在於將系統的rsyslogd重新以其引數檔(rsyslog.conf)的資料讀入一次!也可以想成是reload的意思啦!由於我們建立了一個新的空的記錄檔案,如果不執行此一行來重新啟動服務的話,那麼記錄的時候將會發生錯誤!!!


(5)測試logrotate

在這裡插入圖片描述
在這裡插入圖片描述
上面那個-f具有【強制執行】的意思,如果一切的設定都沒有問題的話,那麼理論上,你的/var/log這個目錄就會起變化囉!而且應該不會出現錯誤訊息才對!

由於logrotate的工作已經加入crontab裡頭了!所以現在每天系統都會自動的給他檢視logrotate。只是要注意一下那個/var/log/messages裡頭是否常常有類似底下的字眼:
Aug 2001:45:34 study rsyslogd:[origin software="rsyslogd"swVersion="7.4.7"x-pid=「2145」
x-info=「http://ww.rsyslog.com」]rsyslogd was HUPed這說明的是rsyslogd重新啟動的時間啦(就是因為/etc/logrotate.d/syslog的設定之緣故!)

(5)自定義登入檔案的輪替功能

假設前提是這樣的,前一小節當中,假設你已經建立了/var/log/admin.log這個檔案,現在,你想要將該檔案加上+a這個隱藏標籤,而且設定底下的相關資訊:

  • 登入檔輪替一個月進行一次;
  • 該登入檔若大於10MB時,則主動進行輪替,不需要考慮一個月的期限;
  • 儲存五個備份檔案;
  • 備份檔案需要壓縮

在這裡插入圖片描述
在這裡插入圖片描述

(5)使用journalctl觀察登入資訊

在這裡插入圖片描述
在這裡插入圖片描述

(6)儲存journal的方式

再強調一次,這個systemd-journald.servicd的訊息是不會放到下一次開機後的,所以,重新啟動後,那之前的記錄通通會遺失。雖然我們大概都有啟動rsyslogd這個服務來進行後續的登入檔放置,不過如果你比較喜歡journalctl的存取方式,那麼可以將這些資料儲存下來喔!

基本上,systemd-journald.service的組態檔主要參考/etc/systemd/journald.conf的內容,詳細的引數你可以參考man 5 journald.conf的資料。
只是如果想要儲存你的journalctl所讀取的登入檔,那麼就得要建立一個/var/log/journal的目錄,並且處理一下該目錄的許可權,那麼未來重新啟動systemd-journald.service之後,紀錄檔登入檔案就會主動的複製一份到/var/log/journal目錄下囉!

在這裡插入圖片描述

(7)logger指令的應用

第19章 啟動流程

詳細版:

  1. 載入BIOS的硬體資訊與進行自我測試,並依據設定取得第一個可開機的裝置:
  2. 讀取並執行第一個開機裝置內MBR的boot Loader(亦即是grub2.spfdisk等程式):
  3. 依據boot loader的設定載入Kernel,Kernel會開始偵測硬體與載入驅動程式:
  4. 在硬體驅動成功後,Kernel會主動呼叫 systemd程式,並以default target 流程開機:
    • systemd 執行sysinit target 初始化系統及basic.target 準備作業系統;
    • systemd 啟動multi-user target 下的本機與伺服器服務:
    • systemd 執行multi-user target 下的/etc/rc.d/rc.local檔案:
    • systemd 執行multi-user target 下的getty.target 及登入服務:
    • systemd 執行graphical需要的服務

簡述版:
1、主機加電自檢,載入 BIOS 硬體資訊,BIOS進行系統檢測。
2、讀取 MBR 的引導檔案(GRUB、LILO)。
3、引導 Linux 核心。
4、由核心啟動執行第一個程序 init (程序號永遠為 1 )。(會去讀取inittab檔案,執行rc.sysinit,,rc檔案 /etc/rc.d/rc.local等指令碼)
5、進入相應的執行級別
6、執行終端,輸入使用者名稱和密碼。

1、啟動過程的問題解決

(1)忘記root密碼的解決之道

(1)第一種方法
進入救援 rescue 模式,並且掛載 / 目錄,重新設定一下 root 密碼。

(2)第二種方法
但是在新版的systemd的管理機制中,預設的rescue模式是無法直接取得root許可權,還是要使用root的密碼才能夠登入 rescue環境。這下有什麼解決方案?通過 【rd.break】的核心引數來處理。只是需要注意的是,rd.break是在Ram Disk裡面的作業系統狀態,因此你不能直接取得原本的linux系統操作環境。所以,還需要chroot的支援!更由於SELinux的問題,你可能還得要加上某些特殊的流程才能順利的搞定root 密碼的救援喔!

現在就讓我們來實作一下吧!(1)按下systemctl reboot 來重新啟動,(2)進入到開機畫面,在可以開機的選單上按下e來進入編輯模式,然後就在linux16的那個核心專案上面使用這個引數來處理:
在這裡插入圖片描述
改完之後按下[ctrl]+x開始開機,開機完成後螢幕會出現如下的類似畫面,此時請注意,你應該是在RAMDisk的環境,並不是原本的環境,因此根目錄底下的東西跟你原本的系統無關喔!而且,你的系統應該會被掛載到/sysroot目錄下,因此,你得要這樣作:

Ctrl+x同上但再按一次會從新回到原位置

在這裡插入圖片描述

  • chroot目錄:代表將你的根目錄暫時】切換到chroot 之後所接的目錄。因此,以上表為例,那個/sysroot將會被暫時作為根目錄,而我們知道那個目錄其實就是最原先的系統根目錄,所以你當然就能夠用來處理你的檔案系統與相關的賬號管理囉!
  • 為何需要/.autorelabel:在rd.break的RAM Disk環境下,系統是沒有SELinux的,而你剛剛更改了
    /etc/shadow(因為改密碼啊!),所以這個檔案的SELinux安全本文的特性將會被取消喔!如果你沒有讓系統於開機時自動的回覆SELinux的安全本文,你的系統將產生[無法登入】的問題(在SELinux為Enforcing的模式下!)加上/.autorelabel就是要讓系統在開機的時候自動的使用預設的SELinux type重新寫入SELinux安全本文到每個檔案去!

不過加上/.autorelabel之後,系統在開機就會重新寫入SELinux的type到每個檔案,因此會花不少的時間喔!如果你不想要花太多時間,還有個方法可以處理:

  • 在rd.break模式下,修改完root 密碼後,將/etc/selinux/config 內的SELinux型別改為permissive
  • 重新啟動後,使用root的身份下達 restorecon -Rv /etc 僅修改/etc底下的檔案;
  • 重新修改/etc/selinux/config 改回enforcing,然後 setenforce 1 即可!

在這裡插入圖片描述

(2) 因檔案系統錯誤而無法啟動

如果因為設定錯誤導致無法開機時,要怎麼辦啊?這就更簡單了!最容易出錯的設定而導致無法順利開機的步驟,通常就是/etc/fstab這個檔案了,尤其是使用者在實作 Quota/LVM/RAID 時,最容易寫錯引數,又沒有經過mount -a來測試掛載,就立刻直接重新啟動,真要命!無法開機成功怎麼辦?

這種情況的問題大多如下面的畫面所示:
在這裡插入圖片描述

看到最後兩行,他說可以輸入root的密碼繼續加以救援喔!那請輸入root的密碼來取得bash並以mount -o remount,rw / 將根目錄掛載成可擦寫後,繼續處理吧!其實會造成上述畫面可能的原因除了
/etc/fstab編輯錯誤之外,如果你曾經不正常關機後,也可能導致檔案系統不一致(Inconsistent)的情況,也有可能會出現相同的問題啊!如果是磁區錯亂的情況,請看到上圖中的第二行處,fsck告知其實是/dev/md0出錯,此時你就應該要利用fsck.ext3去檢測/dev/md0才是!等到系統發現錯誤,並且出現 【clear[Y/N] 】時,輸入 y 吧!

第22章 軟體安裝RPM、SRPM(rpmbuild)與YUM

RPM

RPM安裝

rpm -i /rp.pppoe-3.11.rpm
-i: install安裝的意思
-v: 檢視更詳細的安裝資訊
-h: 顯示安裝進度

--prefix 新路徑
--nodeps // 強制安裝
--test  //測試安裝

RPM查詢

rpm -qa
rpm -qf 檔名 // 找出該檔案屬於哪一個已安裝的軟體

YUM

YUM規則
在這裡插入圖片描述

YUM設定
在這裡插入圖片描述

在這裡插入圖片描述
YUM測試
在這裡插入圖片描述
修改軟體庫產生的問題與解決之道
由於我們是修改系統預設的組態檔,事實上,我們應該要在/etc/yum.repos.d/底下新建一個檔案,該擴充套件名必須是.repo才行!但因為我們使用的是指定特定的映像站臺,而不是其他軟體開發商提供的軟體庫,因此才修改系統預設組態檔。但是可能由於使用的軟體庫版本有新舊之分,你得要知道,yum會先下載軟體庫的清單到本機的/var/cache/yum裡面去!那我們修改了網址卻沒有修改軟體庫名稱(中括號內的文字),可能就會造成本機的列表與yum伺服器的列表不同步,此時就會出現無法更新的問題了!

那怎麼辦啊?很簡單,就清除掉本機上面的舊資料即可!需要手動處理嗎?不需要的,透過yum的clean專案來處理即可!

yum clean [packages|headers|all]

選項與引數:
packages:將已下載的軟體檔案刪除
headers:將下載的軟體檔案頭刪除
all:將所有軟體庫資料都刪除!

YUM的軟體群組功能
在這裡插入圖片描述

SRPM(rpmbuild)❤

路徑解釋
/root/rpmbuild/SPECS軟體的組態檔,例如這個軟體的資訊引數、設定專案等
/root/rpmbuild/SOURCES放置的是該軟體的原始檔案(*.tar.gz的檔案)以及config這個組態檔
/root/rpmbuild/BUILD在編譯的過程中,有些暫存的資料都會放置在這個目錄當中
/root/rpmbuild/RPMS經過順利的編譯成功後,將打包完成的檔案放置在這個目錄當中。裡頭有包含了x86_64,noarch等等的次目錄
/root/rpmbuild/SRPMS與RPMS內相似的,這裡放置的就是SRPM封裝的檔案,有時候想將你的軟體用SRPM的方式釋出時,你的SRPM檔案就會放置在這個目錄中。

組態檔的主要內容(*.spec)
編譯需要的步驟大抵就是/configure,make,make check,make install 等,那這些動作寫入就在SPECS目錄中。
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

要注意到的是ntp.sepc這個檔案,這是主要的將SRPM編譯成RPM的組態檔,他的基本規則可以這樣看:

  1. 整個檔案的開頭以Summary為開始,這部份的設定都是最基礎的說明內容;
  2. 然後每個不同的段落之間,都以%來做為開頭,例如%prep與%install等;

系統整體資訊方面

Name:                  myapp <===軟體包的名字(後面會用到)
Version:               0.1.0 <===軟體包的版本(後面會用到)
Release:               1%{?dist} <===釋出序號
Summary:               my first rpm <===軟體包的摘要資訊
Group:                 <===軟體包的安裝分類,參見/usr/share/doc/rpm-4.x.x/GROUPS這個檔案
License:               GPL <===軟體的授權方式
URL:                   <===這裡本來寫原始碼包的下載路徑或者自己的部落格地址或者公司網址之類
Source0:               %{name}-%{version}.tar.gz <===原始碼包的名稱(預設時rpmbuid回到SOURCES目錄中去找),這裡的name和version就是前兩行定義的值。如果有其他設定或指令碼則依次用Source1、Source2等等往後增加即可。
BuildRoot:             %{_topdir}/BUILDROOT <=== 這是make install時使用的「虛擬」根目錄,最終制作rpm安裝包的檔案就來自這裡。
BuildRequires:         <=== 在本機編譯rpm包時需要的輔助工具,以逗號分隔。假如,要求編譯myapp時,gcc的版本至少為4.4.2,則可以寫成gcc >=4.2.2。還有其他依賴的話則以逗號分別繼續寫道後面。
Requires:              <=== 編譯好的rpm軟體在其他機器上安裝時,需要依賴的其他軟體包,也以逗號分隔,有版本需求的可以
%description           <=== 軟體包的詳細說明資訊,但最多隻能有80個英文字元

在這裡插入圖片描述
在這裡插入圖片描述
根據上面的設定,最終的檔名就會是{Name}-{Version}-{Release}.{Arch}.rpm的樣式,以我們上面的設定來說,檔名應該會是ntp-4.2.6p5-20.vbird.x86_64.rpm

在這裡插入圖片描述
在這裡插入圖片描述
SRPM的編譯指令(-ba/-bb)

rpmbuild -ba ntp.spec <== 編譯並同時產生RPM與SRPM檔案
rpmbuild -bb ntp.spec <== 僅編譯成RPM檔案

系統執行的過程:

  1. 先進入到BUILD這個目錄中,即是:/root/rpmbuild/BUILD這個目錄。
  2. 依照*.spec檔案內的Name與Version定義出工作的目錄名稱,那麼系統就會在BUILD目錄中先刪除ntp-4.2.6p5的目錄,再重新建立一個ntp-4.2.6p5的目錄,並進入該目錄。
  3. 在新建的目錄裡面,針對SOURCES目錄下的來原始檔,也就是*.spec裡面的Source設定的那個檔案,以tar進行解壓縮,以我們這個例子來說,則會在/root/rpmbuild/BUILD/ntp-4.2.6p5當中,將/root/rpmbuild/SOURCES/ntp-* 等等多個原始碼檔案進行解壓縮。
  4. 再來開始%build%install的設定與編譯
  5. 最後將完成打包的檔案給他放置,/root/rpmbuild/RPMS/x86_64或noarch,根據系統版本而定。
    在這裡插入圖片描述

打包自己軟體的範例

mkdir -pv ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} 

(1)製作原始碼檔案tarball產生

  • main-0.1.tar.gz放在/root/rpmbuild/SOURCES/
  • main_0.1_to_0.2_patch 放在/root/rpmbuild/SOURCES/
  • main.spec 自行撰寫放在/root/rpmbuild/SPECS/
    在這裡插入圖片描述

(2)建立*.spec的組態檔
P993
在這裡插入圖片描述

Name:		main
Version:	0.1
Release:	1%{?dist}
Summary:	Show sin and cos value

Group:		Scientific Support
License:	GPLv2
URL:		http://linux.vbird.org/
Source0:	main-0.1.tgz
Patch0:     main_0.1_to_0.2.patch
# 這兩個檔名要正確

%description
this package will let you input your name and calculate sin cos value

%prep
%setup -q
%patch0 -p1

%build
make clean main

%install
mkdir -p %{buildroot}/usr/local/bin
install -m 755 main %{buildroot}/usr/local/bin

%files
/usr/local/bin/main

%changelog

(3)編譯成為RPM與SRPM

# rpmbuild -ba main.spec

(4)安裝測試查詢
在這裡插入圖片描述

範例2:https://blog.51cto.com/laoguang/1103628