Linux之文件系統

簡介
文件系統是操作系統用於明確存儲設備或分區上的文件的方法和數據結構;即在存儲設備上組織文件的方法。操作系統中負責管理和存儲文件信息的軟件結構稱爲文件管理系統,簡稱文件系統。
從系統角度來看,文件系統是對文件存儲設備的空間進行組織和分配,負責文件存儲並對存入的文件進行保護和檢索的系統。具體地說,它負責爲用戶建立文件,存入、讀出、修改、轉儲文件,控制文件的存取,安全控制,日誌,壓縮,加密等
查看內核支持的文件系統:

 [root@zhang ~]# cd /lib/modules/`uname –r`/kernel/fs

一. 文件系統的類型:

ext2(Extended file system),ext3,ext4,xfs,btfrs(Oracle),reiserfs,jfs(AIX),swap
光盤:iso9660
windows:FAT32,exFAT,NTFS
Unix:FFS(fast),UFS(unix),JFS2
網絡文件系統:NFS,CIFS
集羣文件系統:GFS2, OCFS2(oracle)
分佈式文件系統:fastdfs,ceph, moosefs, mogilefs, glusterfs, Lustre
RAW:未經處理或者未經格式化產生的文件系統

二. EXT系列文件系統專用管理工具–>mke2fs

-t {ext2|ext3|ext4}
-b {1024|2048|4096}
-L 'LABEL'
-j: 相當於-t ext3
mkfs.ext3 = mkfs-t ext3 = mke2fs -j = mke2fs -t ext3
-i #: 爲數據空間中每多少個字節創建一個inode;此大小不應該小於block的大小
-N #:指定分區中創建多少個inode
-I 一個inode記錄佔用的磁盤空間大小,128---4096
-m #: 默認5%,爲管理人員預留空間佔總空間的百分比  exp:mke2fs -m 1 /dev/sdc1 
-O FEATURE[,...]:啓用指定特性
-O ^FEATURE:關閉指定特性
指向設備的另一種方法,與設備無關
blkid:塊設備屬性信息查看
blkid[OPTION]... [DEVICE]
-U UUID: 根據指定的UUID來查找對應的設備
-L LABEL:根據指定的LABEL來查找對應的設備
e2label:管理ext系列文件系統的LABEL
e2label DEVICE [LABEL]
findfs:查找分區
findfs [options] LABEL=( label )
findfs [options] UUID=( uuid )

三 . 重新設定ext系列文件系統可調整參數的值–>tune2fs

-l:查看指定文件系統超級塊信息;super block
tune2fs -l /dev/sda3  -->超級塊信息 
-l:查看指定文件系統超級塊信息;super block
-L 'LABEL':修改卷標   tune2fs -L TEST /dev/sdc1   修改/dev/sdc1 的卷標爲TEST
-m #:修預留給管理員的空間百分比
-j: 將ext2升級爲ext3
tune2fs -j /dev/sdb3 --> ext2 升級到 ext3
-O: 文件系統屬性啓用或禁用,–O ^has_journal
-o: 調整文件系統的默認掛載選項,–o ^acl
-U UUID: 修改UUID生成UUID命令:uuidgen  
tune2fs -U 3e452ac2-a110-4b39-a3dd-c0d6e75c38d5 /dev/sdb3
 dumpe2fs:塊分組管理,32768塊  --> 每個組裏面的塊數是32768塊,是固定的,但是不同的分區每個組裏面的塊的容量大小不同,塊組數量也不同。
-h:查看超級塊信息,不顯示分組信息

四. 文件系統檢測和修復

常發生於死機或者非正常關機之後
掛載爲文件系統標記爲“no clean”
注意:一定不要在掛載狀態下修復
fsck全稱: File System Check
fsck.FS_TYPE
fsck -t FS_TYPE
-p: 自動修復錯誤
-r: 交互式修復錯誤
FS_TYPE一定要與分區上已經文件類型相同
e2fsck:ext系列文件專用的檢測修復工具
-y:自動回答爲yes
-f:強制修復

超級塊被破壞,修復實驗

[root@centos ~]# dd if=/dev/zero of=/dev/sdb2 bs=1M count=1
[root@centos ~]# tune2fs  -l  /dev/sdb2   #查看超級信息,不存在,已經被破壞
[root@centos ~]# umount   /dev/sdb2     #取消掛載
[root@centos ~]# fsch   /dev/sdb2       #修復超級塊

注:因爲有其他部分塊分組備份了超級塊信息,所以可以修復,但是也只能修復超級塊元數據信息,數據是不能修復的,因爲沒有備份

5. 掛載 mount

掛載基本定義 : 將額外文件系統與根文件系統某現存的目錄建立起關聯關係,進而使得此目錄做爲其它文件訪問入口的行爲
把設備關聯掛載點:mount Point

[root@centos ~]# mount /dev/sda /mnt
#通過查看/etc/mtab文件顯示當前已掛載的所有設備

卸載 : 爲解除此關聯關係的過程,進程正在使用的設備無法被卸載
卸載時:可使用設備,也可以使用掛載點

[root@centos ~]# umount /dev/sda   
或者
[root@centos ~]# umount /mnt

掛載點下原有文件在掛載完成後會被臨時隱藏,掛載點目錄一般爲空

(1)mount常用命令選項

 -t vsftype:指定要掛載的設備上的文件系統類型
-r: readonly,只讀掛載
-w: read and write, 讀寫掛載
-n: 不更新/etc/mtab,mount不可見
-a:自動掛載所有支持自動掛載的設備(定義在了/etc/fstab文件中,且掛載選項中有auto功能)
-L 'LABEL': 以卷標指定掛載設備
-U 'UUID':UUID指定要掛載的設備
-B, --bind: 綁定目錄到另一個目錄上
查看內核追蹤到的已掛載的所有設備
cat /proc/mounts

(2) -o options:(掛載文件系統的選項),多個選項使用逗號分隔

async:異步模式
sync:同步模式,內存更改時,同時寫磁盤
atime/noatime:包含目錄和文件
diratime/nodiratime:目錄的訪問時間戳
auto/noauto:是否支持自動掛載,是否支持-a選項
exec/noexec:是否支持將文件系統上運行應用程序
dev/nodev:是否支持在此文件系統上使用設備文件
suid/nosuid:不否支持suid和sgid權限
remount:重新掛載
ro:只讀
rw:讀寫
user/nouser:是否允許普通用戶掛載此設備,/etc/fstab使用
acl:啓用此文件系統上的acl功能
loop: 使用loop設備
defaults:相當於rw, nosuid, dev, exec, auto, nouser, async

(3)文件掛載

文件掛載需要加上 -o loop ,例如把/app/partfile文件格式化,首先要把partfile文件格式化成文件系統
[root@centos ~]# cd /app
[root@centos ~]# mkfs.ext4 partfile
在目錄mnt下,創建目錄partfile
把app下的文件partfile掛載到mnt目錄下的partfile目錄
[root@centos ~]# mount -o loop /app/partfile /mnt/partfile

centos6 上

一般情況下最多有8個loop設備
需要掛載的文件超過8個,需要自己手動創建loop設備
[root@centos ~]# mknod /dev/loop8 b 7 8
[root@centos ~]# mount -o loop /app/partfile8 /mnt/partfile8
修改配置文件一次性創建多個loop設備—> /boot/grub/grub.conf 在配置文件 kernel後面追加max_loop=100
或者reboot後,在內核參數中加入 max_loop=100 也可以把loop設備設置成100

centos7

自動創建loop設備,直接掛載

(4)永久掛載

修改配置文件/etc/fstab
[root@centos ~]# vim /etc/fstab
/dev/sdb3 /mnt/sdb3 ext4 defaults 0 0(寫成0最好)
生效掛載
[root@centos ~]# mount -a 自動掛載所有支持自動掛載的設備(定義在了/etc/fstab文件中,且掛載選項中有auto功能),重啓後會自動掛載
/dev/sdb3 /mnt/sdb3 ext4 acl 0 0
生效掛載
[root@centos ~]# mount -o remount /mnt/sdb3 實現acl
重啓後會自動掛載
[root@centos ~]# cd /mnt/sdb3
[root@centos ~]# touch f1.sh
[root@centos ~]#chmod +x f1.sh
重新掛載remount
[root@centos ~]# mount -o remount,noexec /mnt/sdb3
[root@centos ~]# cd /mnt/sdb3
[root@centos ~]# ./f1.sh
不能執行,說明noextc生效—-noextc取消執行權限–exec有執行權限
[root@centos ~]# mount -o remount,noexec /mnt/sdb3
[root@centos ~]# cd /mnt/sdb3
[root@centos ~]# ./f1.sh 可以執行
掛載後默認有執行權限

六、swap 交換分區
專門用於和內存交換–內存不夠用,則調用交換分區,分區不支持變大小,理論上磁道外圈速度比內圈速度快 swp—8200

分區–>交換分區

[root@centos ~]# mkswap /dev/sdb1   創建swap分區
[root@centos ~]# swapon -a   生效
[root@centos ~]# free                               查看到的是swap的分區總量
cat /proc/swaps  或者  swapon -s   查看swap所有的分區  
調整優先級:/etc/fstab中  pri:value
注意:修改配置文件後,先禁用swapoff -a 然後啓用 swapon -a ,之後pri參數方可生效
建議一般情況下不用的交換分區可以禁用掉
[root@centos ~]# swapon -a   對所有的交換分區啓用            
[root@centos ~]# swapoff /dev/sda5  禁用
T ---->MBR----->82  
L----->GPT------> 8200

文件–>交換分區

把普通文件做成交換分區

1.在目錄m下創建tmp目錄,進入tmp目錄

[root@centos ~]# cd /m 
[root@centos ~]# mkdir tmp 
[root@centos ~]# cd tmp 
用dd命令用0覆蓋swapfile文件
[root@centos ~]# dd if=/dev/zero of=swapfile bs=1M count=1024
  1. 文件格式化成交換分區
[root@centos ~]# mkswap /m/tmp/swapfile

3.修改配置文件

[root@centos ~]# vim /etc/fstab -->UUID=228e40ae-b3bd-4788-aa0d-3ef26dcf5eb4 swap swap defaults 0 0

4.生效交換分區

[root@centos ~]# swapon -a  
  1. 查看文件交換分區
[root@centos ~]# swapon -s
  1. 生效配置文件
[root@centos ~]# swapon -a 
  1. 測試—->
[root@centos ~]# dd if=/dev/zero of=/dev/null bs=1G count=3
[root@centos ~]# free   #查看是否使用了交換分區

刪除交換分區

禁用交換分區 swapoff swapfile   在tmp目錄下
移除fstab中的配置參數
刪除文件  rm -rf swapfile

七.常見工具

(1)free

mem 內存 toal總量 單位爲1k
緩存:把常用的數據調到內存,下次需要的用的時候,從緩存讀。很多地方都有緩存
cpu,內存…都有
buffers 元數據緩存 cache 數據內容緩存
free 【-h】 以人類易讀的方式顯示

(2)df

df -h
df -H 買硬盤的時候容量
df -i 顯示節點總量以及使用等情況
kiB 2^ kb 10^
df -p 以Posix兼容的格式輸出
df -T 可以查看文件系統類型

(3)查看某目錄總體空間佔用狀態:

du [OPTION]… DIR
-h: human-readable
-s: summary
du CentOS/ -h 以人類易讀的方式顯示CentdOS總大小
du CentOS -sh —> 12G CentOS

(4)dd命令:convert and copy a file

用法:
ddif=/PATH/FROM/SRC of=/PATH/TO/DEST
bs=#:block size, 複製單元大小
count=#:複製多少個bs
of=file寫到所命名的文件而不是到標準輸出
if=file從所命名文件讀取而不是從標準輸入
bs=size指定塊大小(既是是ibs也是obs)
ibs=size一次讀size個byte
obs=size 一次寫size個byte
cbs=size 一次轉化size個byte
skip=blocks從開頭忽略blocks個ibs大小的塊
seek=blocks從開頭忽略blocks個obs大小的塊
count=n只拷貝n個記錄
conv=conversion[,conversion…] 用指定的參數轉換文件
轉換參數:
ascii 轉換EBCDIC 爲ASCII
ebcdic 轉換ASCII 爲EBCDIC
lcase 把大寫字符轉換爲小寫字符
ucase 把小寫字符轉換爲大寫字符
nocreat 不創建輸出文件
noerror 出錯時不停止
notrunc 不截短輸出文件
sync 把每個輸入塊填充到ibs個字節,不足部分用空(NUL)字符補齊
備份MBR:
ddif=/dev/sdaof=/tmp/mbr.bakbs=512 count=1
破壞MBR中的bootloader:
ddif=/dev/zero of=/dev/sdabs=64 count=1 seek=446

實驗

有一個大與2K的二進制文件fileA。現在想從第64個字節位置開始讀取,需要讀取的大小是128Byts。又有fileB, 想把上面讀取到的128Bytes寫到第32個字節開始的位置,替換128Bytes,實現如下:
#ddif=fileAof=fileBbs=1 count=128 skip=63 seek=31 conv=notrunc

(1)備份:

dd if=/dev/sdx of=/dev/sdy #將本地的/dev/sdx整盤備份到/dev/sdy
dd if=/dev/sdx of=/path/to/image  #將/dev/sdx全盤數據備份到指定路徑的image文件
dd if=/dev/sdx | gzip >/path/to/image.gz   #備份/dev/sdx全盤數據,並利用gzip壓縮,保存到指定路徑

(2)恢復:

dd if=/path/to/image of=/dev/sdx      #將備份文件恢復到指定盤
gzip -dc /path/to/image.gz | dd of=/dev/sdx     #將壓縮的備份文件恢復到指定盤
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章