Linux文件系統基本知識

文件系統

image


linux下的文件類型

可以用ll查看,在ll列表最前面顯示
-:普通文件
d:目錄文件
b:塊設備,以block塊形式存儲,比如硬盤就是一塊一塊寫,隨機尋找一塊位置存放數據,一般都是有緩存的(先寫入buffer緩衝區,注意和cache緩存的區別)
緩存或者緩衝的目的都是爲了利用內存讀寫的速度快,比硬盤快,提高效率
c:字符設備,以字符character形式存儲,比如鍵盤就是一個字符一個字符寫,是按照次序輸入的,不是隨機,一般都沒有緩存
l:符號鏈接設備
p:管道文件pipe,用於不同軟件或者程序傳播文件或者數據用,只能單向傳輸,現在很少用
s:套接字文件socket,可以雙向同時傳輸

內存(用戶內存區和內核內存區)和硬盤:
image


管道:
image


文件名規則

image


文件的不同後綴可以顯示不同的顏色,可以自己定義,在/etc/DIR_COLORS
文件名可以用-等等特殊符號,但是最好別用,創建或者刪除的時候必須用路徑的方式才能創建或者刪除 touch /data/ -a

絕對路徑和相對路徑

image


文件通配符

注意*不匹配隱藏文件,它可以代表0個或者任意個字符,而?代表一個字符,漢字也是一個字符
切換文件夾可以用cd - 但是如果訪問文件只能cd ~-/####
通配符都是匹配文件名字的,其中的內容不能匹配
ls f[165]
image


中括號通配符匹配內只取一個字符,花括號相當於拆開的笛卡爾乘積(但注意花括號並不是通配符)
中括號通字符如果表示字母的範圍時,是按照小寫大寫小寫大寫...的順序來識別
man 7 glob 查詢用法
因爲中括號內只取一個 所以如果預定的字符類通配符注意外面再加一層括號(預定的字符類通配符看做是一個整體的字符即可)

21:57[root@centos7 /data]# touch f{1..10}.txt
21:58[root@centos7 /data]# ls 
f10.txt  f1.txt  f2.txt  f3.txt  f4.txt  f5.txt  f6.txt  f7.txt  f8.txt  f9.txt
21:58[root@centos7 /data]# ls f[167].txt
f1.txt  f6.txt  f7.txt
21:58[root@centos7 /data]# ls f[1-5].txt
f1.txt  f2.txt  f3.txt  f4.txt  f5.txt
21:59[root@centos7 /data]# ls f{1..10}.txt
f10.txt  f1.txt  f2.txt  f3.txt  f4.txt  f5.txt  f6.txt  f7.txt  f8.txt  f9.txt
21:59[root@centos7 /data]# ls f[1-10].txt
f1.txt
21:59[root@centos7 /data]# ls f[1-9].txt
f1.txt  f2.txt  f3.txt  f4.txt  f5.txt  f6.txt  f7.txt  f8.txt  f9.txt

22:00[root@centos7 /data]# rm -f *
22:02[root@centos7 /data]# touch f{a..z}.txt
22:03[root@centos7 /data]# ls
fa.txt  fd.txt  fg.txt  fj.txt  fm.txt  fp.txt  fs.txt  fv.txt  fy.txt
fb.txt  fe.txt  fh.txt  fk.txt  fn.txt  fq.txt  ft.txt  fw.txt  fz.txt
fc.txt  ff.txt  fi.txt  fl.txt  fo.txt  fr.txt  fu.txt  fx.txt
22:03[root@centos7 /data]# ls f[a-d].txt
fa.txt  fb.txt  fc.txt  fd.txt
22:03[root@centos7 /data]# ls f[wagfg].txt
fa.txt  ff.txt  fg.txt  fw.txt
22:03[root@centos7 /data]# ls f[^abcde].txt
ff.txt  fh.txt  fj.txt  fl.txt  fn.txt  fp.txt  fr.txt  ft.txt  fv.txt  fx.txt  fz.txt
fg.txt  fi.txt  fk.txt  fm.txt  fo.txt  fq.txt  fs.txt  fu.txt  fw.txt  fy.txt
22:04[root@centos7 /data]# touch f{A..Z}.txt
22:05[root@centos7 /data]# ls
fa.txt  fC.txt  ff.txt  fH.txt  fk.txt  fM.txt  fp.txt  fR.txt  fu.txt  fW.txt  fz.txt
fA.txt  fd.txt  fF.txt  fi.txt  fK.txt  fn.txt  fP.txt  fs.txt  fU.txt  fx.txt  fZ.txt
fb.txt  fD.txt  fg.txt  fI.txt  fl.txt  fN.txt  fq.txt  fS.txt  fv.txt  fX.txt
fB.txt  fe.txt  fG.txt  fj.txt  fL.txt  fo.txt  fQ.txt  ft.txt  fV.txt  fy.txt
fc.txt  fE.txt  fh.txt  fJ.txt  fm.txt  fO.txt  fr.txt  fT.txt  fw.txt  fY.txt
22:05[root@centos7 /data]# ls f[a-c].txt
fa.txt  fA.txt  fb.txt  fB.txt  fc.txt
22:05[root@centos7 /data]# ls f[A-C].txt
fA.txt  fb.txt  fB.txt  fc.txt  fC.txt
22:07[root@centos7 /data]# ls f[[:upper:]].txt
fA.txt  fD.txt  fG.txt  fJ.txt  fM.txt  fP.txt  fS.txt  fV.txt  fY.txt
fB.txt  fE.txt  fH.txt  fK.txt  fN.txt  fQ.txt  fT.txt  fW.txt  fZ.txt
fC.txt  fF.txt  fI.txt  fL.txt  fO.txt  fR.txt  fU.txt  fX.txt
22:08[root@centos7 /data]# ls f[[:lower:]].txt
fa.txt  fd.txt  fg.txt  fj.txt  fm.txt  fp.txt  fs.txt  fv.txt  fy.txt
fb.txt  fe.txt  fh.txt  fk.txt  fn.txt  fq.txt  ft.txt  fw.txt  fz.txt
fc.txt  ff.txt  fi.txt  fl.txt  fo.txt  fr.txt  fu.txt  fx.txt

image


image


索引節點

  • Linux裏面數據保存以一個分區爲一個整體來保存數據
  • Linux裏面一塊硬盤的一個分區在保存文件時,它的元數據和數據內容是分開保存的,其中元數據保存的地方在硬盤中叫inode(index node),索引節點
  • 其中一個分區大約有1%的空間分配用來保存索引節點,- 如果索引節點的節點編號可用數量被用光,則即使仍有空餘空間也無法再創建新文件
  • 索引節點表:存放此分區上所有文件的索引節點的一個空間列表,其中列表中的每一項即對應着一個文件的索引節點,包含着這個文件的元數據
  • inode 就相當於C語言中的結構體 它包含了與文件系統中各個文件相關的一些不同類型的重要信息
  • 每一個索引節點都是一個表項,包含有關文件的信息(元數據):

    文件類型,權限,UID,GID
    鏈接數(指向這個文件名路徑名稱個數)
    該文件的大小和不同的時間戳
    指向磁盤上文件的數據塊指針
    有關文件的其他數據

  • 其中包含的有一個inode number,用於區分不同的文件
  • 當文件引用時,會通過這個inode編號,找到其對應的inode,然後就可以在inode中找到此文件的所有元數據和數據存放位置(利用元數據中的指針)
  • 人是通過文件名來引用一個文件,計算機內則找它對應的inode number,然後找到inode,最終找到所有信息
  • 在目錄中,目錄下的文件名和文件inode號之間的映射表,組成了這個目錄的內容
  • 分清楚三個不同的概念:索引節點列表inode table》索引節點index node》索引節點編號inode number
  • 索引節點內的節點編號僅用來區分不同文件,索引節點內的指針才能找到文件數據保存位置,索引節點編號具有唯一性,範圍是在一個分區內
  • 可以用 ll -i 來查看節點編號
  • 可以用df -i (-h 更加易讀的數據)查看剩餘節點編號數量

image


image


目錄

  • 目錄也是一個文件,只不過是目錄文件而已
  • 它也包含元數據,記錄了各種信息,以及它的指針,指向它保存的數據
  • 目錄文件數據塊空間中保存的就是這個目錄中的文件的名字和文件的inode number構成的列表
  • 文件名並不是元數據

    image


    image


cp和inode

在 CP的 命令:

  1. 分配一個空閒的inode號,在inode表中生成新條目
  2. 在目錄中創建一個目錄項(寫在目錄的數據塊空間中),將文件名稱與inode編號關聯
  3. 拷貝數據生成新的文件

rm和inode

rm 命令:

  1. 鏈接數遞減,從而釋放的inode號可以被重用
  2. 把數據塊放在空閒列表free中
  3. 刪除目錄項(文件名和它對應的節點編號)
    注意:數據實際上不會馬上被刪除,但當另一個文件使用數據塊時將被覆蓋
    注意:帶有鏈接的文件只有當鏈接數全部刪除爲0之後,纔會釋放這個inode條目(這個節點編號就可以再次使用了)

mv和inode

  1. 如果mv命令的目標和源在相同的文件系統(linux中是在一個分區內,因爲inode是按照分區劃分的),作爲mv 命令
  2. 用新的文件名創建對應新的目錄項(對應此文件的節點編號)
  3. 刪除舊目錄條目對應的舊的文件名和對應的這個文件的節點編號
  4. 不影響inode表(除時間戳)或磁盤上的數據位置:沒有數據被移動!
  5. 如果目標和源在一個不同的文件系統,mv相當於cp和rm

硬鏈接

創建硬鏈接會增加額外的記錄項以引用文件
對應於同一文件系統上一個物理文件
每個目錄引用相同的inode號
創建時鏈接數遞增
刪除文件時:
rm命令遞減計數的鏈接
文件要存在,至少有一個鏈接數
當鏈接數爲零時,該文件被刪除
語法:
ln filename [linkname ]
注意:不能用來備份,因爲備份大多是物理層面,要存到其他地方
注意:不能創建目錄的硬鏈接,因爲可能造成循環嵌套
注意:不能跨越驅動器或分區(inode不能改變,只能改變其中的鏈接數)

軟鏈接

一個符號鏈接指向另一個文件
ls - l的 顯示鏈接的名稱和引用的文件
一個符號鏈接的內容是它引用文件的名稱(這個文件的絕對路徑
軟鏈接指向的是另一個文件的路徑,其大小爲指向的文件的路徑字符串的長度,和原始文件大小沒有關係
不增加或減少目標文件inode的引用計數
語法:
ln -s filename .. [linkname]
readlink 可以查看軟鏈接的原始文件的路徑

  • 軟鏈接在生產中經常用來升級軟件時的版本切換,不需要更改自己腳本中的代碼
  • 也可以用來把比較深的路徑定義比較短的路徑,類似別名的效果
  • 還可以用來在更改了文件或者數據的路徑之後,把老的文件夾目錄指向新的文件目錄,這樣可以照顧舊程序中的引用目錄直接到新目錄中

注意:可以對目錄進行軟鏈接,也可以對文件進行軟鏈接
假如是目錄的軟鏈接 用ll查看它的信息的時候不要加最後面的/,
不然即使加上-d選項,它也僅僅是顯示軟鏈接的連接目標目錄的信息,而不會顯示這個軟鏈接文件本身的信息
注意:可以跨分區
注意:軟鏈接還可以再對軟鏈接進行鏈接
注意:創建軟鏈接使用相對路徑的時候,相對的是要創建的這個軟鏈接的位置的路徑,而不是當前工作目錄的路徑,不然會紅字錯誤。創建軟鏈接多使用相對路徑(系統創建時用的就是相對路徑)

18:31[root@centos7 ~]# ll /data/slinktest
lrwxrwxrwx. 1 root root 16 Mar 10 18:21 /data/slinktest -> /data/textdir1/x
18:31[root@centos7 ~]# ll /data/slinktest/
total 0
drwxr-xr-x. 2 root root 6 Mar 10 11:07 a
drwxr-xr-x. 2 root root 6 Mar 10 11:07 b
18:32[root@centos7 ~]# ll /data/slinktest/ -d
drwxr-xr-x. 4 root root 24 Mar 10 11:07 /data/slinktest/
18:32[root@centos7 ~]# ll /data/slinktest -i -d /data/textdir1/x
     123 lrwxrwxrwx. 1 root root 16 Mar 10 18:21 /data/slinktest -> /data/textdir1/x
33555680 drwxr-xr-x. 4 root root 24 Mar 10 11:07 /data/textdir1/x
18:33[root@centos7 ~]# ll /data/slinktest/ /data/textdir1/x/
/data/slinktest/:
total 0
drwxr-xr-x. 2 root root 6 Mar 10 11:07 a
drwxr-xr-x. 2 root root 6 Mar 10 11:07 b

/data/textdir1/x/:
total 0
drwxr-xr-x. 2 root root 6 Mar 10 11:07 a
drwxr-xr-x. 2 root root 6 Mar 10 11:07 b

軟硬鏈接的區別總結:

  • 本質:
    硬鏈接:一個文件多個名字
    軟鏈接:一個文件的不同的快捷方式,不同的文件
  • 鏈接數:元數據中鏈接數只有硬鏈接增長,軟連接不會
  • 跨分區:硬鏈接不支持,軟連接支持
  • 目錄文件:硬連接不可以鏈接目錄文件,軟連接可以
  • 原始文件和鏈接文件的關係:
    硬鏈接是獨立平等的關係,刪除不影響其他的硬鏈接(相當於刪除了一個文件名)
    軟連接依賴於原始文件,刪除原始文件則軟鏈接報錯
  • 大小:硬鏈接都是同一個文件,大小相同;軟鏈接的大小取決於它指向的原始文件的路徑的字符數量

確定文件內容

  • linux中文件類型不看後綴
  • 文件可以包含多種類型的數據
  • 檢查文件的類型,然後確定適當的打開命令或應用程序使用
  • file [options] <filename>...

    常用選項:
    -b 列出文件辨識結果時,不顯示文件名稱
    -f filelist 列出文件filelist中文件名的文件類型
    -F 使用指定分隔符號替換輸出文件名後默認的”:” 分隔符
    -L 查看對應軟鏈接對應文件的文件類型
    --help 顯示命令在線幫助

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章