Linux存儲管理

Linux存儲管理:
CPU包含運算器和控制器,另一重要組件RAM內存
磁盤是非常重要的輸入輸出設備
將各個組件連接在主板上提供總線環境
橋(南北橋)是最爲經典的主板處理概念
主板上除了提供控制器Controller這種機制外,還有插槽直接插入槽中的叫做適配器Adapter
磁盤控制器,總線,接口
傳統的CPU包含運算器和存儲器
memory(RAM)內存
輸入輸出設備
比如磁盤 非常重要的一種輸入輸出設備
想要和用戶交互需要顯示器 鍵盤
鍵盤鍵入數據怎樣顯示在電腦上 顯示器的接口並不是只有vga一種 顯示器不一定需要連接到顯卡上
IO設備 磁盤鼠標鍵盤顯卡網卡 輸入和輸出都是數據的輸入輸出 只要是數據就要被CPU 處理
數據是怎樣與CPU聯繫在一起的 CPU與各個設備都有通信通道叫做總線
總線無法單獨存在的 集成在一起成就了所謂的主板 一天有86400s
在主板建構中有一種委託結構 叫做主板芯片組 北橋和南橋
北橋叫做高速芯片組 南橋叫做低速芯片組
硬盤是有一根電源線和一根數據線的
數據線 接在接口上在主板上叫做總線控制器 作用是連接磁盤和南橋 是磁盤的數據傳輸到低速芯片組 再經高速芯片組處理交給CPU處理
插槽 直接插在插槽中的設備叫做適配器 適配器通過某種總線連接到總線的 這種設備需要斷電插拔 否則會導致插拔的瞬間產生較大的電流造成燒燬
磁盤中是絕對真空的 相當於一個金屬盒子
裏面放有金屬盤片 裏面有磁頭懸臂
磁盤接口的類型:
IDE:並行接口,來源於更早的ATA接口,133Mbps,266Mbps
SCSI:小型計算機系統接口
UltraSCSI320:320Mbps(接口帶寬)
UltraSCSI640:640Mbps
窄帶控制器:可以提供7個接口
寬帶控制器:可以提供15個接口

SATA:Serial ATA,串行接口; 民用較多 串行接口並不一定比並行接口慢
 SATA1,SATA2,SATA3,6Gbps
SAS:串行接口  企業常用
  6Gbps
  可以提供1023個接口

USB:新近出現的一種數據總線控制方式 若干版本更迭 :1.0 1.1 2.0 3.0 3.1
  2.0:60Mbps
  3.0:480Mbps
  3.1:10Gbps

衡量磁盤IO能力的另一個指標:IOPS(每秒內可以完成多少次讀寫操作,讀的操作要遠遠大於寫的操作)
IDE :機械磁盤, 50-100 IOPS

SCSI:機械磁盤, 100-200 IOPS
IDE、SCSI:固態磁盤, 400 IOPS

SATA:機械磁盤, 100IOPS左右
      固態磁盤, 400 IOPS左右

SAS: 機械磁盤, 200IOPS左右
      固態磁盤, 800IOPS左右

PCI-E接口的固態硬盤:
 讀的IOPS:400000-800000
 寫的iops:50000-100000

普通的x86架構的的主板上的磁盤控制器的接口:
IDE:有2個接口,每個接口接一個主盤和一個從盤;如果有光驅的話,可能減少至3個磁盤+1個光驅;

STAT:4-6個接口;

SCSI:7個接口或15個接口;

SAS:1023-16384個接口;

CPU:控制總線,數據總線,地址總線;
內存的總線FSB前端總線,內存所專有的, 前端總線寬度一般應爲CUP的處理頻率的一半或者相當。

Linux存儲管理(2)
機械磁盤:
術語:
track:磁道,磁頭在磁盤表面的運行軌跡的投影;
sector:扇區,512Byte,現在所說的扇區,實際上是平均值;最小管理單元;
culinder:柱面,從某個磁道向所有盤片做投影,所形成的圓柱表面;實際上是由所有盤片上相同位置的磁道組成;
partition:分區,從某個柱面到另一個柱面之間所有的柱面存儲空間;
head:磁頭,每個盤片每個磁面都有一個磁頭,用於數據的讀寫操作;

磁盤性能的指標:
主軸轉速:磁盤每分鐘旋轉的圈數;
平均尋道時間:磁頭從初始位置到確定數據所在磁道到移動到所在磁道的時間;時間越少數據讀取速度越快;
緩存:

/dev用於存放硬件設備被映射出的文件,磁盤的設備文件也存放與此;
設備文件:是關聯的硬件設備的驅動程序和設備的訪問入口;
[root@localhost ~]# ls -l /dev
總用量 0
c(文件類型)rw-rw----. 1(鏈接數) root(所有者) video(所屬組) 10(設備號), 175 1月 20 16:52 agpgart
...
設備號:
major,minor

major:主設備號,區分不同設備的設備類型,用於標明設備所需的驅動程序;
minor:次設備號,在同種類型的設備中的不同設備,用於對設備提供訪問入口;

設備類型:
塊設備:
以塊爲基本單位進行隨機訪問的設備,通常都是用來存儲數據的設備;

字符設備:
以字節爲基本單位,進行線性訪問的設備,通常爲處理數據的設備;

設備文件名:
定義方式:最早由此組織IANA(美國國內的一個組織) --> 後來轉交給此組織ICANN來命名管理

/dev
IDE:命名方式必須是以hd開頭的 hd[a-d]
SCSI|SATA|SAS|USB:sd[a-z]+

RedHat Enterprise Linux 從RHEL6開始,將IDE接口的磁盤也命名爲sd*,自此以後所有的磁盤設備被統一命名爲sd[a-z]+

設備的引用方式:
1.設備文件名
2.卷標(Volume Lable) 在當前主機內是一般不會改變(特殊情況:如果把一塊磁盤拔下裝到另一個主機上此主機上的某個磁盤讀的卷標與此個磁盤的卷標相同,那麼只能有一個能夠正常使用;)
3.UUID:全局唯一標識符;Universal Unique IDentifier

mknod命令:
mknod - make block or character special files 創建一個節點設備文件

格式:
mknod [OPTION]... NAME TYPE [MAJOR MINOR]
需要注意的選項:
-m, --mode=MODE:指明權限 如果不使用默認權限爲a=rw - umask

如何使用新的磁盤設備?
1.讓Linux系統內核識別設備,對設備進行分區;
2.格式化
低級格式化:磁盤初始化,磁道劃分;
高級格式化:創建或重建文件系統(只是刪除元數據);
3.使用文件系統:
掛載
卸載

爲何分區:
1.優化磁盤IO性能;
2.可以實現對某個存儲空間的配額限制;
3.進行高速的磁盤問題修復;
4.隔離系統文件和其他應用程序文件;
5.安裝多個操作系統;

如何分區?
MBR:整個磁盤空間小於2TB容量,建議使用MBR分區格式
MBR:Master Boot Record ,主引導記錄,始於1982年;
MBR其實也是一段數據,默認保存在磁盤的0磁道0扇區中;
分爲三部分:
446Bytes:boot loader,引導加載程序;
Windows:NTLDR
Linux:LILO,GRUB(默認)
64Bytes:Partition table,分區表:每16Bytes爲一段,表明一個分區的內容,因此,默認最多隻有四個分區;
1.最多有四分主分區
分區編號依次爲:1 2 3 4
2.想要劃分更多的分區數量時,可以將任意一個主分區改成擴展分區,在擴展分區中建立邏輯分區;
邏輯分區的編號默認從5開始,不管前面的4個數字是否都被佔用;

     sda1,sda3,sda5

   注意:擴展分區可以沒有,最多只能有一個;
  2Bytes:MBR結束標記,55AA;

GPT:整個磁盤空間大於2TB容量,建議使用GPT分區格式:
GUID Partition table,支持128個主分區;
Linux下常用的分區工具:
fdisk:
用於創建和管理MBR分區,對同一塊磁盤,最多隻能管理15個分區;
gdisk:GNU disk
用於創建和管理GPT分區;

注意:
如果使用fdisk或gdisk命令對於一個已經有分區被掛載的磁盤的剩餘空間再次進行分區,即便將分區的結果保存下來,也不會被內核立即識別;

想要讓內核識別出此類新建分區,可以採用下列方法:
  1.重啓計算機:
  2.強制內核重讀分區表:
    partprobe命令
    partx命令

    在RHEL系或CentOS系5|7:
      partprobe -a [device] 使用此命令時不行就去掉 -a試一試
       注意:如果省略了設備名,則表示重讀所有磁盤設備的分區表;強烈建議,直接給出指定的磁盤設備名稱;

    在RHEL系或CentOS系6|7:
      partx -a [device] 只是告訴Linux內核磁盤映射表信息
      kpartx -af [device] 強制重新構建磁盤分區映射表   此命令不是特別推薦使用

fdisk分區工具:
fdisk - manipulate disk partition table 是操作和創建分區表的菜單類工具

格式:
 fdisk  device

 fdisk -l  [device...]

 選項:
  -l :表示查看之意,如果給出設備名稱,則查看指定設備的分區表;否則查看所有磁盤設備文件的分區表;

fdisk device
對於指定設備進行分區管理和操作:
d delete a partition 刪除一個分區
l list known partition types 列表分區類型
m print this menu 顯示幫助菜單
n add a new partition 創建新分區
p print the partition table 顯示分區表
q quit without saving changes 退出不保存修改
t change a partition's system id 修改分區ID
w write table to disk and exit 保存並退出
在fdisk交互式菜單模式中創建分區的過程:
n --> p|e|l-->指明分區的起始扇區(柱面),直接回車使用默認值設置-->分區的結束扇區(柱面),也可以使用+#UNIT直接指定分區大小
如果鍵入時輸入錯誤可以按住Ctrl+退格鍵 進行刪除
parted命令:高級的分區工具,操作結果實時生效
parted - a partition manipulation program
格式:
parted [options] [device [command [options...]...]]
示例:
~]# parted /dev/sda mkpart logical 103GB 105GB(根據自己所分磁盤情況而定) 創建磁盤分區操作
~]#parted /dev/sda rm 4(磁盤號) 直接就能刪除四號磁盤分區

在通電開機狀態下添加SCSI接口的磁盤至本服務器,要想使設備被內識別並創建出相應的設備文件,有下列方法:
1.重啓計算機;
2.~]#echo "- - -" > /sys/class/scsi_host/host2/scan
強制內核識別在通電狀態下熱插接的新SCSI接口的磁道設備;

創建文件系統——分區格式化:
格式化:
低級格式化:
劃分磁道
高級格式化:
創建文件系統,按照某種特定的標準,將整個分區劃分爲大小相同的若干小的邏輯編址單元,每個這樣的單元,稱爲塊(Block);Windows中稱爲簇

劃分塊的標準:
 在Linux的文件系統中,主要的塊劃分標準就是:每個塊包括2^1或2^2或2^3個扇區;即塊大小可以使1024字節,2048字節或者4096字節;

注意:
 1.被劃分出來得塊,每一個塊只能存放一個文件的內容,一個文件可以存儲在多個塊上;
 2.如果在某個分區中,要創建大量的小文件,就將塊大小設置的小些,;反之,如果在某個文件中,要創建的都是大文件,就將塊設置的大一些;
 3.如果分區的空間較大,可以將塊設置的大一些;

FHS——文件系統層級標準
/bin /boot /etc /dev ...

對於數據的管理:
1.平面分類管理(不適合管理磁盤中的文件和數據,適合內存)
遍歷數據
2.空間分類管理(層次化)
邏輯編址:創建文件系統實際上就是給分區進行存儲空間的邏輯編址;
特點:僅需要有限次且有效的查找即可定位到目標文件;

在一個分區中創建文件系統的步驟:
1.首先,文件系統會將分區劃分成大小相等的若干塊;
元數據塊:
其中主要存放文件的屬性:
文件大小、文件權限、文件所有權、文件的時間戳、數據塊指針(直接、間接)

存放每個文件的元數據的固定的存儲空間,稱爲index node,簡稱inode;
在Linux的文件系統中,每個inode大小一般是128Byte;每個inode都有其對應的inode編號;
還有大量的inode可用但是沒有存儲空間了 這時只能創建空文件 但是任何文件都不能增加內容
inode被消耗完 存儲空間還有大量剩餘 也不能創建文件了
可以把現有文件的體積擴大 這是兩種極端情況
一個inode對應着2^3或2^4個數據塊是比較合理的
當inode是一樣  他們所處的分區肯定是不一樣的

數據塊
存放文件中所包含的流式數據的內容;

特殊文件:
只佔據元數據塊中的inode,而不佔數據塊;
設備文件:
Block Special
Character Special

 此類文件是將inode中的數據塊指針換成了設備號;

符號鏈接文件:
 Sumbolic Link
 此類文件是將inode中的數據塊指針換成了另一個文件的訪問路徑;

隨着磁盤空間越來越大我們劃分出來得塊的數量也越來越多因此管理難度就越來越大;通過劃分塊組來解決此問題:

塊組:
每個塊組中有獨立的元數據塊和數據塊;
存放數據的時候,以塊組內的數據優先,如果塊組內的數據塊數量不夠,可以通過文件系統的存儲策略來申請多個塊組協同存儲;

超級塊:
主要定義了在整個分區中有多少個塊組,及每個塊組的邊界;
爲了防止超級塊發生故障導致整個文件系統崩潰,文件系統會自動對超級塊進行備份;

爲了防止數據不一致(inode等分配完畢進行數據寫入的時候發生斷電數據並未寫入或是寫入不完整),在文件系統中引入日誌塊的概念:
日誌塊:對於數據的寫入操作做日誌記錄的塊;

數據不一致通常是由不潔關機、不潔斷電導致;

一個完整的Linux文件系統:
超級塊,inode,inode bitmap,block bitmap,data block,journal block

想要查找/var/log/message文件的內容,是怎樣的查找過程?

目錄:內容是文件名;

每個文件名是文件的特有的標識,每個文件名都對應一個inode;

Linux支持的文件系統:
位於內核空間中的文件系統驅動:/usr/lib/modules/KERNEL-VERSION/kernel/fs/
文件系統可以是內核的一部分,也可以是內核的模塊;

位於用戶空間中的文件系統管理程序:
通常是各種各樣的管理命令(用於調整內核屬性);

Linux支持的文件系統:
1.Linux專屬的文件系統:
ext系列:ext、ext2、ext3、ext4
ext4特性:
單個分區最大50TB;
單個文件最大64EB;
可以在根分區上設置;
可以在啓動分區上設置;
2.xfs:最大分區500TB,...
3.reiserfs:
4.btrfs:技術預覽版
5.ISO9660:光盤文件系統
6.FAT:vfat
7.NTFS:默認不支持,但是可以通過調整內核參數以獲得支持
8.網絡文件系統:NFS、CIFS
9.集羣文件系統:gfs2、ocfs2
10.分佈式文件系統:
內核級:ceph
用戶空間(應用級):mogilefs、moosefs、glusterfs
11.Unix的文件系統:ufs、FFS、JFS、zfs
12.僞文件系統:proc、sys、tmpfs、hugepagefs
並非管理磁盤數據的文件系統,而是管理內存數據的文件系統

對於不同的發行版本的Linux,都有其默認使用的文件系統:
RHEL或CentOS系列:
5:ext3
6:ext4
7:xfs

管理文件系統:
創建文件系統:
使用文件系統(掛載文件系統):
停止使用文件系統(卸載文件系統):
文件系統的監測和修復:

創建文件系統的用戶空間工具:
mkfs
mkfs - build a Linux filesystem
mkfs [options] [-t type] [fs-options] device [size]

RHEL或CentOS系發行版中,可以使用mkfs,ext4,mkfs.btrfs,...等工具來代替mkfs創建文件系統;

示例:
]# mkfs -t ext4 /dev/sdb1
]# mkfs.ext4 /dev/sdb2

注意:
1.不要使用磁盤設備名稱或擴展分區設備名稱作爲mkfs命令的參數;
如果使用磁盤設備名稱作爲mkfs命令的參數,則所有分區都將被刪除;
如果使用擴展分區設備作爲mkfs命令的參數,則所有的邏輯分區都將被刪除;

2.只有主分區和邏輯分區才能使用mkfs命令創建文件系統;

3.如果要創建的目標文件系統是ext系列文件系統,那麼可以使用mke2fs命令;
mke2fs
mke2fs - create an ext2/ext3/ext4 filesystem
常用選項:
-b block-size:在創建文件系統時,指定每個塊的大小:默認值是4096字節,單位是字節;調整時,只能寫1024,2048及4096;
-i bytes-per-inode:在創建文件系統時,指定inode與字節的比率;即:多少個字節創建一個inode,默認值是16384;
-j:創建有日誌功能的文件系統,即:ext3
-L new-volume-label:在創建文件系統時指定卷標
-m reserved-blocks-percentage:在創建文件系統時,指定爲管理員保留磁盤空間的百分比;默認值是5;
-n:並非真正創建文件系統,而是顯示在創建文件系統時所做的操作;
-N number-of-inodes:在創建文件系統時直接指明在此文件系統中創建的inode的數量;
-O [^]feature[,...]:在創建文件系統時,關閉或開啓文件系統特性;
-t fs-type:在創建文件系統時,指定文件系統類型

修改ext系列文件系統的卷標:
e2label命令:
e2label - Change the label on an ext2/ext3/ext4 filesystem
e2label device [ new-label ]
注意:如果不加new-label參數,則是查看指定設備的卷標;如果添加了new-label參數,則直接將設備的卷標設置爲new-label,而不考慮原來是否有卷標也不考慮原卷標是什麼;

修改ext系列文件系統的屬性,可以使用tune2fs命令:
tune2fs - adjust tunable filesystem parameters on ext2/ext3/ext4filesystems
在ext2/ext3/ext4文件系統上調整那些可以被調整的參數;
常用選項:
-l:顯示超級塊的信息;
-j:將ext2文件系統修改調整爲ext3文件系統;
-m reserved-blocks-percentage:調整系統預留百分比;
-r reserved-blocks-count:調整文件系統中預留的磁盤空間的塊數 ;
-L volume-name:修改卷標;
-O [^]feature[,...]:修改文件系統特性是否開啓;

文件系統的監測和修復工具:
fsck:
fsck - check and repair a Linux filesystem
fsck [-ars] [-t fstype] [filesystem...]
常用選項:
-t fstype:指定要檢測的文件系統的文件系統類型;
-a:無需交互,自動修復監測到的所有問題;
-r:交互式修復監測到的問題

ext系列文件系統專用的檢測修復工具:
e2fsck:
e2fsck - check a Linux ext2/ext3/ext4 file system
e2fsck [-y] [-f] device
常用選項:
-y:在交互式過程中所有的問題都以“yes”來回答;
-f:表示強制檢測並修復;即使文件系統處於clean狀態也修復;

blkid:顯示所有被格式化的文件系統
blkid - locate/print block device attributes 定位顯示塊設備的屬性
常用選項:
-L label:根據指定的卷標進行塊設備查找定位;
-U UUID:根據指定的UUID進行塊設備的查找定位;

findfs:
findfs - find a filesystem by label or UUID
findfs [LABEL=<label>] [UUID=<uuid>]

swap文件系統:
前提:分區的類型必須是swap類型,即:分區的系統ID必須是82
修改方法:在fdisk的交互模式中,使用t命令將制定的分區類型修改爲82即可;
創建swap文件系統:
mkswap命令:
mkswap - set up a Linux swap area
mkswap [options] device [size]

常用選項:
-f, --force: 強制執行;
-L, --label label:設置交換分區的卷標;
-U, --uuid UUID:指定交換分區的UUID,建議讓系統自動生成;
示例:
~]# mkswap /dev/sdb3(前提是你得有這個分區!!且文件系統爲swap)

利用一個大文件創建交換分區:
 示例:

[root@localhost ~]# dd if=/dev/zero of=/tmp/swapfile bs=1024 count=1024000
記錄了1024000+0 的讀入
記錄了1024000+0 的寫出
1048576000字節(1.0 GB)已複製,29.527 秒,35.5 MB/秒
[root@localhost ~]# mkswap /tmp/swapfile
正在設置交換空間版本 1,大小 = 1023996 KiB
無標籤,UUID=c77df934-45a4-4575-8046-c75413c0ac8b

使用文件系統——掛載
掛載:
對於Linux系統來說,文件系統只能有一個唯一的一個原初訪問入口,次訪問入口被稱爲“根文件系統”;其他所有的文件系統,都必須通過某個特定方式關聯至根文件系統或者根文件系統的子目錄中,而此關聯過程被稱爲“掛載”;用於根文件系統和其他文件系統的目錄,就被稱爲“掛載點”;

掛載點:mount point,通常是一個目錄,該目錄在成爲掛載點之後,就是其他文件系統的訪問入口;如:/boot
 要求:
  1.作爲掛載點的目錄必須事先存在
  2.作爲掛載點的目錄應該是沒有被使用或不能被其他進程佔用的目錄,換言之,必須是空閒的目錄;
  3.作爲掛載點的目錄,一旦掛載其他文件系統,則失去原文件系統中的特性;簡單說,如果一個目錄中有文件名,一旦掛載了其他文件系統,則原來的文件名爲不可見,這樣的目錄中的新的內容是新文件系統中的文件名;這個過程會一直持續到新文件系統被卸載;

完成掛載操作,使用mount命令:
mount - mount a filesystem
mount [-lhV]

mount -a [-fFnrsvw] [-t vfstype] [-O optlist]

mount [-fnrsvw] [-o option[,option]...] device|dir

mount [-fnrsvw] [-t vfstype] [-o options] device dir
常用選項:
-r, --read-only:以只讀方式掛載目標文件系統,通常用於光盤掛載;
-w, --rw, --read-write:以可讀可寫的方式掛載目標文件系統;通常是默認的
-n, --no-mtab:默認情況下所有掛載塊設備的操作都會被自動記錄在/etc/mtab文件中,如果用了-n,--no-matab選項,則表示即便掛載成功,也不會將改在信息記錄在/etc/mtab
-t, --types vfstype:在掛載文件系統時指明文件系統的類型,如果省略該選項,mount命令會通過blkid命令來判斷要掛在的目標文件系統的類型;
-L, --label label:通過指定系統的卷標來掛載目標文件系統;
-U, --uuid uuid:通過指定的文件系統的UUID掛載目標文件系統;
-a, --all:根據/etc/fstab文件中指定的文件系統進行自動掛載;
-o, --options opts:在掛載目標文件系統時,可以調整掛載參數選項;
FILESUSTEM INDEPENDENT MOUNT OPTIONS:
sync/async:同步/異步掛載選項;(同步只要數據在內存中被修改會立即同步到文件系統中對數據的可靠性具有保證但消耗IO過多,異步是等到磁盤比較空閒的時候數據纔會進行同步)
atime/noatime:文件或目錄被訪問時,是否更新訪問時間戳;
diratime/nodiratime:目錄被訪問時,是否更新訪問時間戳;
ro/rw:是以只讀方式,還是以可讀可寫方式掛在文件系統,相當於-r/-w選項的功能;
dev/nodev:在此文件系統中是否允許創建設備文件
exec/noexec:在此文件系統中是否允許運行程序文件,包括各種二進制文件和各種腳本;
auto/noauto:在掛載此文件系統時是否能夠使用-a選項進行掛載;
user/nouser:是否允許普通用戶掛載此文件系統;
suid/nosuid:在此文件系統中是否允許程序文件上的SUID和SGID這樣的特殊權限生效;
relatime/norelatime:在此文件系統中是否參考inode訪問時間來修改其改動時間戳和修改時間戳;
remount:對於目標文件系統無需卸載就可以應用新的掛載選項;
acl:只在ext系列文件系統或xfs文件系統中使用,可以使用文件系統的facl功能;
defaults:默認選項,其中包括:suid,dev,exec,auto,nouser,and async
loop:使用環回設備,將鏡像文件當做文件系統掛載至指定的掛載點;
-B, --bind:將某個已經掛載的文件系統綁定至另一個掛載點;
示例: mount -B | --bind mount_point1 mount_point2

示例:

mount /dev/sdb1 /mnt/sdb1

mount -o remount,ro /mnt/sdb1

卸載已經掛載的文件系統:
umount命令:
umount -a [-dflnrv] [-t vfstype] [-O options]
卸載當前已經掛載的文件系統中的所有可卸載的文件系統;
umount [-dflnrv] {dir|device}...
通過指定掛載點或設備名稱,卸載指定設備;

掛載光盤:
在虛擬機中,需要保證光盤鏡像文件被放入虛擬機的光驅,並且保證虛擬機的光驅處於“已連接”的狀態,需要實現創建掛載點(/mnt/cdrom);

mount -r /dev/sr0 /mnt/cdrom

掛載交換分區:
swapon

卸載交換分區:
swapoff

swapon, swapoff - enable/disable devices and files for paging and swapping
-a, --all:自動掛載/etc/fstab文件中被正確定義的所有的交換分區

/etc/fstab文件的格式:(工作面試必考題)
共6個字段,默認使用空白字符(製表符)作爲字段分隔符;6個字段的含義分別爲:
1.要掛載的設備或文件系統名稱,也可以是卷標或UUID
如果使用卷標必須使用:LABEL="label"
如果使用UUID必須使用:UUID="uuid"

2.掛載點:
swap設備或文件無需掛載點,在此字段寫swap即可;

3.文件系統類型

4.默認的文件系統掛載選項:想要指定多個選項時使用逗號分隔的列表;
defaults,ro,sync

5.轉儲頻率:
使用dump命令自動備份分區數據的頻率;
0:表示不備份
1:每天備份一次
2:每沒兩天備份一次,即:每隔一天備份一次;

6.自檢次序:
0:不自檢
1:優先自檢,通常僅設置在根文件系統上;
2:次級自檢;
...
9:最低優先級自檢;

/etc/fstab文件的作用:
在系統啓動過程中,會自動掛載文件中所有被正確列出的文件系統;
RAID:Redundant Arrays of Inexpensive Disks,廉價磁盤冗餘陣列;
Redundant Arrays of Independent Disks,獨立磁盤冗餘陣列;

1988年,UC Berkeley提出的"A Case for Redundant Arrays of Inexpensive Disks",旨在將多個相對廉價的IDE接口的磁盤組合成一個"陣列",並不是將磁盤簡單的羅列在一起,而是根據特定規則進行組合,從而可以實現提高IO性能,實現磁盤冗餘容錯,或者此二功能兼具;

RAID的好處:
    提高IO性能:磁盤並行讀寫機制;
    提高磁盤耐用性:通過磁盤冗餘實現容錯;

RAID的級別:
    多塊磁盤組織在一起的工作方式;

RAID的實現方式:
    基於硬件實現:
        外接式磁盤陣列:通過擴展接口或擴展插槽提供具有RAID功能的適配硬件設備;
        內接式磁盤陣列:主板集成的RAID控制器;

    基於軟件模擬實現:
        通過應用程序模擬硬件功能;

RAID的功能級別:
    RAID-0:條帶卷,strip
        讀寫性能提升
        磁盤可用空間:N*min(S1,S1,...)
        磁盤空間利用率:100%
        無容錯能力
        至少需要2塊磁盤

    RAID-1:鏡像卷,mirror
        讀性能提升,寫性能有所下降;
        磁盤可用空間:1*min(S1,S2,...)
        磁盤利用率:1/N
        具備容錯能力
        至少需要2塊磁盤

    RAID-2
    ...
    RAID-5:帶有奇偶校驗信息的條帶卷;
        讀寫性能均提升
        可以磁盤空間:(N-1)*min(S1,S2,...)
        磁盤利用率:(N-1)/N
        具備容錯能力
        至少需要3塊磁盤

    RAID-6:雙重奇偶校驗的條帶卷;
        讀寫性能均提升
        可以磁盤空間:(N-2)*min(S1,S2,...)
        磁盤利用率:(N-2)/N
        具備容錯能力
        至少需要4塊磁盤

RAID的混合級別:
    RAID-10
        讀、寫性能提升
        具備容錯能力
        磁盤利用率:1/2
        至少需要4塊磁盤

    RAID-01
        讀、寫性能提升
        具備容錯能力
        磁盤利用率:1/2
        至少需要4塊磁盤

    RAID-50
        讀、寫性能提升
        具備容錯能力
        至少需要6塊磁盤

    JBOD:Just a Bunch Of Disks,僅僅是一組磁盤;將多塊磁盤的空間合併成一個更大的連續的存儲空間;有人將此方式稱爲"跨區";

對於RAID,常用的級別:
    RAID-0, RAID-1, RAID-5, RAID-10, RAID-50,JBOD

CentOS系統上可以提供軟件RAID的實現:
    內核中的md(multi devices)模塊

    mdadm:模塊化的工具;
        mdadm - manage MD devices aka Linux Software RAID

        mdadm [mode] <raiddevice> [options] <component-devices>

        支持的RAID級別:
            Currently,  Linux  supports  LINEAR md devices, RAID0 (striping), RAID1 (mirroring), RAID4, RAID5, RAID6, RAID10, MULTIPATH, FAULTY, and CONTAINER.

        [mode]:
            創建模式:-C, --create
            裝配模式:-A, --assemble
            監控模式:-F, --follow, --monitor
            管理模式:無選項開關
            增長模式:-G, --grow
            混雜模式:-D, -S 

            create, build, or grow:
                -n, --raid-devices=
                    指定參與軟RAID的磁盤的數量;
                -l, --level=
                    When used with --create, options are: linear, raid0, 0, stripe, raid1, 1, mirror, raid4, 4, raid5, 5, raid6, 6, raid10, 10,  mul tipath, mp, faulty, container. 
                -x, --spare-devices=
                    指定陣列中空閒的用於自動故障倒換使用的設備數量;
                -c, --chunk=
                    指定條帶化級別的RAID中,每個區塊(CHUNK)的大小;
                -a, --auto{=yes,md,mdp,part,p}{NN}
                    自動創建目標RAID設備文件;

            Manage mode:
                -a, --add:向陣列中添加新設備;
                -r, --remove:從陣列中移除設備;
                -f, --fail:將設備標記爲失效;

            Misc mode:
                -D, --detail:顯示陣列信息;
                    通過輸出重定向保存陣列的裝配記錄:
                        mdadm -D --scan >> /etc/mdadm.conf
                -S, --stop:停止陣列功能;

        示例:
            ~]# mdadm -C md0 -n 4 -l 5 -a yes /dev/sdb /dev/sdc /dev/sdd /dev/sde
            ~]# mdadm -S /dev/md0

        查看md設備的信息:
            ~]# mdadm -D 

        保存裝配信息:
            ~]# mdadm -D --scan >> /etc/mdadm.conf

        重新裝配md陣列:
            ~]# mdadm -A /dev/md0

LVM——Logical Volume Management, 邏輯卷管理器;
LVM2——LVM Version 2
使用純軟件的方式組織一個或多個底層的物理塊設備,將他們重新定義爲一個邏輯塊設備的解決方案;

利用linux內核中dm模塊實現;
dm:device mapper,設備映射;

dm模塊可以將一個或多個底層設備,按照預期規劃組織成特定的形式,從而實現更高級的邏輯磁盤管理方式;

需要用戶空間中的命令向dm模塊發出系統調用,纔可以進行邏輯塊設備管理;

使用DM模塊實現LVM管理的一般性步驟:
    1.創建並標識物理卷,PV
    2.基於PV創建卷組,即邏輯塊設備(VG),同時指定PE的大小;
        注意:一旦卷組創建完成,則PE的大小將固定下來,其值無法再次進行修改;如果想要調整PE大小,只能重新定義卷組;
    3.在已有的卷組中,創建邏輯卷;
    4.需要在邏輯卷中創建文件系統(高級格式化);
    5.掛載;

物理卷的管理:
注意:如果想要讓一個基本分區成爲物理卷,必須將分區的系統ID修改爲8e;

物理卷管理的相關命令:
    pvcreate:將普通的塊設備創建爲物理卷設備;創建物理卷;
    pvremove:將物理卷設備轉變爲普通塊設備;刪除物理卷;
    pvdisplay:顯示物理卷的詳細信息;
    pvs:顯示物理卷的簡短信息;
    pvmove:將某個物理卷中的所有被LV佔用的PE移動到其他的物理卷中;

卷組管理的相關命令:
    vgcreate
    格式:
        vgcreate [OPTIONS] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]

        -s, --physicalextentsize PhysicalExtentSize[bBsSkKmMgGtTpPeE]
            用於指定PE的大小,默認單位爲MiB,默認的大小爲4MiB;

    vgreduce:從卷組中移除物理卷;
        注意:必須保證被移除的物理捲上沒有被佔用的PE;如果有,則需要先對物理卷執行pvmove命令,再執行移除操作;
    vgextend:向卷組中添加物理卷;
    vgdisplay:顯示卷組的詳細信息;
    vgs:顯示卷組的簡短信息;

邏輯卷管理的相關命令:
    lvcreate:創建邏輯卷
        -L, --size LogicalVolumeSize[bBsSkKmMgGtTpPeE]
            指定邏輯卷的大小,其值不能超出卷組的容量;
        -l, --extents LogicalExtentsNumber[%{VG|PVS|FREE|ORIGIN}]
            在創建邏輯卷時,指定邏輯卷中包含的LE的數量或者某個特定值的百分比;
        -i, --stripes Stripes
            在創建邏輯卷時,以條帶的方式創建,並指明在邏輯捲上的條帶的數量;
        -n, --name LogicalVolume{Name|Path}
            指明邏輯卷的名稱;
        -s, --snapshot OriginalLogicalVolume{Name|Path}
            創建快照卷;
        -p, --permission {r|rw}
            創建邏輯卷時指明此邏輯卷的操作權限;
        -a, --activate {y|ay|n|ey|en|ly|ln}
            -ay:創建邏輯卷的命令執行之後立即激活邏輯卷
            -an:創建邏輯卷的命令執行之後將邏輯卷設置爲停用狀態;

    lvs:
    lvdisplay:
    lvextend:擴展邏輯卷的物理邊界;
        -L [+]SIZE[kKmMgGtT] /PATH/TO/LV

    resize2fs [-f] /PATH/TO/LV

        注意:擴展邏輯卷的空間,可以在線進行;

        擴展邏輯卷的示例:
            ~]# lvextend -L +10G /dev/qhdlink/class18
            ~]# resize2fs -f /dev/qhdlink/class18

    lvreduce:縮減邏輯卷的物理邊界;
        lvreduce -L [-]SIZE[kKmMgGtT] /PATH/TO/LV

    resize2fs [-f] /PATH/TO/LV LV_SIZE
        注意:
            1.在縮減邏輯卷空間時,先縮減邏輯邊界,再縮減物理邊界;
            2.縮減邏輯卷空間前,先卸載並停用邏輯卷,縮減之後,再啓用掛載即可;
            3.建議在縮減邏輯卷之前,對文件系統進行檢測,以保證數據一致性;

        縮減邏輯卷的示例:
            ~]# umount /mnt/lvm
            ~]# e2fsck /dev/qhdlink/class18
            ~]# resize2fs -f /dev/qhdlink/class18 10G
            ~]# lvchange -an /dev/qhdlink/class18
            ~]# lvreduce -L 10G /dev/qhdlink/class18
            ~]# lvchange -ay /dev/qhdlink/class18
            ~]# mount /dev/qhdlink/class18 /mnt/lvm

邏輯卷的快照:
    快照:其本身也是邏輯卷,可以將其視爲做快照的目標邏輯卷的另外一個訪問路徑;

    快照卷是一種特殊的邏輯卷,在其創建之初,其存儲空間並沒有任何消耗;只有當原來的邏輯卷中數據發生變化時,纔會消耗快照卷空間;

    快照卷中只包含原有邏輯卷中被更改的數據或自生成快照邏輯卷之後快照卷中更改的數據;

    快照卷也可以使用lvextend進行擴容;

    通常來說,快照卷和原卷會共用很多的PE,因此快照卷與原卷就必須在同一VG上;在從快照卷備份數據的過程中,必須要保證,變化的數據文件的總量不能超過快照卷大小;

    創建快照卷:
        lvcreate -L SIZE_SNAPSHOP -s -p r -n LV_NAME_SNAPSHOT /PATH/TO/LV_ORIGIN

        示例:
            ~]# lvcreate -L 5G -s -p r -n snap_class18 /dev/qhdlink/class18
            ~]# mkdir /mnt/snapshot
            ~]# mount /dev/qhdlink/snap_class18 /mnt/snapshot/

            完成數據的備份之後:
            ~]# umount /mnt/snapshot/
            ~]# lvremove /dev/qhdlink/snap_class18
    btrfs:
    文件系統;
    Btree-FS,Better FS,Butter FS
    2007年由Oracle開源,得到IBM,Intel等廠商的支持,其開發目的就是爲了替換ext3/4,成爲下一代Linux上的標準文件系統;

    在2014那年8月之前,btrfs都是技術預覽版(Technical Preview)

    btrfs的特性:
        1.可擴展性:
        2.多物理卷支持;
        3.寫時複製的數據更新機制(CoW);
            更新、修改等操作是在複製之後替換指針;
        4.數據及元數據的校驗碼;
        5.子卷管理;
        6.快照,快照的快照;文件的快照;
        7.透明壓縮,隱形壓縮;

創建btrfs:
    mkfs.btrfs  |  mkfs -t btrfs
        mkfs.btrfs - create a btrfs filesystem
        格式:
            mkfs.btrfs [OPTIONS] device [device ...]
            常用選項:
                -d|--data <type>:爲數據存儲指明硬件設備的組織形式:
                    Valid values are raid0, raid1, raid5, raid6, raid10 or single.

                -m|--metadata <profile>:爲元數據的存儲指明硬件設備的組織形式:
                    Valid values are raid0, raid1, raid5, raid6, raid10, single or dup.

                -L|--label <name>:爲即將創建的btrfs指定文件系統卷標;

                -O|--features <feature1>[,<feature2>...]:指定btrfs文件系統的特;
                    如果想要查看能夠提供哪些特性,使用mkfs.btrfs -O list-all查看;

透明壓縮功能的支持:
    # mount -o compress={lzo|zlib} DEVICE MOUNT_POINT

btrfs命令:
    btrfs - control a btrfs filesystem
        btrfs <command> [<args>]

        <command>:
            filesystem:
                btrfs-filesystem - control btrfs filesystem
                    btrfs filesystem <subcommand> <args>
                        df [options] <path>
                            顯示btrfs文件系統的空間使用率;
                        label [<dev>|<mountpoint>] [<newlabel>]
                            查看或設置btrfs文件系統的卷標;
                        resize [<devid>:][+/-]<size>[kKmMgGtTpPeE]|[<devid>:]max <path>
                            在線修改文件系統的大小;
                        show [--mounted|--all-devices|<path>|<uuid>|<device>|<label>]
                            查看btrfs文件系統相關的信息;
                        sync <path>
                            強制將內存中的數據同步至文件系統;
                        usage [options] <path> [<path>...]
                            查看btrfs文件系統上各硬件設備的磁盤使用率;

            device:
                btrfs-device - control btrfs devices
                    btrfs device <subcommand> <args>
                        add [-Kf] <dev> [<dev>...] <path>
                            向btrfs文件系統中添加新設備;
                        delete <dev> [<dev>...] <path>
                            從btrfs文件系統中刪除設備;

            balance:
                btrfs-balance - balance btrfs filesystem
                    btrfs balance <subcommand> <args>
                        start [options] <path>  
                            在線調整跨設備的chunk;修改數據及元數據的組織方式;
                            -d[<filters>]
                                -dconvert={raid0, raid1, raid10, raid5, raid6, single.}
                            -m[<filters>]
                                -mconvert={raid0, raid1, raid10, raid5, raid6, dup, single.}
                            -s[<filters>]
                                -sconvert={raid0, raid1, raid10, raid5, raid6, single.}
                        pause <path>
                            暫停正在運行的平衡操作;
                        cancel <path>
                            撤銷此前的正在運行或暫停的平衡操作;
                        status [-v] <path>
                            查看平衡過程的狀態;
                        resume <path>
                            恢復被打斷的平衡過程;

            subvolume:
                btrfs-subvolume - control btrfs subvolume(s)
                    btrfs subvolume <subcommand> [<args>]
                        create [-i <qgroupid>] [<dest>]<name>
                            創建子卷;
                        delete [options] <subvolume> [<subvolume>...]
                            刪除子卷;
                        snapshot [-r] <source> <dest>|[<dest>/]<name>
                            爲指定的子卷創建快照卷;

ext系列文件系統和btrfs之間安全轉換:
    btrfs-convert
        btrfs-convert - convert from ext2/3/4 filesystem to btrfs or rollback
            btrfs-convert [options] <device>

            從ext轉換至btrfs:
                btrfs-convert /dev/sde1

            從btrfs回滾至ext:
                btrfs-convert -r /dev/sde1

        注意:轉換操作需要提前將設備卸載;

磁盤配額:
文件服務器:通過共享存儲空間,讓用戶能夠隨時利用網絡進行數據存儲的服務器;
FTP
HTTP
NFS
Samba
...

磁盤配額主要是針對於這種文件服務器進行的用戶磁盤空間的限制而提出的解決方案

磁盤配額的設定對象:
    能夠通過網絡進行實時寫操作的塊設備,要求其文件系統必須支持磁盤配額功能;

針對用戶賬戶和組賬戶進行磁盤配額設定:
    1.用戶賬戶:
        爲指定的用戶賬戶設置特定的磁盤使用量:
            1) 磁盤空間使用量
            2) inode節點使用量(文件的數量)
    2.組賬戶:
        限制指定的組中所有成員的磁盤使用量的總和;

磁盤配額的限制種類:
    soft limit:軟限制,警告;
        當用戶賬戶的磁盤使用量達到軟配額限制,將會啓動寬限期的計時器,在計時器歸零之前,用戶可以正常使用剩餘的磁盤配額容量;一旦計時器倒計時爲零,則不允許用戶繼續使用剩餘的配額容量;除非用戶將其中的數據刪減至軟配額限制以下;

    hard limit:硬限制,絕對極限;
        用戶存儲的數據一旦達到該限制數值,則絕對無法繼續使用多餘的磁盤空間;因此,這是用戶磁盤配額的真正上限;

在正確的設置了配額選項之後,可以創建出一個用於記錄用戶和組的磁盤使用量的文件;
    aquota.user
    aquota.group

如果想要創建出上述配額文件,需要在指定的文件系統上配置磁盤配額選項:
    usrquota
    grpquota

設置配額選項:
    1.使用命令:
        mount -o usrquota,grpquota DEVICE MOUNT_POINT

    2.寫入/etc/fstab文件中:
        DEVICE  MOUNT_POINT     FSTYPE  defaults,usrquota,grpquota 0 0

在設置了正確的配額選項的文件系統上檢查並創建配額文件:
    quotacheck
        quotacheck  -  scan  a filesystem for disk usage, create, check and repair quota files
            常用選項:
                -v, --verbose:顯示操作過程的詳細信息;
                -u, --user:
                -g, --group:
                -c, --create-files:
                -a, --all:

用於編輯配額文件內容的命令:
    edquota
        edquota - edit user quotas
            常用選項:
                -u, --user:
                -g, --group:
                -t, --edit-period:編輯寬限期,默認是7days;
                    可用的時間單位:'seconds',  'minutes', 'hours', and 'days'

開啓或關閉指定文件系統上的配額功能:
    quotaon, quotaoff
        quotaon, quotaoff - turn filesystem quotas on and off

        quotaon|quotaoff filesystem...

檢查磁盤使用量和配額使用情況:
    quota
        quota - display disk usage and limits

    repquota——查看配額文件的內容,只有root用戶才能使用;
        repquota - summarize quotas for a filesystem

注意:root用戶不受磁盤配額限制;

Linux系統中常用的壓縮和解壓縮工具:
壓縮:以時間換空間的一種操作;(一般來說是原來的大文件沒有了,換來的是壓縮後產生的小文件)
壓縮的實現:標記+替換 函數就可以理解成一種壓縮
壓縮比:某個文件在壓縮操作之前與壓縮操作之後的文件大小的比值
通常來說純文本類文件壓縮比比較大

Linux中常用的壓縮工具:
compress/uncompress
會在文件名的後面增加.Z的後綴名稱:xxx.Z

gzip/gunzip
會在文件名的後面增加.gz的後綴名稱:xxx.gz

bzip2/bunzip2
會在文件名的後面增加.bz2的後綴名稱:xxx.bz2

xz/unxz
會在文件名的後面增加.xz的後綴名稱:xxx.xz

zip/unzip
會在文件名的後面增加.zip的後綴名稱:xxx.zip
注意:保留原文件,並且額外製造出一個壓縮包文件

gzip工具:
gzip, gunzip, zcat - compress or expand files
純文本文件壓縮後可以用zcat來查看文件中的內容
常用選項:
-d --decompress --uncompress:解壓縮 ,相當於gunzip
-# --fast --best:指定壓縮時使用使用的壓縮比,有效範圍1-9,--fast相當於-1 --best相當於-9,默認是-6;
-c --stdout --to-stdout:將壓縮結果輸出到標準結果,但並不進行壓縮操作

bzip2工具:
bzip2, bunzip2 - a block-sorting file compressor
bzcat - decompresses files to stdout
常用選項:
-d --decompress:解壓縮
-k --keep:保留原文件,並且額外製造出一個壓縮包文件
-c --stdout:將壓縮結果輸出到標準結果,但並不進行壓縮操作
-1 (or --fast) to -9 (or --best):指定壓縮時使用使用的壓縮比,有效範圍1-9,--fast相當於-1 --best相當於-9,默認是-9

xz工具:
xz, unxz, xzcat, lzma, unlzma, lzcat - Compress or decompress .xz and .lzma files
-d --decompress --uncompress:解壓縮
-k --keep:保留原文件,並且額外製造出一個壓縮包文件
-c --stdout:將壓縮結果輸出到標準結果,但並不進行壓縮操作
The following table summarises the features of the presets:

                 Preset   DictSize   CompCPU   CompMem   DecMem
                   -0     256 KiB       0        3 MiB    1 MiB
                   -1       1 MiB       1        9 MiB    2 MiB
                   -2       2 MiB       2       17 MiB    3 MiB
                   -3       4 MiB       3       32 MiB    5 MiB
                   -4       4 MiB       4       48 MiB    5 MiB
                   -5       8 MiB       5       94 MiB    9 MiB
                   -6       8 MiB       6       94 MiB    9 MiB
                   -7      16 MiB       6      186 MiB   17 MiB
                   -8      32 MiB       6      370 MiB   33 MiB
                   -9      64 MiB       6      674 MiB   65 MiB

zip工具:
zip - package and compress (archive) files
格式:
zip [options...] [zipfile [file ...]]
-P password 加壓縮密碼

unzip:
 -l:查看壓縮包中的文件列表;

tar命令:歸檔
tar [OPTION...] [FILE]...
選項:
主選項:
-c, --create:創建檔案文件;
-r, --append:向一個已經存在的檔案文件的末尾添加新的文件;(不常用)
-t, --list:列表顯示一個檔案的內容;
-u, --update:僅向檔案文件的末尾追加內容比檔案文件中的內容更新的文件;(更常用)
-x, --extract, --get:從檔案中獲取文件,釋放文件;
輔助選項:
-f, --file=ARCHIVE:使用檔案文件時,用於指明檔案文件的選項;
-C, --directory=DIR:在釋放檔案中的文件時,不是釋放到當前目錄而是指定一個額外的路徑來存放被釋放的文件;
-j, --bzip2:主要用於創建檔案文件時,選擇使用bzip2工具壓縮檔案文件;
-J, --xz:主要用於創建檔案文件時,選擇使用xz工具壓縮檔案文件;
-z, --gzip:主要用於創建檔案文件時,選擇使用gzip工具壓縮檔案文件;
-k, --keep-old-files:在釋放檔案中的文件時,如果目標位置有與檔案中同名的文件,則此類文件不釋放;保證文件系統中的文件不會被檔案中的同名文件覆蓋;
--exclude=PATTERN:在釋放檔案中的文件時,被PATTERN匹配到的文件將不被釋放;
-v, --verbose:顯示詳細過程

注意:
 在使用tar命令時,其後的主選項可以不使用“-”;

vim的末行模式中的查找和替換操作:
/或?進行模式查找;

兩種特殊文件:
1.數設備文件:
    mknod
    其元數據中原本用來保存據塊指針的位置,存放的是設備號信息;
2.符號鏈接文件:
    其元數據中原本用來保存數據塊指針的位置,存放的是另一個文件的訪問路徑;

鏈接文件:
鏈接:
將文件的元數據部分和數據部分關聯起來的過程;
訪問一個文件的路徑;

硬鏈接:
    在inode中的數據塊指針指向的數據塊的鏈接,稱爲硬鏈接;
    也可以解釋爲:同一個數據塊內容的不同數據塊指針;
    一個文件的數據內容可以被多個元數據指向,因此可以有多個硬鏈接;表現爲這個文件的數據可以使用不同的路徑進行訪問;

    硬鏈接的特點:
        1.不能跨文件系統建立硬鏈接;
        2.不能對目錄建立硬鏈接;
        3.每次對目標文件建立硬鏈接,其鏈接計數會自動增加inode的引用計數;

符號鏈接(軟鏈接):
    獨立的文件;
    用於存儲被鏈接文件的訪問路徑信息的文件;

    符號鏈接的特點:
        1.可以跨文件系統建立符號鏈接;
        2.目錄也可以創建符號鏈接;
        3.通過符號鏈接查找到被鏈接文件的數據內容,過程變得更加繁瑣;因爲需要查找兩組路徑信息;
            /etc/grub.conf --> /boot/grub/grub2.cfg

ln命令:
    ln - make links between files
    格式:
        ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
        ln [OPTION]... TARGET                  (2nd form)
        ln [OPTION]... TARGET... DIRECTORY     (3rd form)

    常用選項:
        -s, --symbolic:創建符號鏈接;如果不加此選項,即爲創建硬鏈接;
        -v, --verbose:顯示鏈接建立的過程;

應用程序發佈的版本管理:
將不同版本的應用程序分別存放於不同的目錄中,通過符號鏈接鏈接至某個版本的應用程序目錄,如果新版應用程序出現問題或BUG,只需將符號鏈接文件鏈接至以前的某個文檔版本,即可實現應用程序回滾;

末行命令中的s命令,是進行替換的命令;s是先查找再根據模式進行替換;

:[address]s/PATTERN/STRING/CONTROL

[address]:地址定界符
    1.如果省略,則表示光標所在行;
    2.#:該數值所代表的行;
    3.$:當前文檔的最後一行;$-1表示當前文檔的倒數第二行,...
    4.m,n:m和n都表示數字,其含義爲從第m行到第n行;
    5.m,+n:m和n都表示數字,其含義爲從第m行開始,向後再累計計算n行;7,+3 == 7,10
    6./PATTERN/:被PATTERN匹配到的行;
    7./PATTERN1/,/PATTERN2/:從被PATTERN1匹配到的行開始,到被PATTERN2匹配到的行結束;
    8.%:所有行;

PATTERN:要進行替換的內容必須被PATTERN匹配;
STRING:純字符串,不識別正則表達式的元字符,替換操作的結果;
CONTROL:
    g:當前行內所有匹配的字符全部替換;
    c:手動控制替換操作;

sed命令:
sed:Stream EDitor,流編輯器
行編輯操作工具;
sed在實施文本文件處理時,是以行爲單位對一個或多個文件進行編輯處理;每次sed會處理給定的文件中的一行內容;

sed在處理文件文件時,將正在處理的當前行存儲到臨時的內存緩存區中,稱爲"模式空間";所謂的"模式空間"是sed命令的主要工作車間;對於緩存的行,使用給定PATTERN去匹配,如果能匹配成功,則使用相應的Command進行編輯處理;如果匹配不成功,在默認將此類行直接發送至標準輸出,而後繼續處理下一行,直到文檔結尾;

默認情況下,sed所處理的文件的內容都是在內存中完成的,並不會影響磁盤上存放的文件的內容;

sed默認有循環遍歷的含義,可以使用sed簡化爲文件的循環遍歷操作;

sed命令:
    sed - stream editor for filtering and transforming text
    格式:
        sed [OPTION]... 'script' [input-file]...
        常用選項:
            -n, --quiet, --silent:對於不能被PATTERN匹配的行,不發往標準輸出;
            -e script, --expression=script:多條件編輯;
            -f script-file, --file=script-file:從指定的script-file中讀取腳本內容再編輯;
                注意:script-file最好使用絕對路徑來指定;
            -i[SUFFIX], --in-place[=SUFFIX]:直接編輯源文件;
            -r, --regexp-extended:可以使sed支持擴展正則表達式;

        script:AddressesCommand
            Addresses:地址定界
                1.空地址:表示對指定文件的所有行進行編輯處理;
                2.單地址:sed對於能夠匹配該地址的唯一一行進行處理;
                    #:表示指定行號的那行;
                    /PATTERN/:能夠被PATTERN匹配的所有行;
                    $:表示指定文件的最後一行;sed不支持$-1;
                3.地址範圍:
                    addr1,addr2:addr1和addr2都表示行號,從addr1行開始到addr2行結束的中繼的所有行,包括addr1和addr2;
                    first~step:first和step都數字,從first行開始,以step爲步長,所經過的所有行;例如:1~2或2~2
                    addr1,+N:從addr1行開始,向後查找N行,包括addr1行;
                    addr1,~N:從addr1行開始,向後查找addr1*N行,包括addr1行;
                4./PATTERN1/,/PATTERN2/:
                    從被PATTERN1第一次匹配的行開始,到被PATTERN2第一次匹配的行結束;繼續向後找第二次匹配的行,第三次匹配的行,...

            Command:
                =:顯示被PATTERN匹配的行的行號;
                a \text:在被模式匹配的行之後追加text的內容;支持使用"\n"換行,從而實現追加多行信息;
                i \text:在被模式匹配的行之前插入text的內容;支持使用"\n"換行,從而實現插入多行信息;
                c \text:將被模式匹配的行直接修改爲text的內容;支持使用"\n"換行,從而實現修改原內容爲多行信息;
                d:在模式空間中刪除被模式匹配的行;
                    注意:一般在使用d命令時,不建議使用-n選項;
                p:將模式空間中被模式匹配的行發送到標準輸出;
                    注意:一般在使用p命令時,建議使用-n選項;
                w filename:filename可以是一個相對路徑,也可以是一個絕對路徑;w命令將模式空間中被PATTERN匹配的行,存儲到指定的文件中;
                    注意:一般在使用w命令時,建議使用-n選項;
                r filename:filename可以是一個相對路徑,也可以是一個絕對路徑;r命令將指定的文件內容添加至被PATTERN匹配的行的後面;

                !Command:在模式空間中被PATTERN匹配的行,不執行Command;相反,沒有被PATTERN匹配的行,會執行Command;

                s///:查找並替換,分隔符可以隨意更換,但必須保持一致;s@@@, s###, s''', ...
                    s/regexp/replacement/[control]
                    regexp:正則表達式,也就是PATTERN,計劃查找並替換的內容就是能夠被regexp匹配的內容;
                    replacement:要替換的結果,純字符串;
                        支持後向引用:
                            s/\(string\)/&/
                            s/\(string\)/\1/

            高級編輯命令:
                h:將模式空間中的內容存儲到保持空間中,並覆蓋保持空間中原有內容;
                H:將模式空間中的內容存儲到保持空間中,並追加至原有內容之後;
                g:從保持空間取出數據存儲到模式空間中,並覆蓋模式空間的原有內容;
                G:從保持空間取出數據存儲到模式空間中,並追加至原有內容之後;
                x:將模式空間中的內容與保持空間中的內容交換;
                n:讀取被PATTERN匹配到的行的下一行,覆蓋到模式空間;
                N:讀取被PATTERN匹配到的行的下一行,追加到模式空間;
                D:刪除模式空間中的所有行;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章