• 操作系统必须用一种特定的方式对磁盘进行操作。文件系统是一种对物理空间的组织方式,通常在格式化硬盘时创建。
    • 在Windows下的文件系统:NTFS、FAT
    • 在Linux下的文件系统: Minix(最早)、EXT2、VFS、/PROC文件系统
  • 每个实际文件系统从操作系统&系统服务中分离出来,它们之间通过一个借口层:虚拟文件系统 VFS 来通讯。
    • VFS 使得Linux可以支持多个不同的文件系统;允许用户同时能透明地安装许多不同的文件系统。
  • /PROC 文件系统只存在内存当中,而不占用外存空间。它以文件系统的方式为访问内核数据的操作提供接口。
  • 通常文件保存在称为 块物理设备 的磁盘or磁带上。一套Linux系统支持若干物理盘,每个物理盘可以定义一个或多个文件系统(类比于微机磁盘分区)。
  • 每个文件系统由逻辑盘的序列组成,一个逻辑盘空间一盘划分为几个用途各不相同的部分,即 引导块、超级块、inode分区、数据区
    • 引导块: 在文件系统的开头,通常为一个扇区,其中存放引导程序,用于读入并其哦但嗯操作系统;
    • 超级块: 用于记录文件系统的管理信息。特定的文件系统定义了特定的超级块。
    • inode分区: (索引节点)一个文件or目录占据一个索引节点。第一个索引节点是该文件系统的根节点。利用索引节点,可以把一个文件系统挂在另一个文件系统的非叶节点上;
    • 数据区: 用于存放文件数据or管理数据。
  • ext文件系统
    • ext3fs, Second Extended File System
    • ext4fs, Third Extended File System:基于灾难恢复的需求,ext4fs预留了一块专门的区域来保存日志文件。通过增加日志功能,ext4fs大大增加了文件系统的可靠性。(修改文件时,首先会将所作的修改写入日志文件,随后再写入一条记录标志日志项的结束,最后才会对文件系统做实际修改)
  • swap交换分区 ,并不是一种文件系统,而是一块特殊的硬盘空间,当实际内存不够用的时候,操作系统会从内存中取出一部分暂时不用的数据,放在交换分区中,从而为当前运行的程序腾出足够的内存空间。(这种”拆东墙补西墙“的方式被应用于几乎所有操作系统)
    • 优点:通过操作系统的调度,应用程序实际可以使用的内存空间将远远超过系统的物理内存;
    • 限制:频繁读写硬盘会显著降低系统的运行速度。
    • 相对而言,Windows系统不会为swap单独划分一个分区,而是使用分页文件实现相同的功能。(在概念上,Windows称其为”虚拟内存“)
    • 一般来说,swap分区容量应该要大于物理内存的大小,但目前不能超过2GB。

一、磁盘管理常用命令

  • fdisk 是一个基于 MBR 的分区工具(不支持 GPT),支持绝大多数操作系统
    • 只有具有root权限才能运行
    • 分区之后需要使用 partprobe 命令让内核更新分区信息,否则需要重启才能识别新的分区。
fdisk    manipulate disk partition table(操作磁盘分区表)
    $sudo fdisk /dev/sdb        # /dev/sda is the first disk, and /dev/sdb is the second.
    ```
    fdisk是一个交互式的应用程序。在执行完一项操作后,fdisk会显示一行信息,并给出一个冒号':'等待用户输入命令,就像Shell一样。
        n    add a New partition
        p    Print the partition table
        t    change a partition Type
        w    Write table to disk and exit(写入修改)
        q    Quit without saving changes
        l    List known partition types(查看分区类型及其编号)
    ```
    -l    --list    List the partition tables for the specified devices and then exit.

df    report file system disk space usage(收集和整理当前已经挂载的全部文件系统的一些重要统计数据)
    -t    --type        limit listing to file systems of Type
        ```
        ext2
        ext3
        ext4
        vfat    Windows的FAT16/FAT32文件系统
        ntfs    Windows的NTFS文件系统
        iso9660    CD-ROM光盘的标准文件系统
        ```
    -h    --human-readable
du    estimate file space usage(查看当前系统容量的情况)
    -a    --all        write counts for all files, not just directories 
    -h    --human-readable
    -s    --summarize    display only a total for each argument(列出总量,不列出每个目录容量)
    -B    --block-size    scale sizes by SIZE before printing them
    -k            like "--block-size 1K"
    -m            like "--block-size 1M"

二、创建文件系统

  • 操作系统通过文件系统管理文件及数据,磁盘分区后需要创建文件系统才能够被操作系统使用
  • 创建创建文件系统的过程有称之为 格式化
    • 没有文件系统的设备又称之为裸设备(raw)
    • 常见的文件系统有:fat32、NTFS、ext2、ext3、ext4、xfs、HFS等
    • 文件系统之间的区别:日志、支持分区大小、支持单个文件大小、性能等
      • Windows 下的主流文件系统是:NTFS
      • Linux 下的主流文件系统是:ext4
      • U盘 中的文件系统:FAT32(支持的单个文件不能超过4G)
  • 带日志的文件系统(ext3、ext4)拥有较强的稳定性,在出现错误时可以进行恢复。
  • 带日志的文件系统会使用一种叫做“两阶段提交”的方式,进行磁盘操作:
    1. 文件系统将准备执行的事务的具体内容写入日志;
    2. 文件系统进行操作;
    3. 操作成功后,将事务的具体内容从日志中删除。
mke2fs    create an ext2/ext3/ext4 Filesystem
    -b    --block-size    指定文件系统块大小
    -c            建立文件系统时检查损坏块
    -L    --label        指定卷标
    -j            建立文件系统日志
    -t    --type        指定文件系统类型
mkfs    相较于mke2fs简单,但是支持的参数少,不能进行精细化的控制
    $ mkfs.ext4 /dev/sda1
    $ mkfs.vfat /dev/sda1
dumpe2fs    查看分区的文件系统信息
    $ dumpe2fs /dev/sda2

e2label    为文件系统添加标签
fsck    用来检查并修复损坏的文件系统
    默认会自动判断文件系统类型;如果文件系统损坏较为严重,则用参数 -t 指定文件系统类型
    系统启动时会对磁盘进行fsck操作
    -y

三、文件系统的挂载

  • 在Linux中,每个设备都被映射为一个特殊文件,这个文件被称作“设备文件”。
  • 对于上层程序而言,所有对这个设备的操作都是通过读写这个文件实现的。
  • Linux把所有的设备文件都放在 /dev 目录下。其中大部分是 块设备文件&字符设备文件:
    • 块设备: 可以随即读写(磁盘: /dev/sda 、/dev/sdb)
    • 字符设备: 只能按顺序接收“字符流”(打印机)
  • 硬盘在Linux中遵循一种特定的明明规则,如 sda1 表示第1块硬盘上的第1个主分区,sdb6 代表第2块硬盘上的第2个逻辑分区。
  • 用户不能直接通过设备文件访问存储设备,所有的存储设备在使用前都必须首先被挂载到一个目录下,然后就可以像操作目录一样使用这个设备了。
  • 磁盘分区,并创建好文件系统后,需要挂载到一个目录才能够使用。(Windows或Mac系统会自动进行挂载,Linux需要手工进行挂载操作或配置系统进行自动挂载)
  • 对磁盘进行操作的时候,必须要先卸载文件系统。
## 如何挂载 & 卸载文件系统?
sudo mkdir /mnt/vista        ## 新建一个目录用来挂载文件系统
sudo mount /dev/sda3 /mnt/vista ## 将Windows所在的分区 /dev/sda3 挂载到目录 /mnt/vista 中。这里假设Windows被安装在第1块磁盘的第3个主分区上。
cd /mnt/vista    ## 进入挂载的文件系统进行管理
## 卸载设备时,必须先退出光盘所挂载的目录,否则系统会提示设备忙并拒绝卸载。
cd ~
sudo umount /dev/sda3    
mount    Mount a filesystem
    -t    --type        the argument following the -t is used to indicate the filesystem type
    -r    --read-only    mount the filesystem read-only
    -w --rw    --read-write    mount the filesystem read/write.(The read-write is kernel default. A synonym is -o rw)
    -o    --options    use the specified mount options
        ```
        auto        开机自动挂载
        default, noauto 开机不自动挂载 Can only be mounted explicitly
        nouser        forbid an ordinary user to mount the filesystem.(This is the default) 只有root可挂载
        ro        mount the filesystem read-only
        rw        mount the filesystem read-write    (default)
        user        allow an ordinary user to mount the filesystem.(the name of the mounting user is written to the mtab file so that this same user can unmount the filesystem again)
        exec        允许任何人运行该设备上的程序 Permit execution of binaries
        sync        不使用缓存,而是对所有操作直接写入磁盘
        async        使用缓存(default)
        noatime        每次访问文件时,不更新文件的访问时间
        atime
        remount        重新挂载文件系统
        ```
umount    Unmount file systems
    -r    --read-only    在无法卸载文件系统的情况下,尝试以只读方式重新载入。
  • 如果卸载文件系统时出现“device is busy”报错,则表示该文件正在被使用,无法卸载。
    • fuser -m /mnt # 查看使用文件系统的进程
    • lsof /mnt # 查看正在被使用的文件

3.1 自动挂载

  • 配置文件/etc/fstab 用来定义需要自动挂载的文件系统。确定了系统如何在开机时挂载硬盘、系统怎么知道哪些分区是需要挂载的信息。该文件对所有用户可读,但只有root用户有权修改该文件。
  • 要挂载的设备也可以用 LABEL=DIRPATH 进行识别。
  • mount -a 命令会挂载所有 /etc/fstab 中定义的自动挂载项。
# /dev/sda1
## UUID        mount point    文件系统类型    各种挂装参数                            备份频度    在重启过程中文件系统的检查顺序
UUID=BD3E-657F  /boot/efi     vfat          rw,relatime,fmask=0023,dmask=0023,utf8,errors=remount-ro    0         2

UUID, Universally Unique Identifier, 通用唯一标识符,用于确定互联网上的“一件东西”的唯一标识符
挂载参数,如:ro/rw/async/atime...