讀書筆記-linux私房菜

linux

《Linux私房菜》閱讀筆記整理

chapter 0

計算機的五大單元 - 輸入 輸出 CPU內部的控制單元和算數邏輯單元 內存javascript

CPU

central processing unitphp

主要做用,管理和運算 (算數邏輯單元,控制單元) - 前者負責程序運算和邏輯判斷 後者負責協調各個組件與各個單元之間的工做html

CPU的重點在與 運算和判斷,這些數據來自於內存. 內存則從輸入單元傳輸進來,CPU處理完畢以後先傳遞給內存,再從內存傳輸到輸出單元java

目前主流的CPU是雙核以上,本來的單核是指僅有一個運算單元,多核是指在一個CPU殼子裏裝了多個運算內核node

CPU 的性能對比

1 內部的微指令集linux

2 CPU的頻率 -- 每秒CPU的工做次數 這個數值越高 表明單位時間內能夠作更多的事情webpack

好比某款CPU頻率 3GHZ 則其每秒可進行 3 x 10的9次方 工做c++

外頻 倍頻

爲了加速計算速度,CPU開發商就在CPU內部加上一個加速功能git

外頻 : CPU與外部組件進行數據傳輸,運算的頻率程序員

倍頻: CPU內部用來加速性能的一個倍數

二者相乘纔是CPU的頻率

  • 超頻 -- 有人喜歡將CPU的倍頻或者外頻經過主板的設定更改成較高頻率,但由於CPU的倍頻通常在出廠的時候會被肯定沒法更改,因此通常修改的是外頻

好比 3GHZ的CPU設置爲超頻 能夠將外頻 333HZ 調整到 400 MHZ 這樣主板各個組件運行頻率增高 CPU能夠到達 3.6GHZ 可是可能形成死機

軟件程序運行

設計出一種人類能看懂的語言,而後創造一種「編譯器」來將人類寫的程序語言轉換爲機器語言,常見的編譯器語言,c c++

操做系統

一組程序,用來管理計算機全部活動以及驅動系統中全部硬件

讓CPU開始判斷邏輯與運算數值,讓內存開始加載數據

以上就是操做系統的內核

硬件由內核管理,那想要去開發軟件,就須要去參考這個內核的先關功能,所以操做系統提供了一組開發接口出來

1 操做系統的內核是參考硬件規格寫的,因此同一個操做系統不能在不一樣的硬件架構下運行

2 應用程序的開發是參考操做系統提供的開發接口,因此該應用程序只能在該操做系統中運行

// 直接操做一個硬件設施
音箱 -- 請播放音樂 「黑白格」

// 使用內核
function play (music) {
  const target = '音箱'
  target.播放音樂(music)
}

好比,window的軟件不能再Linux中運行

內核

內核主要在於管理硬件,提供合理的資源分配,好比CPU資源 內存使用資源等

  • 程序管理

多任務環境 --- 一部計算機可能同時有不少工做在等待CPU運算處理,內核須要控制這些工做,讓CPU作有效分配

良好的CPU調度機制(CPU先讓那個工做開始運行),能夠加快總體系統性能

  • 內存管理

控制系統的內存

系統全部的程序代碼和數據都必需要先放在內存裏

  • 文件系統管理

好比數據輸入輸出 I/O

若是內核不認識某個文件系統,則沒法使用此格式的文件

  • 設備驅動

內存

CPU讀取的數據都來自與內存,無論是軟件程序仍是數據,都要先讀入內存才能夠被使用

我的計算機的內存爲

內存容量也很重要,由於數據要先存入內存中

通常內存越大 系統越快,由於不用釋放內存內部數據

硬盤

存儲數據,實際的數據是寫在具備磁性物質的盤片上

linux vs unix

chapter 1

什麼是Linux

linux 就是一套操做系統

計算機由一堆硬件設備組成,操做系統用戶管理控制這些硬件資源(內核)

不止如此,爲了程序員能夠更好的開發軟件,操做系統還提供了一組系統調用接口

Linux 提供了一個完整的操做系統中,最底層的硬件控制和資源管理的完整架構,這個是沿用Unix而來的,至關穩定且強大

Linux distributions

linux 是操做系統最底層的內核以及其提供的內核管理工具,任何均可以獲取源碼並執行這個內核程序

隨着Linux使用者逐漸增多,能夠在Linux上運行的軟件也愈來愈多,Linux + 各類軟件 就能夠是一個至關完整的操做系統

爲了讓用戶能夠接觸到Linux,有人將 Linux 與可運行的軟件集成起來,加上 一個可讓用戶以光盤或者網絡直接安裝或者管理Linux系統,咱們稱這一整套 可徹底安裝的系統爲 Linux distribution --- 可徹底安裝套件

  • 常見的幾個 Linux distribution

red hat - 紅帽子

ubuntu -- 無班圖

centos

  • Linux distribution 使用的都是 www.kernel.org 中提供的Linux內核,各家使用的軟件大同小異,最大的差異在於軟件的安裝模式
  • 查看當前是什麼 distribution
lsb_release -a

chapter 3

每個組件或者設備在Linux下都是一個文件

磁盤

主要有 盤片 機械手臂 主軸馬達組成

分區

最簡單的分區: 區分根目錄 與內存交換空間 swap 便可

稍微麻煩一點:將一些讀寫頻繁的重要目錄,與根目錄獨立出來,好比 /, /usr, /var 等

chapter4

內存交換空間是指?

當有數據被存放在物理內存中,可是這些數據不是常被CPU所取用,那麼這些不常被使用的程序將會被丟到硬盤的swap交換空間中,而將速度較快的物理內存空間釋放出來給真正須要的程序使用

因此若是系統不忙,內存又打,就不須要swap了

chapter 5

基礎

命令的格式

commond [option]
  • 區分大小寫
  • 按下enter以後開始執行命令

一些簡單的命令

命令 含義
date 獲取日期
cal 獲取日曆
bc 進入計算器模式
  • cal

只是輸入 cal 是展現當前月份的日曆

cal // 當前月份
cal 2018 // 2018的全部月
cal 8 2018 // 2018 8月
  • bc 進入計算器模式

輸入 quit 而後回車 能夠自動退出計算器模式


重要的按鍵

  • tab 命令補齊 和 文件名補齊
  • ctr + c 終止當前命令

Linux在線求助 man page

好比想查看關於date 命令的一些信息

man date

man date

看下第一行這裏是個 DATE(1)

1

這裏的數字含義是 (這裏列幾個常見的)

數字 含義
1 用戶在shell環境中可操做的命令或者更可執行的文件
4 設備文件
5 配置文件或者是某些文件的格式
8 系統管理員可用的管理命令

Linux在線求助 info page

另一種在線求助命令 info page

基礎命令

關機 shutdown

數據同步寫入硬盤 sync

重啓 reboot halt poweroff

數據在計算機中運行的模式: 全部的數據都得要被讀入內存後纔可以被CPU所處理,可是數據又經常須要由內存寫回硬盤當中(例如儲存的動做)。 因爲硬盤的速度太慢(相對於內存來講),若是經常讓數據在內存與硬盤中來回寫入/讀出,系統的效能就不會太好

所以在Linux系統中,爲了加快數據的讀取速度,因此在默認的狀況中, 某些已經加載內存中的數據將不會直接被寫回硬盤,而是先緩存在內存當中,如此一來, 若是一個數據被你重複的改寫,那麼因爲他還沒有被寫入硬盤中,所以能夠直接由內存當中讀取出來, 在速度上必定是快上至關多的!

不過,如此一來也形成些許的困擾,那就是萬一你的系統由於某些特殊狀況形成不正常關機 (例如停電或者是不當心踢到power)時,因爲數據還沒有被寫入硬盤當中,會形成數據不正常啦! 那要怎麼辦呢?這個時候就須要sync這個命令來進行數據的寫入動做啦! 直接在文字接口下輸入sync,那麼在內存中還沒有被升級的數據,就會被寫入硬盤中!因此,這個命令在系統關機或從新啓動以前,最好多運行幾回

目前的 shutdown/reboot/halt 等等命令均已經在關機前進行了 sync 命令

chapter 6

文件權限與目錄配置

三種身份

文件全部者、用戶組、其餘人

身份

系統中全部的賬號與通常身份使用者,以及root的相關信息, 都是記錄在/etc/passwd文件中,每一個人的密碼則是記錄在/etc/shadow文件中,此外,全部的組羣名稱記錄在/etc/group文件中

  • 用戶
Linux系統是一個多用戶多任務的分時操做系統,任何一個要使用系統資源的用戶,都必須首先向系統管理員申請一個帳號,而後以這個帳號的身份進入系統
  • 用戶組
每一個用戶都有一個用戶組,系統能夠對一個用戶組中的全部用戶進行集中管理。不一樣Linux 系統對用戶組的規定有所不一樣,如Linux下的用戶屬於與它同名的用戶組,這個用戶組在建立用戶時同時建立

ls -al 查看當前目錄下文件的信息

ls 顯示文件的文件名和相關屬性

al 列出文件詳細的權限的屬性

-rw-r--r--   1 zhengzaijiazai  staff       66  4 25 10:21 .gitignore
drwxr-xr-x   2 zhengzaijiazai  staff       68  4 25 11:32 dist
  • drwxr-xr-x

rwx

d rwx r-x r-x

按照 1 3 3 3 的格式進行拆分

命令 含義
d 第一個字符 表明這個是目錄 文件 或者 連接文件等
rwx 文件全部者的權限
r-x 文件同用戶組的權限
r-x 其餘非本用戶的權限

r (read)可讀 w (write) 可寫 x (execute)可執行

文件權限的意義

對於文件

r 表明是否能查看文件的內容
w 表明可否對文件的內容進行操做,可是不能刪除文件
x 表明可否被系統執行

對於目錄

目錄的主要內容是記錄文件名列表

r 表示能夠讀取目錄結構列表

w 表示具備更改目錄列表的權限

w權限對於文件的含義
建立新的文件與目錄
刪除文件和目錄(無論文件權限)
將已存在的文件與目錄重命名
移動文件,目錄位置

總而言之,目錄的w權限與該目錄下的文件名變更有關係

x 表示用戶可否進入目錄 好比cd 進入此目錄


test time

有一個目錄權限爲

drwxr--r-- 3 root root .......

當前系統帳號爲 userA userA不屬於root組 那麼 userA 對於這個帳戶有什麼權限, 能切換到此目錄中嗎

  • answer

userA 具備 讀的權限

而進行目錄切換是須要X的權限 因此不能夠切換到此目錄


修改文件的屬性、權限

命令 含義
chgrp xxx filename 改變文件所屬用戶組
chown xxx filename 改變文件全部者
chmod xxx filename 改變文件的權限

chgrp (change group)

要改的那個組必須在 /etc/group 中存在 不然會報錯

chgrp read.md groupB

chown (change owner)

要改的那個用戶必須在 /etc/passwd 中有記錄 不然會報錯

chown read.md userB

chown

chmod 改變權限

  • 使用分數

使用分數也能夠表明權限

命令 分數
r 4
w 2
x 1

rwx 7
rw- 6
r-x 5

  • 使用符號類型

有三種身份,就用 u g o 表明三種身份的權限

身份 字符
用戶 u
用戶組 g
其餘人 o
全部身份 a
命令 含義
+ 增長
- 減去
= 設置

好比 須要設置一個文件的權限爲 -rwxr-xr-x

則u 爲rwx g/o 爲 r-x

chmod u=rwx,go=rx readme.md
// 若是是給每一身份增長 w 權限
chmod a+w read.md

文件種類

任何設備都是文件

使用 ls -l 中第一個字符就是文件種類

分類

  • 普通文件文件

    ls -al 所顯示出來的屬性方面,第一個字符爲 [ - ],例如 [-rwxrwxrwx ]。另外,依照文件的內容,又大略能夠分爲:純文本 二進制文件 數據格式文件

  • 目錄
  • 連接文件

好比: 快捷方式

  • 設備與設備文件

文件擴展名

與 window中的有很大不一樣

在Windows底下, 能被執行的文件擴展名一般是 .com .exe .bat等等,而在Linux底下,只要你的權限當中具備x的話,例如[ -rwx-r-xr-x ] 即表明這個文件能夠被執行

一般咱們仍是會以適當的擴展名來表示該文件是什麼種類的。底下有數種經常使用的擴展名:

1 .sh : 腳本或批處理文件 (scripts),由於批處理文件爲使用shell寫成的,因此擴展名就編成 .sh ;

2 .Z, .tar, .zip : 通過打包的壓縮文件。這是由於壓縮軟件分別爲 gunzip, tar 等等的,因爲不一樣的壓縮軟件,而取其相關的擴展名

3 .html, .php:網頁相關文件,分別表明 HTML 語法與 PHP 語法的網頁文件

基本上,Linux系統上的文件名真的只是讓你瞭解該文件可能的用途而已, 真正的執行與否仍然須要權限的規範才行

例如雖然有一個文件爲可執行文件, 如常見的/bin/ls這個顯示文件屬性的指令,不過,若是這個文件的權限被修改爲沒法執行時, 那麼ls就變成不能執行

目錄配置

標準 FHS

爲何每套Linux distributions他們的配置文件啊、執行文件啊、每一個目錄內放置的咚咚啊,其實都差很少? 原來是有一套標準依據的

Linux來開發產品或distributions的社羣/公司與我的實在太多了,若是每個人都按照本身的標準去配置文件目錄,可能有管理上的困擾

FHS 用於規範每一個特定目錄下應該要放置什麼數據

FHS針對目錄樹定義了三個目錄下應該放置什麼數據

目錄 含義
/ (root 根目錄) 與開機系統有關係
/usr 與軟件的安裝、執行有關係
/var 與系統運做過程有關係

usr (UNIX Software Resource)Unix操做系統軟件資源

FHS 定義(/)根目錄下須要有如下目錄

目錄 文件內容
/bin 執行文件,在/bin 下的命令 能夠被root和通常帳號使用,好比 cat cp等
/etc 系統主要配置文件,例如帳號密碼文件,何種服務的啓示文件
/tmp 正在執行的程序放置文件的地方 FHS建議在開機時將 /tmp下的數據刪除

/usr

是系統默認的軟件安裝目錄

下面比較常見的目錄

目錄 文件內容
/bin 用戶可以使用的命令

/var

在系統安裝以後,會慢慢佔用硬盤容量


Q: 請問在 /bin 與 /usr/bin 有什麼不一樣

A:

/bin是系統的一些指令

bin爲binary的簡寫主要放置一些系統的必備執行檔例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等

/usr/bin 是你在後期安裝的一些軟件的運行腳本

主要放置一些應用軟體工具的必備執行檔例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 gzip、htpasswd、kfm、ktop、last、less、locale、m四、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等


絕對路徑與相對路徑

  • 絕對路徑

由根目錄開始寫起的文件名或者目錄

  • 相對路徑

相對於當前路徑

~ 表明當前用戶的家目錄 或者 使用cd 回車 也能夠進入

/ 表明根目錄

chapter 7 目錄相關

特殊的目錄

標誌 含義
. 本層目錄
.. 上一層目錄
- 前一個工做目錄

Q: 請問在Linux的根目錄,有沒有上層目錄 (..) 的存在

A:

用普通用戶身份看下

dir

用root身份看一下

dir


操做文件與目錄

命令 含義
cd 切換目錄 change directory
pwd 顯示當前目錄
mkdir 建立新目錄
rmdir 刪除空目錄
cp 複製
mv 移動 重命名文件與目錄
  • 建立目錄 mkdir

mkdir 只能一層一層的建立目錄, 如何一次性建立多層目錄 -- 藉助 -p 參數

mkdir -p webpack/w1-code/dist
  • 刪除目錄
rmdir config

只能刪除一個空目錄

若是要強制刪除一個非空目錄及它下面的所有

rm -r node_modules
  • 查看目錄
ls -a // 顯示所有,連同隱藏的文件
  • mv
// 將某一個文件移動到文件夾中
mv mian.js newdir
// 重命名文件夾
mv oldDir newdir
  • cp 複製

複製文件須要有 r (可讀) 權限

// 複製index 文件到 當前位置
cp ./config/index.js .

默認條件中,cp的源文件與目的文件權限不一樣,目的文件的全部者是命令操做者自己

查閱文件內容

file 查詢文件類型

判斷文件是二進制文件?數據文件?

which

查詢命令所在的文件

which ifconfig

which 默認查找的是 PATH 內的目錄

cat (Concatenate 連續)

命令 含義
cat 查看內容
cat -n 查看內容 顯示行號
cat -b 查看內容 顯示行號 【空白部分不算行號】

nl 添加行號打印

nl 能夠將輸出的內容自動加上行號 默認結果與cat -n有點相似

nl

  • nl [-bnw] filename
-b 命令 含義
a 空行也添加行號
t 空行不添加行號
-n 命令 含義
ln 行號在左側顯示
rn 行號在右側顯示 不加0
rz 行號在右側顯示 加0
nl index.js

nl -b a index.js 空行也添加行號

more

前面提到的nl cat 是一次性將全部內容展現到命令行 more 則是 有翻頁功能

more index.js
-n 命令 含義
空格 向下翻一頁
enter 或者 向下鍵 向下滾動一行
q 退出顯示
  • 查找功能

按下 / 而後輸入 要查找的字符 [可是沒有發現有任何高亮提示]

less

less 的用法要比more 增長了向上翻頁功能

less index.js
  • 查找功能

按下 / 而後輸入 要查找的字符 [向下查詢]
按下 ? 而後輸入 要查找的字符 [向上查詢]

選擇數據 head tail

  • head 從前面開始展現

選取數據展現幾行

head [-n number] filename

number 表示展現幾行 默認展現前10行

  • tail 從後面開始展現
tail [-n number] filename

number 表示展現幾行 默認展現最後10行


think

獲取第 100 到 120 行

cat filename | head -n 120 | tail -n +100

從 100 行開始 顯示 50行

cat filename | tail -n +100 | head -n 50

tail -n +100:從100行開始顯示,顯示100行之後的


文件的權限預設 umask

當新建一個文件時,它的默認權限和umask有關係

umask是用來指定當前用戶在新建目錄或文件時的權限預設值,具體來講,umask值只是一個掩碼,它從建立文件時的默認權限中掩去對應位置的權限

umask

0022 以數字形式表示權限

能夠看到這裏有四組權限,第一組是特殊權限使用的,咱們平時只須要後面三個就能夠了

u=rwx 以符號類型表示權限

在默認權限的屬性,文件和目錄是不一樣的

  • 用戶建立通常文件,則默認取消可執行權限,即666(rw-rw-rw-)
  • 用戶建立目錄文件,因爲x與是否能夠進入此目錄有關,所以默認開放全部權限,即777(rwxrwxrwx)

think

Q: 假設用戶的umask是 003 則當其新建一個文件或者文件夾 的權限是什麼

A: 也就是去掉的權限是 other的 寫 w 與 x

文件 rw-rw-r--

文件夾 rwxrxwr--


設置 umask

umask 002

查詢文件 find

find [指定路徑] [指定條件] [指定動做]

默認會查找當前目錄及子目錄,把查找結果輸出到屏幕上

find

touch

關於文件的三個時間參數

modification time (mtime): 當該文件的『內容數據』變動時,就會升級這個時間!內容數據指的是文件的內容,而不是文件的屬性或權限

status time (ctime):當該文件的『狀態 (status)』改變時,就會升級這個時間,舉例來講,像是權限與屬性被更改了,都會升級這個時間

access time (atime):當『該文件的內容被取用』時,就會升級這個讀取時間 (access)。舉例來講,咱們使用 cat 去讀取 /etc/man.config , 就會升級該文件的 atime

在默認的狀況下,ls 顯示出來的是該文件的 mtime ,也就是這個文件的內容上次被更動的時間

ls -l —time=ctime test.conf

權限和文件的關係

![important]](https://user-gold-cdn.xitu.io...

  • 用戶能進入某目錄成爲可工做目錄的基本權限是什麼
條件 內容
可以使用命令 cd等切換工做目錄
目錄所需權限 x 要有可執行的權限
  • 用戶在某一個目錄能夠讀取一個文件的基本權限是什麼
條件 內容
可以使用命令 cat more less tail head 等
目錄所需權限 x 要有可執行的權限
文件所需權限 r 要有可讀的權限
  • 讓用戶修改一個文件的權限是什麼
條件 內容
可以使用命令 vi vim 等
目錄所需權限 x 要有可執行的權限
文件所需權限 r w 要有可讀可寫的權限
  • 讓用戶新建一個文件的基本權限是什麼
條件 內容
可以使用命令 touch 等
目錄所需權限 w x 要有可讀可執行的權限

$PATH

爲何在任何地方均可以執行 ls 這個命令呢 -- 環境變量 PATH

系統會依照PATH的設置去每一個定義PATH的目錄下查詢文件名爲ls的可執行文件,若是在PATH定義的目錄中含有多個文件名爲ls的可執行文件,那麼先查詢的同名命令則先被執行

1 ls 是一個可執行文件
2 根源在 /bin/ls (也就是執行ls 與執行 /bin/ls 是一樣的效果)
3 問題變爲,爲何隨時能夠執行 /bin/ls 這個文件
4 系統按照 PATH 的設置每個 path的定義目錄下 查詢名爲ls的可執行文件
5 先找到的被執行

PATH

不一樣身份的 默認的path 不一樣,默認可以隨意運行的命令也不一樣(如root與vbird)

PATH是能夠修改的

chapter 8 磁盤和文件管理

inode

EXT2

Linux最傳統的磁盤文件系統(filesystem)使用的是EXT2

磁盤分區指的是告訴操做系統 這個磁盤在此分割槽能夠存取的區域是由 A 磁柱到 B 磁柱之間的區塊

如此一來操做系統就可以知道他能夠在所指定的區塊內進行文件數據的讀/寫/搜尋等動做了。 也就是說,磁盤分區意即指定分割槽的啓始與結束磁柱

文件系統

磁盤在作分區以後還須要格式化,這是由於每種操做系統所配置的文件屬性/權限並不相同, 爲了存放這些文件所需的數據,所以就須要將分區進行格式化,以成爲操做系統可以利用的文件系統格式

  • 文件系統的運行

這與操做系統的文件數據有關。較新的操做系統的文件數據除了文件實際內容外, 一般含有很是多的屬性

例如 Linux 操做系統的文件權限(rwx)與文件屬性(擁有者、羣組、時間參數等)。 文件系統一般會將這兩部份的數據分別存放在不一樣的區塊,權限與屬性放置到 inode 中,至於實際數據則放置到 data block 區塊中

另外,還有一個超級區塊 (superblock) 會記錄整個文件系統的總體信息,包括 inode 與 block 的總量、使用量、剩餘量等

屬性 含義
inode 記錄文件的屬性,一個文件佔用一個inode,同時記錄此文件的數據所在的 block 號碼
block 實際記錄文件的內容,若文件太大時,會佔用多個 block
superblock 記錄此 filesystem 的總體信息,包括inode/block的總量、使用量、剩餘量, 以及文件系統的格式與相關信息等

block

inode

inode 的內容在記錄文件的權限與相關屬性,至於 block 區塊則是在記錄文件的實際內容

而文件系統一開始就將 inode 與 block 規劃好了,除非從新格式化,不然 inode 與 block 固定後就再也不變更

Ext2 文件系統在格式化的時候基本上是區分爲多個區塊羣組 (block group) 的,每一個區塊羣組都有獨立的 inode/block/superblock 系統

block

data block 是用來放置文件內容數據地方,在 Ext2 文件系統中所支持的 block 大小有 1K, 2K 及 4K 三種而已。在格式化時 block 的大小就固定了

1 原則上,block 的大小與數量在格式化完就不可以再改變了(除非從新格式化)
2 每一個 block 內最多隻可以放置一個文件的數據
3 承上,若是文件大於 block 的大小,則一個文件會佔用多個 block 數量
4 承上,若文件小於 block ,則該 block 的剩餘容量就不可以再被使用了(磁盤空間會浪費)


think

Q: 假設你的Ext2文件系統使用 4KB de block ,而該文件系統中有 10000 個小文件,每一個文件大小均爲 50 bytes, 請問此時你的磁盤浪費多少容量?

A:

4kb = 4 * 1024 bytes = 4096 bytes

因此每個會浪費 4096 - 50 bytes

因此公共會是 4046 * 10000 bytes = 38.585666 = 38.6MB


與目錄樹的關係

  • 文件目錄

當咱們在 Linux 下的 ext2 文件系統建立一個目錄時, ext2 會分配一個 inode 與至少一塊 block 給該目錄

其中,inode 記錄該目錄的相關權限與屬性,並可記錄分配到的那塊 block 號碼

而 block 則是記錄在這個目錄下的文件名與該文件名佔用的 inode 號碼數據

  • 文件

當咱們在 Linux 下的 ext2 建立一個通常文件時, ext2 會分配一個 inode 與相對於該文件大小的 block 數量給該文件

例如:假設個人一個 block 爲 4 Kbytes ,而我要建立一個 100 KBytes 的文件,那麼 linux 將分配一個 inode 與 25 個 block 來儲存該文件

inode 自己並不記錄文件名,文件名的記錄是在目錄的 block 當中。 所以在第六章文件與目錄的權限說明中, 咱們纔會提到『新增/刪除/改名文件名與目錄的 w 權限有關』

由於文件名是記錄在目錄的 block 當中, 所以當咱們要讀取某個文件時,就務必會通過目錄的 inode 與 block ,而後纔可以找到那個待讀取文件的 inode 號碼, 最終纔會讀到正確的文件的 block 內的數據

文件系統的操做

全部的數據都得要加載到內存後 CPU 纔可以對該數據進行處理

想想,若是你經常編輯一個好大的文件, 在編輯的過程當中又頻繁的要系統來寫入到磁盤中,因爲磁盤寫入的速度要比內存慢不少, 所以你會經常耗在等待硬盤的寫入/讀取上

爲了解決這個效率的問題, Linux 使用的方式是透過一個稱爲異步處理 (asynchronously) 的方式

當系統加載一個文件到內存後,若是該文件沒有被更動過,則在內存區段的文件數據會被配置爲乾淨(clean)的。 但若是內存中的文件數據被更改過了(例如你用 nano 去編輯過這個文件),此時該內存中的數據會被配置爲髒的 (Dirty)。此時全部的動做都還在內存中運行,並無寫入到磁盤中! 系統會不定時的將內存中配置爲『Dirty』的數據寫回磁盤,以保持磁盤與內存數據的一致性

因爲內存的速度要比硬盤快的多,所以若是可以將經常使用的文件放置到內存當中,這樣就會大大提高系統性能

  • Linux 系統上面文件系統與內存有很是大的關係:

1 系統會將經常使用的文件數據放置到主存儲器的緩衝區,以加速文件系統的讀/寫
2 承上,所以 Linux 的物理內存最後都會被用光!這是正常的狀況!可加速系統效能
3 你能夠手動使用 sync 來強迫內存中配置爲 Dirty 的文件回寫到磁盤中
4 若正常關機時,關機命令會主動呼叫 sync 來將內存的數據回寫入磁盤內
5 不正常關機(如跳電、死機或其餘不明緣由),因爲數據還沒有回寫到磁盤內, 所以從新啓動後可能會花不少時間在進行磁盤檢驗,甚至可能致使文件系統的損毀(非磁盤損毀)

掛載

文件系統與目錄樹的結合操做稱之爲掛載 掛載點必定是目錄 這樣才能使用文件系統

磁盤和目錄容量

磁盤的總體數據是在 superblock 區塊中,可是每一個各別文件的容量則在 inode 當中記載的

命令 含義
df 列出文件系統的總體磁盤使用量
du 評估文件系統的磁盤使用量(經常使用在推估目錄所佔容量)
  • df

df

因爲 df 主要讀取的數據幾乎都是針對一整個文件系統,所以讀取的範圍主要是在 Superblock 內的信息, 因此這個命令顯示結果的速度很是的快速

  • du

與 df 不同的是,du 這個命令其實會直接到文件系統內去搜尋全部的文件數據

在默認的狀況下,容量的輸出是以 KB 來設計的, 若是你想要知道目錄佔了多少 MB ,那麼就使用 -m 這個參數便可

鏈接文件

hard id_link

新建一個文件名 連接到 某個inode 號碼

symbolic link

Symbolic link 就是在建立一個獨立的文件,而這個文件會讓數據的讀取指向他 link 的那個文件的文件名

ln [-sf] 源文件 目標文件

// 不添加參數就是 hard link
// 添加參數 -s 就是 symbolic link

// f 若是目標文件存在 則先刪除後再建立

chapter 10 vim 編輯器

vi 文本編輯器 vim 程序開發工具

vim

vi

vi 共分爲三種模式,分別是『通常模式』、『編輯模式』與『指令列命令模式』

通常模式

以 vi 打開一個檔案就直接進入通常模式了(這是默認的模式)

編輯模式

通常模式當中, 按下『i, I, o, O, a, A, r, R』等任何一個字母以後會進入編輯模式

指令列命令模式

通常模式當中,輸入『 : / ? 』三個中的任何一個按鈕,就能夠將光標移動到最底下那一行

chapter 11 bash

Bash

shell

須要計算機輸出音樂,這個過程須要什麼支持呢

1 硬件

須要你的硬件有聲卡芯片

2 內核管理

須要操做系統的內核能夠支持這個芯片組 還有芯片的驅動程序

3 應用程序

須要用戶輸入播放聲音的指令

以上三點是一個簡單的輸出聲音的步驟。就是用戶須要輸出一個命令,硬件纔會執行這個命令來工做。而硬件如何知道你所執行的命令呢,那就是內核的控制工做了

咱們須要經過shell將輸入的命令與內核進行通訊,這樣內核就能夠控制硬件來工做

操做系統是一組軟件,這組軟件在控制硬件與管理系統的活動監測。若是這組軟件能被用戶隨意操做會致使系統崩潰。

因此不能讓用戶隨意去使用。所以產生了一種在操做系統上的應用程序->shell

其實shell的功能只是提供用戶操做系統的一個接口,所以這個shell須要能夠調用其餘軟件。

簡而言之,只要可以操做應用程序的接口,都叫作shell

Linux的shell

Linux有多種shell, 能夠看下 /etc/shells

shell

各家的shell功能差很少,可是在某些語法執行方面不一樣。

Linux默認使用的是 bash

爲何咱們系統上合法的 shell 要寫入 /etc/shells 這個文件啊? 這是由於系統某些服務在運行過程當中,會去檢查使用者可以使用的 shells ,而這些 shell 的查詢就是藉由 /etc/shells 這個文件

我這個使用者何時能夠取得 shell 來工做呢?還有, 我這個使用者默認會取得哪個 shell ?

當我登錄的時候,系統就會給我一個 shell 讓我來工做了。 而這個登錄取得的 shell 就記錄在 /etc/passwd 這個文件內

bash

bash 的幾個優勢

1 命令記憶功能

『上下鍵』能夠追溯命令

~/.bash_history 記錄的是前一次登錄之前所運行過的命令, 而至於這一次登錄所運行的命令都被緩存在內存中,當你成功的註銷系統後,該命令記憶纔會記錄到 .bash_history 當中

2 命令與文件補全功能

tab 鍵

3 命名別名設置功能

查詢 alias

設置 alias lm=‘ls -al’

4 做業控制,前臺,後臺控制

5 程序腳本

當登陸到Linux後,會依據/etc/passwd 文件的設置來給一個shell(默認bash) 而後就能夠依據上面的命令操做 shell

type

內部命令:由 bash 內置的命令

外部命令:來字外部的命令,非 bash 內置

查詢一個命令是外部的仍是bash內置的呢? -- type

type

能夠看到 cd 這個命令是bash的內置命令

shell 的變量功能

Linux是多用戶,多任務的環境,每一個人在登陸以後都會有一個bash。

顯示當前使用的shell,能夠輸入:

echo $SHELL

  • 影響bash環境變量的操做

那麼因爲在 Linux System 下面,全部的線程都是須要一個運行碼, 『真正以 shell 來跟 Linux 溝通,是在正確的登錄 Linux 以後』這個時候你就有一個 bash 的運行程序,也才能夠真正的經由 bash 來跟系統溝通

而在進入 shell 以前,也正如同上面提到的,因爲系統須要一些變量來提供他數據的存取 (或者是一些環境的配置參數值, 例如是否要顯示彩色等等的) ,因此就有一些所謂的『環境變量』 須要來讀入系統中了!這些環境變量例如 PATH、HOME、MAIL、SHELL 等等

讀取變量

變量在顯示的時候,前面必須帶着 $ 符號

echo $PATH
echo ${PATH}
cd $work

設置變量

workdir='workapce/mxx'
變量的設置規則
變量名稱只能是字母與數字,但開頭不能爲數字
雙引號內的特殊字符能夠保留原特性,好比$ 可正確讀取字符串中的變量,單引號則不會
name="my name is $USER"
echo $name
// mu name is tom
<!-- 若是是單引號 -->
name='my name is $USER'
echo $name
// mu name is $USER

取消變量

unset workdir

think

Q: 設置一個 變量表明 工做目錄

dir
dir


在父進程中定義的變量是沒法在子進程中使用的,好比你定義了這個變量,而後再從新發開一個進程,是讀不到這個變量的

dir

不過經過export將此變量設置爲環境變量就能夠使用了

好比,定義變量 TRYPATH=/HOME/EORK

寫一個腳本

echo $TRYPATH, 123

而後在當前進程中執行 sh test.sh

控制檯無輸出

若是 export TRYPATH=/HOME/EORK

就有信息輸出了

環境變量的功能

查詢當前有哪些環境變量,能夠使用兩個命令 env export

env

查詢到目前shell環境下全部的環境變量

set

shell不僅是有環境變量,還有各類自定義的變量

set查詢全部的變量

export

環境變量和自定義變量二者的差別在於 是否能夠被子進程使用

子進程會繼承父級進程的環境變量,不會繼承父進程的自定義變量

export 能夠將自定義變量轉爲環境變量

export

// export WORKDIR=$WORKDIR:workspace/blued-shopping/blued-shop

能夠看到目前全部的環境變量

父進程?子進程?

當你登錄 Linux 並取得一個 bash 以後,你的 bash 就是一個獨立的程序,被稱爲 PID 的就是。 接下來你在這個 bash 底下所下達的任何命令都是由這個 bash 所衍生出來的,那些被下達的命令就被稱爲子程序了。

  • 爲何子進程能夠使用環境變量

1 當建立一個shell時候,操做系統會分配一個記憶塊給shell使用,此內存的變量能夠給子進程使用

2 在父進程使用了 export ,就能夠將自定義的變量寫到上面的那個記憶塊中

3 當加載另外一個shell的時候(啓動子進程,要離開父進程了)子shell能夠將父shell的那個記憶塊導入本身的環境變量塊中

ulimit

Linux 主機裏面同時登錄了十我的,這十我的不知怎麼搞的, 同時開啓了 100 個文件,每一個文件的大小約 10MBytes ,

請問一下, 個人 Linux 主機的內存要有多大才夠? 1010010 = 10000 MBytes = 10GBytes ... 內存佔用量很大,因此能夠限制這個大小

bash 能夠限制用戶的某些系統資源,好比文件打開數量,可用的CPU時間,可用內存總量等 ,這些經過 ulimit 進行設置

ulimit

參數解析 含義
unlimited 無限制
0 無限制

history

查看歷史命令

history
history 10
history -w // 寫入 ~./bash_history

歷史命令的讀取與記錄是這樣的:

以 bash 登錄 Linux 主機以後,系統會主動的由家目錄的 ~/.bash_history 讀取之前曾經下過的命令,那麼 ~/.bash_history 會記錄幾筆數據呢?這就與你 bash 的 HISTFILESIZE 這個變量配置值有關了!

假設我此次登錄主機後,共下達過 100 次命令,『等我註銷時, 系統就會將 101~1100 這總共 1000 筆歷史命令升級到 ~/.bash_history 當中。』 也就是說,歷史命令在我註銷時,會將最近的 HISTFILESIZE 筆記錄到個人紀錄文件當中啦!

固然,也能夠用 history -w 強制馬上寫入的!那爲什麼用『升級』兩個字呢? 由於 ~/.bash_history 記錄的筆數永遠都是 HISTFILESIZE 那麼多,舊的信息會被主動的拿掉! 僅保留最新的!

bash的操做環境

路徑和命令的查找順序

在咱們系統中存在多個名字相同的名字,那麼 bash shell 究竟使用的是哪一個命令呢?其遵循的順序以下

1.以相對/絕對路徑來執行命令
2.由 alias 找到命令來執行
3.由 bash 內置命令來執行
4.經過$PATH 的順序找到的第一個命令來執行

[root@localhost ~]# alias echo='echo -n'
[root@localhost ~]# type -a echo
echo is aliased to `echo -n'
echo is a shell builtin
echo is /bin/echo

能夠看到先找alias在內置命令 最後PATH

bash的登陸信息

這些均可以進行配置的

shell 的配置文件

怎麼咱們什麼動做都沒有進行,可是一進入 bash 就取得一堆有用的變量了?

這是由於系統有一些環境配置文件案的存在,讓 bash 在啓動時直接讀取這些配置文件,以規劃好 bash 的操做環境

這些配置文件又能夠分爲全體系統的配置文件以及用戶我的偏好配置文件。

咱們前幾個小節談到的命令別名啦、自定義的變量啦,在你註銷 bash 後就會失效,因此你想要保留你的配置, 就得要將這些配置寫入配置文件才行。

  • Bash 配置文件

以 login shell 方式

1 /etc/profile 系統最主要的shell配置文件,每次login,bash都要讀取 /etc/profile文件

PATH:會依據 UID 決定 PATH 變量要不要含有 sbin 的系統命令目錄;
MAIL:依據帳號配置好使用者的 mailbox 到 /var/spool/mail/帳號名;
USER:根據用戶的帳號配置此一變量內容;
HOSTNAME:依據主機的 hostname 命令決定此一變量內容;
HISTSIZE:歷史命令記錄數

2 我的配置文件

bash 在讀完了總體環境配置的 /etc/profile 以及其餘配置文件後,接下來則是會讀取使用者的我的配置文件

其實 bash 的 login shell 配置只會讀取上面三個文件的其中一個, 而讀取的順序則是依照上面的順序。也就是說,若是 ~/.bash_profile 存在,那麼其餘兩個文件不論有無存在,都不會被讀取。 若是 ~/.bash_profile 不存在纔會去讀取 ~/.bash_login,而前二者都不存在纔會讀取 ~/.profile 的意思

在 login shell 的 bash 環境中,所讀取的我的偏好配置文件其實主要有三個,依序分別是:

~/.bash_profile
~/.bash_login
~/.profile

~/.bash_profile 是我的的bash配置文件,存在每位用戶的$HOME

~/.bash_login 用戶登錄時 bash會讀取這個文件。一般把登錄就要執行的指令放在這

以 non-login shell 方式

~/.bashrc 每次打開shell,shell都會讀取的文件。每次打開shell,執行一次

其他的配置文件爲

4 ~/.bash_logout 是退出系統時bash在退出時執行的

5 ~/.bash_history 是歷史功能的記錄文件

數據流重定向

數據流重定向 就是把某些要出如今屏幕上的數據傳輸到其餘地方

數據流

輸入數據流:以寫文件爲例,從鍵盤輸入的字符就輸入數據流

輸出數據流:以讀文件爲例,將文件內容顯示到屏幕上,顯示的內容就是輸出字符流

輸出數據流又可分爲:標準輸出 標準錯誤輸出

標準輸入 < 或者 <<

標準輸出 > 或者 >>

標準錯誤輸出 2> 或者 2>>

( 一個< 表示覆蓋 二個<< 表示進行追加 )

echo config.js > copy.js

本應該出如今屏幕上的全部的config的信息 會被 導入到copy.js文件

這個copy文件的建立方式爲

1 該文件若不存在,系統會自動的將他建立起來

2 當這個文件存在的時候,那麼系統就會先將這個文件內容清空,而後再將數據寫入

也就是若以 > 輸出到一個已存在的文件中,那個文件就會被覆蓋掉

若是不想被覆蓋,而是繼續追加信息,使用 >>

命令行中的判斷 && ||

ls tmp/info && touch tmp/info/a

管道

bash 命令運行的時候有輸出的數據會出現! 那麼若是這羣數據必須要通過幾道手續以後才能獲得咱們所想要的格式,應該如何來配置?

  • grep
  • uniq 去重
  • wc 統計

chapter 13 shell script

就是在 shell 上運行的 script 腳本

開發

以 #!/bin/bash 開頭 用以聲明文件內語法使用bash語法

  • 條件判斷
if [ 條件判斷式 ]; then
    當條件判斷式成立時,能夠進行的命令工做內容;
fi   <==將 if 反過來寫,就成爲 fi 啦!結束 if 之意!

如何運行

sh base.sh
bash base.sh
/bin/bash base.sh
/bin/sh base.sh

source x.sh

source 能夠回傳變量

// 定義變量 export 到全局
export TRYPATH='trypath'

// 定義 test.sh 內容爲  
// echo $TRYPATH
// TRYPATH='changepath'
sh test.sh  // -> trypath

echo $TRYPATH // -> trypath

// 使用source執行

source test.sh // trypath

echo $TRYPATH // -> changepath

也就是 source 能夠修改父進程的變量

chapter 14 帳號管理與權限設置

Jurisdiction

帳號與用戶組

登錄 Linux 主機的時候,輸入的是咱們的帳號, ID 與帳號的對應就在 /etc/passwd 當中

每一個登錄的使用者至少都會取得兩個 ID ,一個是使用者 ID (User ID ,簡稱 UID)、一個是羣組 ID (Group ID ,簡稱 GID)

  • 文件如何判別他的擁有者與羣組

每個文件都會有所謂的擁有者 ID 與擁有羣組 ID ,當咱們有要顯示文件屬性的需求時,系統會依據 /etc/passwd 與 /etc/group 的內容, 找到 UID / GID 對應的帳號與組名再顯示出來

  • 在輸入帳號和密碼登陸shell時候 系統會發生什麼

1 先找尋 /etc/passwd 裏面是否有你輸入的帳號

若是沒有則跳出,若是有的話則將該帳號對應的 UID 與 GID (在 /etc/group 中) 讀出來,另外,該帳號的主文件夾與 shell 配置也一併讀出

2 再來則是覈對密碼錶啦!

這時 Linux 會進入 /etc/shadow 裏面找出對應的帳號與 UID,而後覈對一下你剛剛輸入的密碼與裏頭的密碼是否相符

3 若是一切都 OK 的話,就進入 Shell 控管的階段

/etc/passwd

每一行都表明一個帳號,有幾行就表明有幾個帳號在你的系統中

按照 : 分爲 7個部分

[用戶名]:[密碼]:[UID]:[GID]:[身份描述]:[主目錄]:[登陸shell]

/etc/shadow

咱們知道不少程序的運行都與權限有關,而權限與 UID/GID 有關!所以各程序固然須要讀取 /etc/passwd 來了解不一樣帳號的權限。 所以 /etc/passwd 的權限需配置爲 -rw-r--r-- 這樣的狀況, 雖然早期的密碼也有加密過,但卻放置到 /etc/passwd 的第二個字段上!這樣一來很容易被有心人士所竊取的, 加密過的密碼也可以透過暴力破解法去 try and error (試誤) 找出來

由於這樣的關係,因此後來發展出將密碼移動到 /etc/shadow 這個文件分隔開來的技術

testuser:!!:17854:0:99999:7:::

[帳號名稱] [密碼] [最近更動密碼的日期] [密碼不可被更動的天數] [密碼須要從新變動的天數] [密碼須要變動期限前的警告天數] [密碼過時後的帳號寬限時間(密碼失效日)] [帳號失效日期] [保留]

  • [密碼]

通過編碼的密碼 (加密) 只會看到有一些特殊符號的字母

  • [最近更動密碼的日期]

是以 1970 年 1 月 1 日做爲 1 而累加的日期,1971 年 1 月 1 日則爲 366

/etc/group

記錄GID 和用戶組組名對應

這個文件每一行表明一個羣組

它總共分四個部分:[組名]:[密碼域]:[GID]:[組員列表]

看下這三者的關係

relation

有效用戶組(effective group)與初始用戶組(initial group)

每一個使用者在他的 /etc/passwd 裏面的第四欄有所謂的 GID,就是『初始羣組 (initial group) 』。也就是說,當用戶一登錄系統,馬上就擁有這個羣組的相關權限

可是一個用戶能夠被加入到多個用戶組去,好比 USERA 能夠同時屬於 group1 (初始用戶組) 與 group2 (手動添加)

那麼當這個用戶在新建一個文件的時候,新文件所屬組是哪個

這個取決於當時的有效用戶組

查詢當前用戶所屬的用戶組

groups

第一個輸出的羣組即爲 有效用戶組 (effective group) 了

以這個用戶身份去新建一個文件,則文件的用戶組就是這個 有效用戶組

有效羣組的切換

newgrp newGrooup

可是使用newgrp 是有限制的,那就是你想要切換的羣組必須是你已經有支持的羣組,也就是說,只要個人用戶有支持的羣組就是可以切換成爲有效羣組

帳號管理

用戶相關

// 新增一個用戶
usersadd newName

// 刪除一個用戶
userdel newName

CentOS 系統主要會幫咱們處理幾個項目

1 在 /etc/passwd 裏面建立一行與帳號相關的數據,包括建立 UID/GID/家目錄等

2 在 /etc/shadow 裏面將此帳號的密碼相關參數填入,可是還沒有有密碼

3 在 /etc/group 裏面加入一個與帳號名稱如出一轍的組名

4 在 /home 底下建立一個與帳號同名的目錄做爲用戶家目錄,且權限爲 700

此時在 /etc/shadow 內僅會有密碼參數而不會有加密過的密碼數據,所以還須要使用『 passwd 帳號 』來給予密碼纔算是完成了用戶建立的流程

passwd g1

爲什麼『 useradd vbird1 』會主動在 /home/vbird1 建立起用戶的家目錄?家目錄內有什麼數據且來自哪裏?爲什麼默認使用的是 /bin/bash 這個 shell ?爲什麼密碼字段已經都規範好了 (0:99999:7 那一串)? ---- 取決於 useradd 所使用的參考文件

useradd -D
// GROUP=100        <==默認的羣組
// HOME=/home        <==默認的家目錄所在目錄
// INACTIVE=-1        <==密碼失效日,在 shadow 內的第 7 欄
// EXPIRE=            <==帳號失效日,在 shadow 內的第 8 欄
// SHELL=/bin/bash        <==默認的 shell
// SKEL=/etc/skel        <==用戶家目錄的內容數據參考目錄
// CREATE_MAIL_SPOOL=yes   <==是否主動幫使用者建立郵件信箱(mailbox)

用戶組相關

// 新增一個用戶組
groupadd newName

// 刪除一個用戶組  r 表示連同用戶主文件夾一塊兒刪除
groupdel -r newName 

// 將用戶加入到組和從組中刪除
gpasswd –a 用戶名  組名        //添加用戶
gpasswd –d 用戶名  組名        //刪除用戶

//  查看用戶屬於某組
#groups  用戶名
// 新建用戶加入某組
useradd –g  某組名  用戶

用戶組管理員設置

將 g3 設置爲 girls 組的管理員, 管理員能夠控制 那些帳號能夠 移入 移除 用戶組

gpasswd -A g3 girls

設置用戶密碼

當忘記了密碼怎麼辦

  • 普通用戶

root管理員處理

passwd usertest

passwd

  • root 忘記密碼

安全模式?? 太複雜了

  • 關於處理密碼
echo 123456 | passwd --stdin testuser2

直接變動密碼,不須要重複確認

pwd

  • 關閉/打開 某一個用戶密碼
// 使用戶密碼失效
passwd -S xxx
// 使用戶密碼解鎖
passwd -u xxx

lock

用戶的身份切換

  • su

su 須要新用戶的密碼 (若是原來的是root 切換到哪個都不須要密碼 )

本來的變量不會改變, 好比PATH變量 mail 變量 還會是以前用戶的

// 使用 - 能夠處理這個問題
su -

su

exit

退出 第二個 用戶狀態 恢復到原始用戶環境

  • sudo

sudo 切換須要本身的密碼,有時候還不須要

sudo 可讓你以其餘用戶的身份運行命令 (一般是使用 root 的身份來運行命令), 只有在 /etc/sudoers 中的用戶 才能夠執行此命令

將用戶添加到 /etc/sudoers

visudo

添加角色

visudo

用戶功能

  • id

查詢某人或者本身的uid/gid等信息

id
// uid=1006(g1) gid=1007(girls) 組=1007(girls)
id g2
// uid=1007(g2) gid=1007(girls) 組=1007(girls)
  • w / who

當前誰登錄在系統上

w

chapter16 例行性工做 crontab

crontab

什麼是例行性工做?

能夠理解爲node中的定時任務(node-schedule)

有兩種任務性質,週期性,一次性

週期性: 好比天天要睡覺

一次性: 好比偶爾會撿到錢

at 命令用於處理 一次性 的工做

crontab 命令用於處理週期性的工做,循環工做

Linux常見的例行性工做調度

  • 日誌文件的輪替
  • 臨時文件的刪除

某些軟件在運行中會產生一些緩存文件,可是當這個軟件關閉時,這些緩存文件可能並不會主動的被移除。

系統透過例行性工做排程運行名爲 tmpwatch 的命令來刪除這些緩存文件

at 一次性的工做調度

atd 用於負責處理 這些一次的工做,可是並不是全部的 Linux distributions 都默認會把他打開的

/etc/init.d/atd restart

使用 at 這個命令來產生所要運行的工做,並將這個工做以文字檔的方式寫入 /var/spool/at/ 目錄內,該工做便能等待 atd 這個服務的取用與運行了

/etc/at.allow 與 /etc/at.deny

這兩個文件限制了誰有權利去調用 at

1 /etc/at.allow

寫在這個文件中的使用者才能使用 at ,沒有在這個文件中的使用者則不能使用 at (即便沒有寫在 at.deny 當中)

2 若是 /etc/at.allow 不存在,就尋找 /etc/at.deny 這個文件 凡是被寫入的都不能使用at了(沒有被寫的就能夠使用)

3 若是兩個文件都不存在,那麼只有 root 能夠使用 at 這個命令

  • 查詢當前機器中有多少 at 的工做調度
atq
  • 刪除某一個工做調度
atrm [jobnumber]
batch

batch 就是另外一種 at, 可是batch會在 CPU 工做負載 低於 0.8 的時候,才進行你所下達的工做任務

  • CPU 工做負載

若是某一個程序他須要一直使用 CPU 的運算功能,那麼此時 CPU 的使用率可能到達 100% 可是 CPU 的工做負載則是趨近1,由於 CPU 僅負責一個工做

若是同時運行2個這樣的程序 CPU 的使用率仍是 100% ,可是工做負載則變成 2

crontab

用戶的設置

crontab 用來處理週期性的工做,爲了安全考慮,能夠限制哪些身份是能夠使用 crontab

  • /etc/cron.allow
  • /etc/cron.deny

當使用者使用 crontab 這個命令來建立工做排程以後,該項工做就會被紀錄到 /var/spool/cron/ 裏面, 並且是以賬號來做爲判別

好比 dmtsai 使用 crontab 後, 他的工做會被記錄到 /var/spool/cron/dmtsai 裏頭去

默認狀況下,只要用戶沒有被放入 /etc/cron.deny 就能夠直接執行 crontab -e 去編輯本身的例行性命令了

時間位置是五個數字 * 分別表明 分鐘 小時 日期 月份 周幾

編寫

crontab -e

咱們寫一個每一分鐘輸出當前時間的

*/1 * * * * echo $(date) > /tmp/test.txt

查看當前用的 crontab 工做

crontab -l

重啓

/bin/systemctl start crond.service

系統層級的crontab

crontab -e 是對於用戶的,若是是系統的例行性任務,就須要另外處理了

須要編輯 /etc/crontab 這個文件了

cron 這個服務的最低偵測限制是『分鐘』,因此『 cron 會每分鐘去讀取一次 /etc/crontab 與 /var/spool/cron 裏面的數據內容 』,所以,只要編輯完 /etc/crontab 這個文件,而且將他儲存以後,那麼 cron 的配置就自動運行

手動重啓crond服務

/etc/init.d/crond restart

/etc/crontab

  • MAILTO

當 /etc/crontab 這個文件中的例行性工做的命令發生錯誤時,或者是該工做的運行結果有 STDOUT/STDERR 時,會將錯誤信息或者是螢幕顯示的信息傳給誰(默認是由系統直接寄發一封 mail 給 root)

  • PATH

命令路徑

anacron 喚醒停機期間的工做任務

anacron 並不能指定什麼時候運行某項任務, 而是以天爲單位或者是在啓動後馬上進行 anacron 的動做,他會去偵測停機期間應該進行可是並無進行的 crontab 任務,並將該任務運行一遍後,anacron 就會自動中止了

anacron 會以一天、七天、一個月爲期去偵測系統未進行的 crontab 任務

anacron 運行的時間一般有兩個,一個是系統啓動期間運行,一個是寫入 crontab 的排程中。 這樣纔可以在特定時間分析系統未進行的 crontab 工做

chapter17 程序管理

17.1 進程 程序

觸發任何一個事件時,系統都會將其定義爲一個進程,並給與此進程一個ID,爲PID. 同時依據啓發這個程序的使用者與相關屬性關係,給予這個 PID 一組有效的權限配置

程序通常是放置在實體磁碟中,而後透過使用者的運行來觸發。觸發後會加載到內存中成爲一個個體,那就是進程。 爲了操做系統可管理這個程序,所以程序有給予運行者的權限/屬性等參數,幷包括程序所須要的命令碼與數據或文件數據等, 最後再給予一個 PID 。系統就是透過這個 PID 來判斷該 process 是否具備權限進行工做

內存

  • 程序

系統須要啓動的那個二進制的文件

一般爲二進制程序放置在存儲媒介中,以物理文件形式存在
  • 進程

程序觸發以後,被加載到內存中成爲一個個體,這就是進程

程序被觸發後,執行者的權限與屬性,程序的程序代碼與所需數據會被加載到內存,操做系統會給與這個內存單元一個標識符PID

子程序與父程序

進程

程序彼此之間是有相關性的。以上面的圖示來看,連續運行兩個 bash 後,第二個 bash 的父程序就是前一個 bash

常駐進程

某些命令產生的進程很快就會被終止,好比ls顯示文件 touch 建立文件等。可是有些進程會一直在執行,好比系統每一分鐘會去掃描 /etc/crontab 來進行工做調度, 是 crond 這個程序所管理的,他啓動後就在後臺一直持續不斷的運行。 這個就是一直存在內存中的進程

常駐在內存當中的程序一般都是負責一些系統所提供的功能以服務使用者各項任務,所以這些常駐程序就會被咱們稱爲:服務 (daemon)。系統的服務很是的多, 不過主要大體分紅系統自己所須要的服務,例如剛剛提到的 crond 及 atd

網絡服務會啓動一個能夠負責網絡監聽的端口 (port) ,以提供外部用戶端 (client) 的連線要求

Linux 的多人多工環境

Q: 爲何 Linux 這麼多用戶,可是卻每一個用戶均可以擁有本身的環境?

其實在 Linux 下運行一個命令時,系統會將相關的權限、屬性、程序碼與數據等均加載內存, 並給予這個單元一個程序識別碼 (PID),最終該命令能夠進行的任務則與這個 PID 的權限有關

// 文件目錄
const dir = {}

// 一些內存
const Memory = {}

function linux1 () {
    // 用戶1登陸的環境

    function crontab(){...}
    function pm2(){...}
}

function linux2 () {
    // 用戶2 登陸的環境
    
    function crontab(){...}
    function pm2(){...}
}
  • 多任務行爲

Linux 可讓CPU在各個工做進行切換,也就是說,每個工做僅僅佔用CPU幾個命令次數,因此CPU每秒可以在各個進程之間進行切換

目前的 CPU 速度可高達幾個 GHz。 這表明 CPU 每秒鐘能夠運行 109 這麼屢次命令。Linux 可讓 CPU 在各個工做間進行切換, 也就是說,其實每一個工做都僅佔去 CPU 的幾個命令次數,因此 CPU 每秒就可以在各個程序之間進行切換

  • 特殊的程序管理行爲

Linux能夠在任什麼時候候, 將某個被困住的程序殺掉,而後再從新運行該程序而不用從新啓動

  • bash 環境下的工做管理 (job control)

登錄 bash 以後, 就是取得一個名爲 bash 的 PID 了,而在這個環境底下所運行的其餘命令, 就幾乎都是子進程了

在這個單一的 bash 界面下,能夠處理多個工做

工做管理 job control

當登陸系統取得 bash shell 以後,在單一終端機界面下同時進行多個工做的行爲管理

能夠出現提示字節讓你操做的環境就稱爲前景 (foreground),其餘工做就可讓你放入背景 (background) 去暫停或運行

  • 直接將命令丟到後臺中『運行』的 &

好比啓動一個項目

node index.js

run

這個就是一直在前臺啓動,咱們能夠將這個放在後臺處理

node index.js &

&

添加的這個 & 會將命令放到後臺處理,此時bash會輸出一個 工做號碼 1 和 PID 90328

  • 查詢目前在後臺的工做
jobs

jobs

參數 含義
l 除了列出 job number 與命令串以外,同時列出 PID 的號碼
r 僅列出正在背景 run 的工做
s 僅列出正在背景當中暫停 (stop) 的工做

能夠看到有一個 + - 號展現

  • 表明最近被放到背景的工做號碼 - 表明最近最後第二個被放置到背景中的工做號碼 而超過最後第三個之後的工做,就不會有 +/- 符號存在了
  • 後臺工做拿到前臺處理 fg (foreground)
fg // 默認將 + 的工做取出來
fg- // 取出來 - 的工做
fg %工做號碼 // 取出來這個工做號碼的對應工做
  • 管理工做 kill

kill

kill -signal %jobnumber
signal參數 含義
1 從新讀取一次參數的配置檔 (相似 reload)
2 表明與由鍵盤輸入 [ctrl]-c 一樣的動做
9 馬上強制刪除一個工做
15 以正常的程序方式終止一項工做。與 -9 是不同的

進程管理

爲何須要進程管理

1 Linux 系統是個很忙碌的系統,那麼當整個系統資源快要被使用光時, 您是否可以找出最耗系統的那個程序,而後刪除該程序,讓系統恢復正常呢

2 此外,若是由於某個程序寫的很差,致使產生一個有問題的程序在內存當中,您又該如何找出他,而後將他移除呢?

3 若是同時有五六項工做在您的系統當中運行,但其中有一項工做纔是最重要的, 該如何讓那一項重要的工做被最優先運行呢

查看進程

  • ps
命令 含義
ps -l 查詢只和本身bash相關的進程
ps aux 當前內存全部進程

ps 是靜態的結果輸出 是某一個時間點的進程狀態

  • top

top 能夠監測整個系統的進程工做狀態

top [-d 數字] | top [-bnp]

-d 後面能夠接秒數,默認是 5 秒, 表示每次更新進程資源的時間

在 top 運行過程中能夠使用的按鍵命令

? :顯示在 top 當中能夠輸入的按鍵命令
P :以 CPU 的使用資源排序顯示
M :以 Memory 內存 的使用資源排序顯示 (默認)
N :以 PID 來排序
T :由該 Process 使用的 CPU 時間累積 (TIME+) 排序
k :給予某個 PID 一個訊號 (signal)
r :給予某個 PID 從新制訂一個 nice 值
q :離開 top 軟件的按鍵


think

如何查找最消耗CPU的進程

使用 top 而後 按P


進程管理

實際上是透過給予該程序一個信號 (signal) 去告知該程序如何操做

查詢全部的可用的singal

kill -l

經常使用的一些 信號

數值 名稱 含義
1 SIGHUP 啓動被終止的程序,可以讓該 PID 從新讀取本身的配置檔,相似從新啓動
  • killall -singal 命令名稱

根據進程名稱刪除此進程

好比咱們經過 node index.js & 啓動這個服務到後臺

那麼刪除就能夠是 killall -9 node

要刪除某個程序,咱們能夠使用 PID 或者是啓動該程序的命令名稱,

而若是要刪除某個服務呢?呵呵!最簡單的方法就是利用 killall , 由於他能夠將系統當中全部以某個命令名稱啓動的程序所有刪除。

進程的優先級

Linux 給予程序一個所謂的『優先運行序 (priority, PRI)』, 這個 PRI 值越低表明越優先的意思

以前咱們查看一個進程 ps -l

ps -l

能夠看到 PRI 這個參數

PRI 是內核動態調整的,使用者無權去幹涉 PRI

想要調整程序的優先運行序時,就得要透過 Nice 值了!Nice 值就是上表的 NI

通常來講, PRI 與 NI 的相關性以下:

PRI(new) = PRI(old) + nice

可是,若是本來的 PRI 是 50 ,並非咱們給予一個 nice = 5 ,就會讓 PRI 變成 55 。

由於 PRI 是系統『動態』決定的,因此,雖然 nice 值是能夠影響 PRI ,不過, 最終的 PRI 還是要通過系統分析後纔會決定的。

另外, nice 值是有正負的,而既然 PRI 越小越早被運行, 因此,當 nice 值爲負值時,那麼該程序就會下降 PRI 值,亦即會變的較優先被處理

  • nice

新執行的命令處理nice

nice [-n 數字] command

nice -n 5 vi

數字範圍在 -20 - 19

  • renice

已經存在的進程nice從新調整

線程

查看系統資源

free 查看內存佔用

free [-b|-k|-m|-g] [-t]

選項與參數

-b :直接輸入 free 時,顯示的單位是 Kbytes,咱們能夠使用 b(bytes), m(Mbytes) k(Kbytes), 及 g(Gbytes) 來顯示單位

-t :在輸出的最終結果,顯示實體內存與 swap 的總量

free

Mem 那一行顯示的是實體內存的量, Swap 則是虛擬內存的量。 total 是總量, used 是已被使用的量, free 則是剩餘可用的量。 後面的 shared/buffers/cached 則是在已被使用的量當中,用來做爲緩衝及緩存的量。

Linux 測試用主機是很平凡的,根本沒有什麼工做, 可是實體內存是幾乎被用光

不過,至少有 132MB 用在緩衝記憶 (buffers) 工做, 287MB 則用在緩存 (cached) 工做,也就是說,系統是『頗有效率的將全部的內存用光』, 目的是爲了讓系統的存取效能加速

不少朋友都會問到這個問題『個人系統明明很輕鬆,爲什麼內存會被用光光?』被用光是正常的!而須要注意的反而是 swap 的量

通常來講, swap 最好不要被使用,尤爲 swap 最好不要被使用超過 20% 以上, 若是您發現 swap 的用量超過 20% ,那麼,最好仍是買實體內存

系統會使用到 swap , 絕對是由於實體內存不足了纔會這樣作的

Linux 系統爲了要加速系統效能,因此會將最常使用到的或者是最近使用到的文件數據緩存 (cache) 下來, 這樣將來系統要使用該文件時,就直接由內存中搜尋取出,而不須要從新讀取硬盤,速度上面固然就加快了! 所以,實體內存被用光是正常的

uname:查閱系統與核心相關資訊

uptime:觀察系統啓動時間與工做負載

netstart

netstart -tlnp

特殊文件和程序

chapter 18 系統服務

service

系統爲了某些功能必需要提供一些服務 (不管是系統自己仍是網絡方面),這個服務就稱爲 service

可是 service 的老是須要程序的運行吧!達成這個 service 的程序咱們就稱呼他爲 daemon

舉例來講,達成循環型例行性工做排程服務 (service) 的程序爲 crond 這個 daemon

chapter23 軟件安裝

Linux 開發商先在固定的硬件平臺與操做系統平臺上面將須要安裝或升級的軟件編譯好, 而後將這個軟件的全部相關文件打包成爲一個特殊格式的文件,在這個軟件文件內還包含了預先偵測系統與相依軟件的腳本, 並提供記載該軟件提供的全部文件資訊等。最終將這個軟件文件發佈。

用戶端取得這個文件後,只要透過特定的命令來安裝, 那麼該軟件文件就會依照內部的腳原本偵測相依的前驅軟件是否存在,若安裝的環境符合需求,那就會開始安裝, 安裝完成後還會將該軟件的資訊寫入軟件管理機制中,以達成將來能夠進行升級、移除等動做

目前Linux經常使用的兩大安裝方式爲 dpkg rpm

不論 dpkg/rpm 這些機制或多或少都會有軟件屬性相依的問題,那該如何解決呢?

其實前面不是談到過每一個軟件文件都有提供相依屬性的檢查嗎?那麼若是咱們將相依屬性的數據作成列表, 等到實際軟件安裝時,若發生有相依屬性的軟件情況時,管理機制自動去取得其依賴來同時安裝, 就解決了屬性相依的問題

目前新的 Linux 開發商都有提供這樣的『線上升級』機制,透過這個機制, 原版光盤就只有第一次安裝時須要用到而已,其餘時候只要有網絡,你就可以取得本來開發商所提供的任何軟件了

CentOS 系統嘛!因此說:使用的軟件管理機制爲 RPM 機制,而用來做爲線上升級的方式則爲 yum

rpm

RPM是RedHat Package Manager(RedHat軟件包管理工具)的縮寫,這一文件格式名稱雖然打上了RedHat的標誌,可是其原始設計理念是開放式的,如今包括OpenLinux、S.u.S.E.以及Turbo Linux等Linux的分發版本都有采用,能夠算是公認的行業標準了。



最大的特色就是將你要安裝的軟件先編譯過, 而且打包成爲 RPM 機制的包裝文件,透過包裝好的軟件裏頭默認的數據庫記錄, 記錄這個軟件要安裝的時候必須具有的相依屬性軟件,當安裝在你的 Linux 主機時, RPM 會先依照軟件裏頭的數據查詢 Linux 主機的相依屬性軟件是否知足, 若知足則予以安裝,若不知足則不予安裝。那麼安裝的時候就將該軟件的資訊整個寫入 RPM 的數據庫中,以便將來的查詢、驗證與反安裝!這樣一來的優勢是:

由於已經編譯完成而且打包完畢,因此軟件傳輸與安裝上很方便 (不須要再從新編譯);
由於軟件的資訊都已經記錄在 Linux 主機的數據庫上,很方便查詢、升級與反安裝

缺點

由於 RPM 文件是已經包裝好的數據,也就是說, 裏面的數據已經都『編譯完成』了!因此,該軟件文件幾乎只能安裝在本來默認的硬件與操做系統版本中。 也就是說,你的主機系統環境必需要與當初建立這個軟件文件的主機環境相同才行

有的時候相同 distribution 的不一樣版本之間也沒法互通,例如 CentOS 4.x 的 RPM 文件就沒法直接套用在 CentOS 5.x !所以,這樣能夠發現這些軟件管理機制的問題是:

軟件文件安裝的環境必須與打包時的環境需求一致或至關;
須要知足軟件的相依屬性需求;
反安裝時須要特別當心,最底層的軟件不可先移除,不然可能形成整個系統的問題!

RPM 相關操做

  • 查詢rpm包

(1)查詢系統中安裝的全部rpm包 #rpm –qa
(2)查詢軟件包是否安裝  #rpm –q 軟件包名稱
(3)查詢軟件包信息   #rpm –qi 軟件包名稱
(4)查詢軟件包中的文件 #rpm –ql 軟件包名稱
(5)查詢系統中文件所屬的軟件包#rpm –qf 文件全路徑名
(6)查詢rpm包文件中的信息#rpm –qp rpm包文件全路徑

  • 安裝rpm包

rpm –ivh rpm包全路徑文件名

  • 刪除rpm包

rpm –e rpm包名稱

  • 升級rpm包

rpm –U rpm軟件包全路徑名

網絡相關

基本的網絡配置

一、主機名
二、ip地址
三、網關地址
四、DNS服務器地址

DNS

DNS客戶配置文件 /etc/resolv.conf 該文件中指定系統所使用的DNS服務器的IP地址

網絡相關命令

// 顯示當前系統的主機名稱
hostname

// 設置系統主機名
hostname 主機名稱

ping

Ping [–c 發出的報文數 ]目的主機地址
Ping命令經過向被測試的目的主機地址發送ICMP報文並收取回應報文,來測試當前主機到目的主機的網絡鏈接狀態

nslookup
用於使用系統設定的DNS服務器解析域名,用該命令能夠測試NDS服務器是否工做正常
Nslookup命令有交互方式查詢和命令行方式查詢

#nslookup
#nslookup 主機域名 | ip地址
nslookup
www.webmxx.com
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息