Linux文件系統管理

一、什麼是文件系統

操作系統中用於管理和組織磁盤設備上文件的方法和數據結構叫做文件系統.

1.1 根文件系統(rootfs):

在Linux中, 文件系統和倒樹形結構一樣, 位於最頂層的的一個分區我們稱之爲根(root), 用於安裝linux系統, 類似於Windos的系統盤; 根分區又叫做根文件系統(root filesystem).
根文件系統由內核在啓動的時候裝載(之裝載根分區, 其他分區由mount命令進行裝載).

1.2 掛載(mount)概念

掛載可以理解爲給一個磁盤分區創建一個入口(Mount Point)並與之關聯起來讓用戶能夠訪問分區中的類容的行爲或動作, 訪問入口類似與Windows的盤符C:\、D:\等.
分區掛載

解除這個關聯關係的過程稱爲卸載.

1.3、FHS(FileSystem Heirache Strandard)

由於Linux有衆多的發行版, 爲了保證每個發行版中文件系統的一致性, FHS定義了Liunx發行版的目錄結構和目錄內容, FHS由Linux Foundation維護, 最新版本3.0發佈於2015年6月; 下列是節選. 詳細請參見FHS

  • /boot: 引導文件存放目錄, 內核文件(vmlinuz)、引導加載器(bootloader, grub)都存放於此目錄;
  • /bin: 供所有用戶使用的基本命令, 不能關聯至獨立分區, OS啓動即會用到的命令;
  • /sbin: 管理類的基本命令, 不能關聯至獨立分區, OS啓動即會用到的命令, 供系統管理員(root);
  • /lib: 基本共享庫文件, 以及內核模塊文件(/lib/modules);
  • /lib64: 專用於x86_64系統上的輔助共享庫文件存放位置;
  • /etc: 配置文件目錄(純文本文件);
  • /home/USERNAME: 普通用戶的家目錄;
  • /root: 管理員的家目錄;
  • /media: 便攜式移動設備掛載點;
  • /mnt: 臨時文件系統掛載點;
  • /dev: 設備文件及特殊文件存放位置;
  • /opt: 第三方應用程序的安裝位置;
  • /srv: 系統上運行的服務用到的數據;
  • /tmp: 臨時文件存放位置;
  • /usr: universal shared, read-only data;
    • bin: 保證系統擁有完整功能而提供的應用程序;
    • sbin: 保證系統擁有完整功能而提供的應用程序, 只有管理員有權限運行;
    • lib:
    • lib64:
    • include: C程序的頭文件(header files)存放位置;
    • share: 結構化獨立的數據, 例如doc, man等;
    • local: 取代/opt的第三方應用程序的安裝位置;
      bin, sbin, lib, lib64, etc, share
  • /var: variable data files;
    • cache: 應用程序緩存數據目錄;
    • lib: 應用程序狀態信息數據;
    • local: 專用於爲/usr/local下的應用程序存儲可變數據;
    • lock: 鎖文件
    • log: 日誌目錄及文件存放目錄;
    • opt: 專用於爲/opt下的應用程序存儲可變數據;
    • run: 運行中的進程相關的數據, 通常用於存放進程的PID文件;
    • spool: 應用程序數據池;
    • tmp: 保存系統兩次重啓之間產生的臨時數據;
  • /proc: 用於輸出內核和進程信息相關的虛擬文件系統;
  • /sys: 用於輸出當前系統上硬件設備相關信息的虛擬文件系統;
  • /selinux: security enhanced Linux, selinux相關的安全策略等信息的存儲位置;

二、Linux下的文件類型

Linux系統中一切皆文件, 常見的文件類型有:

- (f): 普通文件  
d: 目錄文件
b: 塊設備
c: 字符設備
l: 符號鏈接文件(軟連接)
p: 管道文件
s: 套接字文件, socket

三、文件系統類型

  • Linux支持如下文件系統:
    • ext系列: ext2~4
    • xfs
    • btrfs
    • reiserfs
    • jfs
    • swap: 交換分區使用
  • Windows下文件系統
    • fat32
    • NTFS
  • Unix下文件系統
    • FFS
    • UFS
    • JFS2
  • 網絡文件系統
    • NFS
    • CIFS
  • 集羣文件系統
    • GFS2
    • OCFS2
  • 分佈式文件系統
    • ceph
    • moosefs
    • mogilefs
    • GlusterFS
    • lustre
  • 根據其是否支持“journal”功能
    • 日誌型文件系統: ext3, ext4, xfs, ...
    • 非日誌型文件系統: ext2, vfat

四、文件系統的組成部分

文件系統由兩部分組成, 一是內核中的模塊, 二是管理文件系統的工具.

4.1 文件系統作爲內核模塊的管理方法

作爲內核中的模塊可以使用lsmod進行查看, 將一個新的文件系統作爲一個模塊添加進內核使用modprobe命令, 示例如下:

# lsmod: 顯示Linux內核模塊的狀態
[root@zabbix ~]# lsmod | grep xfs
xfs                   939662  2 
libcrc32c              12644  1 xfs
[root@zabbix ~]# lsmod | grep ext4
# 沒有查找到ext4, 可以通過modprobe將ext4文件系統裝載至內核模塊

# modprobe: 添加一個模塊至Linux內核或者從內核中刪除一個模塊
# modprobe -a ModulName: 通過命令行將模塊插入內容
[root@zabbix ~]# modprobe -a ext4
[root@zabbix ~]# lsmod | grep "ext4"
ext4                  578819  0 
mbcache                14958  1 ext4
jbd2                  102940  1 ext4

# modprobe -r ModulName: 從內核中刪除一個模塊, 如果此模塊有依賴的模塊並且沒有被使用, 會嘗試一起刪除.
[root@zabbix ~]# modprobe -r ext4
[root@zabbix ~]# lsmod | grep "ext4"

五、Linux的虛擬文件系統(VFS)

Linux系統下存在很多文件系統, 有些時候我們會對某些文件進行跨文件系統進行操作, 但是我們在操作的時候卻不需要在意文件系統的不同, 如下圖所示:
跨文件系統操作

[root@zabbix ~]# df -h
Filesystem                               Size  Used Avail Use% Mounted on
/dev/mapper/centos_docker--package-root   18G  2.5G   15G  15% /
devtmpfs                                 903M     0  903M   0% /dev
tmpfs                                    913M     0  913M   0% /dev/shm
tmpfs                                    913M  8.6M  904M   1% /run
tmpfs                                    913M     0  913M   0% /sys/fs/cgroup
/dev/sda1                                497M  124M  373M  25% /boot
tmpfs                                    183M     0  183M   0% /run/user/0
/dev/sdb1                                5.0G   33M  5.0G   1% /mnt/xfs # sdb1文件系統爲xfs
/dev/sdb2                                4.8G   20M  4.6G   1% /mnt/ext4 # sdb2文件系統爲ext4
[root@zabbix ~]# blkid /dev/sdb1
/dev/sdb1: UUID="e8a1015b-8b58-4bba-864b-bd8973dcf7bd" TYPE="xfs" 
[root@zabbix ~]# blkid /dev/sdb2
/dev/sdb2: UUID="ae886019-79d3-4ff4-b7c4-79915a6677d8" TYPE="ext4" 

# 通過cp操作來測試跨文件系統操作
[root@zabbix ~]# cp -rf /mnt/xfs/* /mnt/ext4/
[root@zabbix ~]# ls -l /mnt/ext4/
total 24
-rw-r--r-- 1 root root   497 Dec 12 10:50 fstab
-rw-r--r-- 1 root root   233 Dec 12 10:50 hosts
drwx------ 2 root root 16384 Dec 12 10:46 lost+found
# 直接cp即可, 不需要額外的操作

爲什麼我們能夠直接進行跨文件小系統的操作, 而不需要額外的操作呢? 這是因爲有VFS(Virtual FileSystem)的原因.
VFS是Linux內核中用於對接不同文件系統的一箇中間層, 通過其提供的系統調用來訪問多個不同文件系統; 如下圖所示:
VFS

六、文件系統相關管理命令

查看當前系統支持的文件系統:

[root@zabbix ~]# cat /proc/filesystems
nodev   sysfs
nodev   rootfs
nodev   bdev
nodev   proc
nodev   cgroup
nodev   cpuset
nodev   tmpfs
nodev   devtmpfs
nodev   debugfs
nodev   securityfs
nodev   sockfs
nodev   pipefs
nodev   anon_inodefs
nodev   configfs
nodev   devpts
nodev   ramfs
nodev   hugetlbfs
nodev   autofs
nodev   pstore
nodev   mqueue
        xfs
nodev   vmhgfs
nodev   overlay
        ext3
        ext2
        ext4
        btrfs

6.1 創建文件系統(格式化)

6.1.1 mkfs命令

mkfs命令永不創建文件系統, 用法如下:

# mkfs.FS_TYPE [OPTIONS] /dev/DEVICE; FS_TYPE: ext4、xfs、btrfs、vfat、...
[root@zabbix ~]# mkfs. # 雙擊tab進行命令補全
mkfs.btrfs   mkfs.cramfs  mkfs.ext2    mkfs.ext3    mkfs.ext4    mkfs.minix   mkfs.xfs
[root@zabbix ~]# mkfs.xfs /dev/sdb1 
meta-data=/dev/sdb1              isize=256    agcount=4, agsize=131072 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=524288, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none      
extsz=4096   blocks=0, rtextents=0

# mkfs -t FS_TYPE /dev/DEVICE
    # -L 'LABLE': 設定卷標
[root@zabbix ~]# mkfs -t btrfs -L 'Text' /dev/sdb2
btrfs-progs v3.19.1
See http://btrfs.wiki.kernel.org for more information.

Turning ON incompat feature 'extref': increased hardlink limit per file to 65536
Turning ON incompat feature 'skinny-metadata': reduced-size metadata extent refs
fs created label Text on /dev/sdb2 # 創建的卷標
        nodesize 16384 leafsize 16384 sectorsize 4096 size 1.00GiB

[root@zabbix ~]# blkid /dev/sdb2 
/dev/sdb2: LABEL="Text" UUID="41968d5d-06db-45a9-96ff-429a836327d4" UUID_SUB="1e4c6b46-9319-48d9-8b9f-87a52f9d318e" TYPE="btrfs"

6.1.2 mke2fs命令

mke2fs命令是ext系列文件系統專用管理工具, 用法如下:

# mke2fs [OPTIONS] /dev/DEVICE
    # -t [ext2|ext3|ext4]: 指定文件系統類型
    # -b [1024|2048|4096]: 指定塊大小
    # -L 'LABEL': 指定標籤
    # -j: 相當於-t ext3
    # -i number: 爲數據空間中每number個字節創建一個inode, 此大小不應該小於block的大小
    # -N number: 爲數據空間創建number個inode
    # -m number: 爲管理人員預留的空間佔據的百分比
    # -O FEATURE[,...]: 啓用指定特性
        # -O ^FEATURE: 關閉指定特性

6.1.3 mkswap命令

mkswap命令用於創建交換分區, 需要先在fdisk中調整分區編號爲82.

# mkswap [OPTIONS] DEVICE
    # -L 'LABEL': 指定卷標
[root@zabbix ~]# mkswap -L 'swap test' /dev/sdb1 
mkswap: /dev/sdb1: warning: wiping old ext3 signature.
Setting up swapspace version 1, size = 2097148 KiB
LABEL=swap test, UUID=890bdd0b-8fbf-40a3-97f0-56779c256612

[root@zabbix ~]# blkid /dev/sdb1 
/dev/sdb1: LABEL="swap test" UUID="890bdd0b-8fbf-40a3-97f0-56779c256612" TYPE="swap"

6.2 文件系統參數查看命令

6.2.1 e2label命令

e2label用於管理ext系列文件系統的LABEL.

# e2label /dev/DEVICE [LABEL]
[root@zabbix ~]# e2label /dev/sdb1 'e2label test'
[root@zabbix ~]# e2label /dev/sdb1 
e2label test
[root@zabbix ~]# blkid /dev/sdb1 
/dev/sdb1: LABEL="e2label test" UUID="7acd54a5-4692-4cdf-b614-36e0f5920922" TYPE="ext4" 

6.2.2 tune2fs命令

tune2fs用於重新設定ext系列文件系統可調整參數的值.

# -l: 查看指定文件系統超級塊信息; super block
[root@zabbix ~]# tune2fs -l /dev/sdb1 
tune2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   e2label test
Last mounted on:          <not available>
Filesystem UUID:          7acd54a5-4692-4cdf-b614-36e0f5920922
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              131072
Block count:              524288
Reserved block count:     26214
Free blocks:              498132
Free inodes:              131061
First block:              0
Block size:               4096
Fragment size:            4096
Group descriptor size:    64
Reserved GDT blocks:      255
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Tue Dec 12 14:16:48 2017
Last mount time:          n/a
Last write time:          Tue Dec 12 14:38:37 2017
Mount count:              0
Maximum mount count:      -1
Last checked:             Tue Dec 12 14:16:48 2017
Check interval:           0 (<none>)
Lifetime writes:          65 MB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      86a040e8-d691-4239-98f0-7fbe556be1ae
Journal backup:           inode blocks

# -L 'LABEL': 修改卷標
[root@zabbix ~]# tune2fs -L 'tune2fs test' /dev/sdb1
tune2fs 1.42.9 (28-Dec-2013)
[root@zabbix ~]# blkid /dev/sdb1 
/dev/sdb1: LABEL="tune2fs test" UUID="7acd54a5-4692-4cdf-b614-36e0f5920922" TYPE="ext4" 

# -m number: 修改預留給管理員的空間百分比
[root@zabbix ~]# tune2fs -m 20 /dev/sdb1 
tune2fs 1.42.9 (28-Dec-2013)
Setting reserved blocks percentage to 20% (104857 blocks)

# -j: 將ext2升級爲ext3
[root@zabbix ~]# mkfs.ext2 /dev/sdb1 
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131072 inodes, 524288 blocks
26214 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912

Allocating group tables: done                            
Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done 

[root@zabbix ~]# tune2fs -j /dev/sdb1
tune2fs 1.42.9 (28-Dec-2013)
Creating journal inode: done

[root@zabbix ~]# blkid /dev/sdb1 
/dev/sdb1: UUID="213524e4-0512-4705-98eb-3e564ce3a140" SEC_TYPE="ext2" TYPE="ext3" 

# -O: 文件系統屬性啓用或禁用; has_journal: 啓用日誌功能; ^has_journal: 關閉日誌功能
[root@zabbix ~]# tune2fs -O ^has_journal /dev/sdb1
tune2fs 1.42.9 (28-Dec-2013)

[root@zabbix ~]# tune2fs -l /dev/sdb1 | grep -i 'journal'
Journal backup:           inode blocks

[root@zabbix ~]# tune2fs -O has_journal /dev/sdb1        
tune2fs 1.42.9 (28-Dec-2013)
Creating journal inode: done

[root@zabbix ~]# tune2fs -l /dev/sdb1 | grep -i 'journal'
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype sparse_super large_file
Journal inode:            8
Journal backup:           inode blocks

# -o: 調整文件系統的默認掛載選項; acl: 啓用acl功能; ^acl: 關閉acl功能

# -U UUID: 修改UUID號

6.2.3 dumpe2fs

dumpe2fs用於查看ext文件系統超級快和文件系統佈局信息.

# dumpe2fs [option] /dev/sdb1
[root@zabbix ~]# dumpe2fs /dev/sdb1
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>
Last mounted on:          <not available>
... # 信息太多, 省略掉
Group 15: (Blocks 491520-524287)
  Block bitmap at 491520 (+0), Inode bitmap at 491521 (+1)
  Inode table at 491522-492033 (+2)
  32254 free blocks, 8192 free inodes, 0 directories
  Free blocks: 492034-524287
  Free inodes: 122881-131072

# -h: 只查看超級快信息
[root@zabbix ~]# dumpe2fs -h /dev/sdb1
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>
...

6.3 文件系統檢測

6.3.1 fsck命令

fsck用於檢測文件系統.

# fsck.FS_TYPE /dev/DEVICE
[root@zabbix ~]# fsck.
fsck.btrfs   fsck.cramfs  fsck.ext2    fsck.ext3    fsck.ext4    fsck.minix   fsck.xfs     

[root@zabbix ~]# fsck.xfs /dev/sdb2 
If you wish to check the consistency of an XFS filesystem or
repair a damaged filesystem, see xfs_repair(8).

[root@zabbix ~]# xfs_repair /dev/sdb2 
Phase 1 - find and verify superblock...
Phase 2 - using internal log
        - zero log...
        - scan filesystem freespace and inode maps...
        - found root inode chunk
...
Phase 7 - verify and correct link counts...
done

# fsck -t FS_TYPE /dev/DEVICE
    # -a: 自動修復錯誤
    # -r: 交互式修復錯誤

6.3.2 e2fsck命令

e2fsck是ext系列文件系統專用的檢查修復工具.

# e2fsck [option] /dev/DEVICE
    # -y: 自動修復
    # -f: 強制修復

七、掛載文件系統

可以通過/etc/mtab文件顯示當前系統已掛載的所有設備

[root@zabbix ~]# cat /etc/mtab 
rootfs / rootfs rw 0 0
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0

7.1 命令掛載方式

使用mount命令對文件系統進行掛載.

# mount [-fnrsvw] [-t vfstype] [-o options] /dev/DEVICE dir
[root@zabbix ~]# mount  /dev/sdb2 /mnt/xfs/             
[root@zabbix ~]# df -h
Filesystem                               Size  Used Avail Use% Mounted on
/dev/mapper/centos_docker--package-root   18G  2.5G   15G  15% /
devtmpfs                                 903M     0  903M   0% /dev
tmpfs                                    913M     0  913M   0% /dev/shm
tmpfs                                    913M  8.7M  904M   1% /run
tmpfs                                    913M     0  913M   0% /sys/fs/cgroup
/dev/sda1                                497M  124M  373M  25% /boot
tmpfs                                    183M     0  183M   0% /run/user/0
/dev/sdb2                               1014M   33M  982M   4% /mnt/xfs

# DEVICE: 指明要掛載的設備
    # /dev/sd[a-z][N]: 設備文件
    # -L 'LABEL': 卷標
    # -U 'UUID': UUID
    # 僞文件系統名稱: proc, sysfs, devtmpfs, configfs

# dir: 掛載點; 必須事先存在(建議使用空目錄), 並且如果進程正在使用中的掛載點無法umount

# 常用選項
    # -t vfstype: 指定要掛載的設備上的文件系統類型
    # -r: readonly, 只讀掛載
    # -w: read and write, 讀寫掛載
    # -n: 不更新/etc/mtab
    # -a: 自動掛載所有支持自動掛載的設備(定義在/etc/fstab文件中, 且掛載選項中有“自動掛載”功能)
    # -B, --bind: 丙丁目錄到另一個目錄上

# -o options: 掛載文件系統的選項, 可多個同時使用, 使用逗號分隔, 默認掛載選項爲defaults
    # async: 異步模式
    # sync: 同步模式
    # atime/noatime: 包含目錄和文件的訪問時間戳
    # diratime/nodiratime: 目錄訪問時間戳
    # auto/noauto: 是否支持自動掛載
    # exec/noexec: 是否支持將文件系統上應用程序運行爲進程
    # dev/nodev: 是否支持此文件系統使用設備文件
    # suid/nosuid: 是否支持使用SUID權限
    # remount: 重新掛載
    # ro: 只讀掛載
    # rw: 讀寫掛載
    # user/nouser: 是否運行普通用戶掛載次設備
    # acl: 啓用此文件系統上的acl功能

Note: 掛載點下原有文件在掛載完成後會被臨時隱藏, 查看內核追蹤到的已掛載的所有設備使用cat /proc/mounts.

7.2 卸載文件系統

使用umount命令.

# umount /dev/DEVICE|MOUNT_POINT

# fuser -v MOUNT_POINT: 查看正在訪問指定文件系統的進程

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

7.3 啓用交換分區

啓用交換分區使用swapon命令, 禁用使用swapoff命令.

# swapon [option]... [DEVICE]
    # -a: 激活所有的交換分區
    # -p PRIORITY: 指定優先級
[root@zabbix ~]# free -m | grep -i "^swap"
Swap:          2047           0        2047
[root@zabbix ~]# swapon /dev/sdb1 
[root@zabbix ~]# free -m | grep -i "^swap"
Swap:          4095           0        4095

# 禁用交換分區
[root@zabbix ~]# swapoff /dev/sdb1 
[root@zabbix ~]# free -m | grep -i "^swap"
Swap:          2047           0        2047

7.4 文件系統空間佔用等信息查看工具

df命令.

# df [OPTION]...
    # -h: human-readable
    # -i: inodes instead of blocks
    # -P: 以posix兼容的格式輸入

7.6 查看某目錄總體空間佔用狀態

du命令.

# du [OPTION]... DIR|FILE

7.7 內存空間使用狀態

free命令.

#free [OPTION]
    # -m: 以MB爲單位
    # -g: 以GB爲單位

八、文件掛載的配置文件: /etc/fstab

/etc/fstab每行定義一個要掛載的文件系統:

[root@zabbix ~]# cat /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Wed Jul  5 16:40:52 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos_docker--package-root /                       xfs     defaults        0 0
UUID=ed124d13-489a-40dd-b64b-a64a26bff6c5 /boot                   xfs     defaults        0 0
/dev/mapper/centos_docker--package-swap swap                    swap    defaults        0 0

每一列對應的項目如下:

要掛載的設備或僞文件系統(設備文件|LABEL(LABEL= )|UUID(UUID= )|僞文件系統(proc、sysfs))    掛載點    文件系統類型    掛載選項(defaults,...)    轉儲頻率(0: 不做轉儲; 1: 每天轉儲一次; 2: 每隔一天轉儲)    自檢次序(0: 不自檢; 1: 首先自檢, 一般只有rootfs採用)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章