1. 程式人生 > >磁盤管理與文件系統

磁盤管理與文件系統

ext4 註意 ESS inf 系列 比較 文件的 區號 轉儲

技術分享圖片

技術分享圖片技術分享圖片

  計算機上主要部件有運算器、控制器、存儲器、輸入輸出設備,也就是上圖中cpu,內存和其他IO設備,內存作為易失性存儲設備,所以需要通過IO設備磁盤來持久化的存儲數據。而IO設備這些硬件設備怎麽被計算機識別管理呢?不同廠商生產的硬件設備電器工作特性肯定是不一樣的,所以生產硬件設備的廠商會提供驅動程序,操作系統裝載完驅動程序後就會抽象硬件設備所提供的功能向上輸出,提供給程序員進行系統調用,而系統調用還是非常底層,所以就有庫調用。對硬件進行的設備管理,也就是操作系統對驅動程序的管理。那麽操作系統怎麽知道哪個硬件需要輸入輸出呢,早期是通過輪詢來實現,就是每隔一段時間掃描檢查使用的數據,也就是盲等待,但是這種方式性能比較差。還有一種就是當IO設備有IO事件發生時,通知cpu,然後cpu觸發內核,由內核來處理。cpu和I/O設備進行交互,是通過I/O端口來實現的,這些端口也就是系統上的I/O設備地址。每個硬件設備在Linux上都被識別為一個文件,Linux上設備文件類型有兩類:一類是塊設備(存儲單元為‘塊’),比如磁盤,一類是字符設備(存儲單元為‘字符’),比如鍵盤。

  磁盤的基本概念: 

     磁盤的接口類型有:

        並行:

          IDE: 133MB/s

          SCSI: 640MB/s

        串口:

          SATA: 6Gbps

          SAS: 6Gbps

          USB: 480MB/s

      磁盤設備文件命名: 

        IDE:/dev/hd

        SCSI,SATA,SAS,USB:/dev/sd

          同一個設備:a-z;比如:/dev/sda,/dev/sdb...

          同一個設備不同分區:1,2,... 比如:/dev/sda1,/dev/sda2...

      機械式硬盤還有磁道(track),柱面(cylinder),扇區(sector)的概念。

      技術分享圖片

  

    第0磁道0扇區有512bytes:

          446 bytes: 用來存放MBR(Master Boot Record)

           64 bytes: partition table (分區表)

               16個bytes標識一個分區,所以只能有四個主分區

           2 bytes:校驗碼 55AA

  註意:如果單盤容量大於2T,MBR分區格式就不適用了,需要采用另一種分區格式,也就是GPT(GUID partition table)

  MBR: 早期的linux系統為了兼容windows的磁盤所使用的分區格式,

  GPT: 磁盤空間大於2T所采用的分區格式,磁區大小可以達到4k(默認為512bytes),磁區也叫做邏輯區塊位址(Logical Block Address, LBA),GPT使用34個

  LBA區塊記錄分區信息,磁盤最後33個LBA作為分區信息的備份。LBA0(MBR相容區塊)中446bytes用來存放開機管理程式(boot loader),原本用來存放分區表信息的地方只存放一個特殊標誌,用來表示磁盤為GPT分區格式。LBA1(GPT表頭記錄)中記錄了分區表的位置和大小,同時記錄了備份用的GPT分區存放位置。LBA2-33(實際記錄分區信息處),每個LBA默認有4個分區,每個LBA有512bytes,每個分區信息用到128bytes,這之中除了識別碼和相關記錄外,會有64bits來記錄開始/結束的磁區號碼。 GPT分區格式沒有主分區、擴展分區、邏輯分區的概念,每條記錄都是單獨存在,都可以為主分區,每個都可以格式化使用。

  開機管理程式: 系統載入硬件驅動的程序,主要有BIOS和UEFI兩種機制

  CMOS: 記錄各項硬件參數並且嵌入在主機板上的儲存器

  BIOS:寫入到硬件上的軟件程序(開機後計算機主動執行的第一個程序)

  UEFI(Unified Extensible Firmware Interface):統一可擴展的軟件體,C語言開發的

磁盤分區管理工具:(fdisk、partx、kpartx、sfdisk、gdisk、parted)

  fdisk:對於一塊硬盤來說只能管理15個分區

    -l : 顯示當前系統所有的磁盤分區情況

  fdisk device: 顯示某個設備的分區信息

    自命令:管理功能

        p: print,顯示已有分區

        n:new,創建一個分區

        d: delete, 刪除一個分區

        t: 調整分區id

        l: 列表顯示分區id

        w: write: 寫入磁盤並退出

        q:quit, 放棄更新並退出

通過上面的命令創建好分區後,需要重新讀取硬盤分區表

    partx -a /dev/device

       -n M:N 讀取哪幾個分區

    kpartx -a /dev/device

       -f: force

    partprobe [/dev/device]

  查看內核是否已經識別新分區: cat /proc/partitions

  有些時候重新讀取新分區後,舊的已經刪除的分區還在,這時可通過 partprobe重新讀取分區信息,會刪除舊的記錄。

  分區完,接下來就需要進行格式化操作了。為什麽需要進行格式化呢,因為每個操作系統設置的文件屬性都不相同,為了存放這些文件,就需要對分區進行格式化,成為操作系統能夠使用的文件系統格式(filesystem)。

  Linux文件系統有ext2、ext3、ext4,xfs, btrfs,reiserfs, jfs, swap

  Windows文件系統: fat32、ntfs

  Unix: FFS、UFS、JFS2

  網絡文件系統: NFS、CIFS

  集群文件: GFS2、OCFS2

  分布式文件系統:ceph、moosefs、mogilefs、GlusterFS、lustre

文件系統格式化後:

技術分享圖片

文件系統格式化會區分為多個塊組,每個塊組都有獨立的inode/block/superblock系統。

其中:

  data block(數據塊):存放文件內容數據的地方,每個block大小有1k、2k、4k三種。格式化時block大小就固定了,每個block都有編號,方便inode記錄。

  inode tale(inode 表): 記錄文件的屬性和該文件實際數據存放在哪幾號block上。每個inode大小為128bytes(ext4和xfs可設置到256bytes),記錄一個block號碼要4bytes,block數量很多,inode直接記錄肯定是不夠的,所以inode記錄block號碼的區域定義為12個直接,一個間接,一個雙間接和一個三間接。

技術分享圖片

  Superblock(超級塊):記錄整個文件系統相關信息的地方。一般只要第一個塊組中有superblock,後續的塊組不一定有,就算有也是第一個塊組中的superbloc備份。

  Filesystem Description(文件系統描述說明): 描述每個塊組的開始與結束的block號碼,以及每個每個區段(superblock,bitmap,inodemap,datablock)分別在哪個block號碼之間。

  block bitmap(區塊對應表):標識block使用狀態的,比如使用還是未使用

  inode bitmap(inode 對應表): 標識inode使用狀態,比如記錄使用與未使用

文件系統格式化常用命令:

  創建文件系統:

    mkfs命令:

      # mkfs.FS_TYPE /dev/DEVICE

         ext2、ext3、ext4、xfs、btrfs、vfat

      #mkfs -t FS_TYPE /dev/DEVICE

        -l ‘LABEL‘: 設定卷標

    mke2fs: ext系列文件系統專用管理工具

      -t {ext2 | ext3 | ext4}

      -b {1024 | 2048 | 4096}

      -L ‘LABEL‘

      -j: 相當於 -t ext3

      -i #: 為數據空間中每多少個字節創建inode

      -N # : 為數據空間創建多少個inode

      -m # : 為管理人員預留的空間占用的百分比,默認為百分之5

      -O FEATURE[...]: 啟用指定特性

      -O ^FEATURE: 關閉指定特性

    mkswap: 創建交換分區

      -L ‘LABEL‘

  其他常用工具:

    blkid: 塊設備屬性信息查看

      -U UUID: 根據指定的UUID來查找對應的設備

      -L LABEL: 根據指定的LABEL來查找對應的設備

    e2label: 管理ext系列文件系統的LABEL

      #e2label DEVICE [LABEL]

    tune2fs: 重新設置ext系列文件系統可調整參數的值

      -l: 查看指定文件系統超級塊信息

      -L ‘LABEL‘:修改LABEL

      -m #: 修改預留給管理員的空間百分比

      -j: ext2升級為ext3

      -O: 文件系統屬性啟用或禁用

      -o: 調整文件系統的默認掛載選項

      -U UUID:修改UUID號

    dumpe2fs:

      -h: 查看超級塊信息

   文件系統檢測:

      fsck.FS_TYPE

      fsck -t FS_TYPE

        -a: 自動修復錯誤

        -r: 交互式修復錯誤

      e2fsck: ext系列文件專用的檢測修復工具

        -y: 自動回答yes

        -f: 強制修復

文件系統格式化後,文件系統需要與根文件系統現存的目錄建立關系,進而使此目錄做為其他文件訪問入口。也就是需要對文件系統進行掛載與卸載操作。

    掛載方法: mount DEVICE MOUNT_POINT

      mount: 通過查看/dev/mtab 文件顯示當前系統已掛載的所有設備

    掛載常用命令:

      mount DEVICE DIR

        -t VFS_TYPE: 指定要掛載的設備上的文件系統類型

        -r: readonly,只讀掛載

        -w: 讀寫掛載   

        -n: 不更新/etc/mtab

        -a:自動掛載所有支持自動掛載的設備: (定義在/etc/fstab文件中)

        -U ‘UUID‘: 以UUID指定要掛載的設備

        -B,--bind: 綁定目錄到另一個目錄

     註意: 查看內核追蹤到的已掛載的所有設備: cat /proc/mounts

        -o options: (掛載文件系統的選項)

           async: 異步模式

           sync:同步模式

           atime/noatime:

           diratiome/nodiratime: 目錄的訪問時間戳

           auto/noauto: 是否支持自動掛載

           exec/noexec: 是否支持將文件系統上應用程序運行為進程

           dev/nodev: 是否支持在此文件系統上使用設備文件

           suid/nosuid:

           remount:重新掛載

           user/nouser:是否運行普通用戶掛載此設備

           acl:啟用文件系統上的acl功能

         註意:上述選項可多個同時使用,彼此都好分隔,默認掛載選項:defaults (rw,suid,dev,exec,auto,nouser,and async)

     卸載命令:

       #umount DEVICE

     查看正在訪問指定文件系統的進程:

       # fuser -v MOUNT_POINT

       # fuer -km MOUNT_POINT 終止所有正在訪問指定文件系統的進程

     掛載交換分區:

      啟用: swapon

         swapon [OPTION]...[DEVICE]

            -a: 激活所有的交換分區

            -p: PRIORITY:指定優先級

      禁用: swapoff [OPTION]...[DEVICE]

     內存空閑使用狀態:

        free [OPTION]

          -m: 以MB為單位

          -g: 以GB為單位

     文件系統空間占用等信息的查看工具:

        df:

          -h: human-readable

          -l: inodes instead of blocks

          -P: 以Posix兼容的格式輸出

     查看某目錄總體空間占用狀態:

        du:

          du [OPTIONS] DIR

            -h: human-readable

            -s: summary

  要實現開機自動掛載,則要修改掛載的配置文件: /etc/fstab

    每行定義一個要掛在的文件系統:

      要掛載的設備或偽文件系統: 設備文件、LABEL(LABEL="")、UUID(UUID="")、偽文件系統名稱(proc、sysfs) 

      掛載點

      文件系統類型

      掛載選項: defaults

      轉儲頻率:

         0:不做備份

         1: 每天轉儲

         2:每隔一天轉儲

      自檢次序:

         0:不自檢

         1:首先自檢,一般只有rootfs才用1

 鏈接文件:

    硬鏈接:指向同一個inode的不同路徑:創建文件的硬鏈接即為為inode創建新的引用路徑,因此會增加引用計數

      不能對目錄進行

      不能跨分區進行

    符號鏈接:指向的是另一個文件的路徑:其大小為指向的路徑字符串的長度,不會增加或減少目標文件的inode引用過計數

      可以對目錄進行

      可以跨分區進行

    創建符號鏈接的命令:

      ln [-sv] SRC DEST

        -s: symbolic link

        -v: verbose

  文件管理操作對文件的影響:

    文件刪除:文件的inode引用計數降低為0,inode bitmap中對應的inode號標記為空閑,block bitmap中對應的block號標記為空閑,分配的所有block也標記為空閑

    文件復制:創建新的文件,復制原來的文件內容到新文件中

    文件移動:跨分區移動同復制操作,再把原來的文件刪除;如果是同分區:創建新路徑指向原來路徑指向的inode號

練習:1.創建一個20G的文件系統,塊大小為2048,文件系統為ext4,卷標為TEST,要求此分區開機後自動掛載至/testing目錄,且默認有acl掛載選項

      a.創建20G的分區

      b. mke2fs -t ext4 -b 2048 -L TEST /dev/DEVICE

      c.編輯/etc/fstab: 增加一行:LABEL="TEST" /testing ext4 defaults,acl 0 0

   2.創建一個5G的文件系統,卷標HUGE,要求此分區開機自動掛載至/mogdata目錄,文件系統類型為ext3

      a.創建5G分區

      b. mkfs.ext3 -L HUGE /dev/DEVICE

      c.修改配置文件/etc/fstab: 增加一行:LABEL=‘HUGE‘ /mogdata ext3 defaults 0 0

   3.寫一個腳本:

(1)列出當前系統識別到的所有磁盤設備

          # fdisk -l | grep -o "^Disk /dev/[sh]d[a-z]"

(2)如磁盤數量為1,則顯示其空間使用信息,如果大於1則顯示最後一條

        #!/bin/bash

        #

        disknum=$(fdisk -l | grep -o "^Disk /dev/[sh]d[a-z]" | wc -l)

        if [ $disknum -eq 1 ]: then

          fdisk -l `fdisk -l | grep -o "^Disk /dev/[sh]d[a-z]" | cut -d‘ ‘ -f2`

        else

          fdisk -l `fdisk -l | grep -o "^Disk /dev/[sh]d[a-z]" | tail -1 | cut -d‘ ‘ -f2 ` 

        fi       

           

  

磁盤管理與文件系統