# 回顾分区和文件系统

# 分区类型

分区主要有以下几种类型:

  • 主分区:总共最多只能分四个
  • 扩展分区:只能有一个,也算作主分区的一种,也就是说主分区 + 扩展分区最多有四个。但是扩展分区不能存储数据和格式化,必须再划分成逻辑分区才能使用。
  • 逻辑分区:逻辑分区是在扩展分区中划分的,如果是 IDE 硬盘,linux 最多支持 59 个逻辑分区,如果是 SCSI 硬盘,linux 最多支持 11 个逻辑分区。

fenquo1

分区的设备文件名

分区设备文件名
主分区 1/dev/sda1
主分区 2/dev/sda2
主分区 3/dev/sda3
扩展分区/dev/sda4
逻辑分区 1/dev/sda5
逻辑分区 2/dev/sda6
逻辑分区 3/dev/sda7

通常我们更习惯的分区方式是下面这种,只设一个主分区,剩余全是扩展分区,注意逻辑分区号是从 sda5 开始,也就是 1、2、3、4 只能给主分区或者扩展分区使用,不能给逻辑分区使用。

fenqu02

分区设备文件名
主分区 1/dev/sda1
扩展分区/dev/sda2
逻辑分区 1/dev/sda5
逻辑分区 2/dev/sda6
逻辑分区 3/dev/sda7

有了分区后,我们的硬盘还不能使用,必须格式化后才可以,什么叫格式化呢?格式化就是为了写入文件系统。下面开始介绍文件系统相关知识。

# 文件系统

文件系统有很多种,比如 linux 的 ext2、ext3、ext4,下面主要介绍这几种,对于一些新的文件系统暂不考虑。

  • ext2:是 ext 文件系统的升级版本,redhat linux7.2 版本以前的系统默认都是 ext2 文件系统。1993 年发布,最大支持 16TB 的分区和最大 2TB 的文件(1TB=1024G=1024 * 1024M)
  • ext3:ext3 文件系统是 ext2 文件系统的升级版本,最大的区别就是带日志功能,以在系统突然停止时提高文件系统的可靠性。支持最大 16TB 的分区和最大 2TB 的文件。
  • ext4:它是 ext3 文件系统的升级版。ext4 在性能、伸缩性和可靠性方面进行了大量改进。ext4 的变化可以说是翻天覆地的,比如向下兼容 ext3、最大 1EB 文件系统和 16TB 文件、无限数量子目录、Extends 连续数据块概念、多块分配、延迟分配、持久预分配、快速 FSCK、日志校验、无日志模式、在线碎片整理、inode 增强、默认启用 barrier 等。是 Centos6.3 的默认文件系统。(1EB=1024PB=1024 * 1024TB)

# 文件系统常用命令

# df 命令、du 命令、fsck 命令和 dump2fs 命令

# df 命令

命令是 df [选线] [挂载点] ,选项有:

  • -a:显示所有文件系统信息,包括特殊文件系统,如 /proc、/sysfs
  • -h:使用习惯单位显示容量,如 KB、MB 或 GB 等
  • -T:显示文件系统类型
  • -m:以 MB 为单位显示容量
  • -k:以 KB 为单位显示容量。默认就是以 KB 为单位。
[root@core-pods-3 ~]# df
Filesystem     1K-blocks    Used Available Use% Mounted on
devtmpfs          505336       0    505336   0% /dev
tmpfs             515956       0    515956   0% /dev/shm
tmpfs             515956   32644    483312   7% /run
tmpfs             515956       0    515956   0% /sys/fs/cgroup
/dev/sda2       22236816 3694812  17392780  18% /
/dev/sda1         388480  262377    105623  72% /boot
tmpfs             103192       0    103192   0% /run/user/0
[root@core-pods-3 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        494M     0  494M   0% /dev
tmpfs           504M     0  504M   0% /dev/shm
tmpfs           504M   32M  472M   7% /run
tmpfs           504M     0  504M   0% /sys/fs/cgroup
/dev/sda2        22G  3.6G   17G  18% /
/dev/sda1       380M  257M  104M  72% /boot
tmpfs           101M     0  101M   0% /run/user/0

# 统计目录或文件大小

命令是 du [选项] [目录或文件名] ,选项有:

  • -a:显示每个子文件的磁盘占用量。默认只统计子目录的磁盘占用量
  • -h:使用习惯单位显示磁盘占用量,如 KB、MB 或 GB 等
  • -s:统计总占用量,而不列出子目录和子文件的占用量

ll -h 统计目录有局限性。

服务器高峰期最好不要使用 du -sh / 做磁盘统计。

[root@core-pods-3 ~]# du -sh ./*
4.0K    ./abc
44K     ./bak
4.0K    ./cde
4.0K    ./cde~
4.0K    ./cdz~
4.0K    ./ls.log
4.0K    ./test
8.0K    ./test2
[root@core-pods-3 ~]# du -sh /etc/
41M     /etc/
[root@core-pods-3 ~]# du -ah ./*
4.0K    ./abc
44K     ./bak
4.0K    ./cde
4.0K    ./cde~
4.0K    ./cdz~
4.0K    ./ls.log
0       ./test/cde
4.0K    ./test
4.0K    ./test2/fgh
8.0K    ./test2
[root@core-pods-3 ~]# du -sh /
du: cannot access /proc/1684/task/1684/fd/4: No such file or directory
du: cannot access /proc/1684/task/1684/fdinfo/4: No such file or directory
du: cannot access /proc/1684/fd/3: No such file or directory
du: cannot access /proc/1684/fdinfo/: No such file or directory
3.7G    /
[root@core-pods-3 ~]#

du 命令和 df 命令的区别(为什么通常 df 的占用空间大于 du 看到的占用空间大小?)

df 命令是从文件系统考虑的,不光要考虑文件占用的空间,还要统计被命令或程序占用的空间(最常见的就是文件已经删除,但是程序并没有释放空间)

du 命令是面向文件的,只会计算文件或目录占用的空间

(linux 服务器应当定期重启,如果长期不重启,大量被进程占用的空间和删除的空间没有释放,所以 df 看到的远远大于 du 看到的,比如游戏服务器、文件下载服务器等)

# 文件系统修复命令 fsck

如果出现文件系统异常,可以尝试使用此命令来修复。这个命令其实不需要大家手动执行,我们系统在开机后会自动检测,而且这种是底层修复命令,有时手动执行有可能造成问题(导致系统崩溃等),尽量不要手动执行,了解即可。命令是 fsck [选项] 分区设备文件名 ,选项有:

  • -a:不用显示用户提示,自动修复文件系统
  • -y:自动修复。和 - a 作用一致,不过有些文件系统只支持 - y

# 显示磁盘状态命令 dumpe2fs

检测磁盘状态,主要看分区的数据块,主要是超级块的详细信息,命令是 dumpe2fs 分区设备文件名

[root@core-pods-3 ~]# dumpe2fs /dev/sda2 | more
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   ROOTPART
Last mounted on:          /
Filesystem UUID:          3437f1a0-f850-4f1b-8a7c-819c5f6a29e4
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_fil
e 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:              1411680
Block count:              5664208
Reserved block count:     283210
Free blocks:              5142565
Free inodes:              1381507
First block:              0
Block size:               4096
Fragment size:            4096
Group descriptor size:    64
Reserved GDT blocks:      459
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8160
Inode blocks per group:   510
Flex block group size:    16

# 挂载命令

# 查询与自动挂载

linux 中所有可存储设备,比如 U 盘、软盘、光盘等都需要挂载后才能使用(注意硬盘是系统自动挂载,所以可直接使用,不需要手动进行挂载),linux 中每个硬件都有一个设备名,而且光盘也都有自己的挂载点,我们需要将设备名挂载点(类似 windows 中的盘符,不过 windows 都是全自动的)联系起来,这个连接过程就是挂载。我们可以使用 mount [-l] 命令查询系统中已经挂载的设备,-l 会显示卷标名称。

[root@core-pods-3 ~]# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
/dev/sda2 on / type ext4 (rw,noatime,discard,data=ordered)
/dev/sda1 on /boot type ext3 (rw,noatime,discard,data=ordered)
... ...

从上面结果可以看出,proc 和 sysfs 是内存挂载点,tmpfs 是临时文件挂载点,根 / 挂载的设备名是 /dev/sda2,/boot 挂载的设备是 /dev/sda1

也可以使用 mount -a 依据配置文件 /etc/fstab 的内容,自动挂载。光盘、u 盘、移动硬盘尽量不要做成自动挂载,假如说你的光驱里没有光盘,设置了自动挂载可能会导致系统启动失败。

# 挂载命令格式

命令比较复杂,命令是 mount [-t 文件系统] [-L 卷标名] [-o 特殊选项] 设备文件名 挂载点 。其实前面选项不写也行的(不写有个默认),这个主要就是将设备文件名和挂载点连接起来。选项有:

  • -t 文件系统:假如文件系统类型来指定挂载的类型,可以 ext3、ext4、iso9660(光驱)等文件系统(fat16 - fat, fat32 - vfat)
  • -L 卷标名:挂载指定卷标的分区,而不是安装设备文件名挂载。其实就是给你的分区起了个别名,不起也没事,意义不大
  • -o 特殊选项:可以指定挂载的额外选项。
参数说明
atime/noatime更新访问时间 / 不更新访问时间。访问分区文件时,是否更新文件的访问时间,默认为更新
async/sync异步 / 同步,默认为异步
auto/noauto自动 / 手动,mount -a 命令执行时,是否自动安装 /etc/fstab 文件内容挂载,默认为自动
defaults定义默认值,相当于 rw,suid,dev,exec,auto,nouser,async 这七个选项
++ exec/noexec ++执行 / 不执行,设定是否允许在文件系统中执行可执行文件,默认是 exec 允许
++ remount ++重新挂载已经挂载的文件系统,一般用于指定修改特殊权限
rw/ro读写 / 只读,文件系统挂载时,是否具有读写权限,默认是 rw
suid/nosuid具有 / 不具有 suid 权限,设定文件系统是否具有 suid 和 sgid 的权限,默认是具有
user/nouser允许 / 不允许普通用户挂载,设定文件系统是否允许普通用户挂载,默认是不允许,只有 root 用户可以挂载分区
usrquota写入代表文件系统支持用户磁盘配额,默认不支持
grpquota写入代表文件系统支持组磁盘配额,默认不支持
[root@core-pods-3 ~]# vi demo.sh
[root@core-pods-3 ~]# chmod u+x demo.sh 
[root@core-pods-3 ~]# ./demo.sh 
Hello Jalen
[root@core-pods-3 ~]# mv demo.sh /home/
[root@core-pods-3 ~]# /home/demo.sh 
Hello Jalen
[root@core-pods-3 ~]# mount -o remount,noexec /home
[root@core-pods-3 ~]# /home/demo.sh 
-bash: /home/demo.sh 权限不足
[root@core-pods-3 ~]# mount -o remount,exec /home
[root@core-pods-3 ~]# /home/demo.sh 
Hello Jalen

# 挂载光盘与 U 盘

# 挂载(卸载)光盘

  1. 建立挂载点: mkdir /mnt/cdrom/ (通常:/mnt 挂 u 盘,/media 挂光盘,并不强制,看习惯)
  2. 把光盘放入光驱:虚拟机 - 设置 - 选择光盘 (注意 connected 勾选)
  3. 挂载光盘: mount -t iso9660 /dev/cdrom /mnt/cdrom/mount /dev/sr0 /mnt/cdrom ,注意 cdrom 其实是 sr0 的软连接,所以两个命令执行哪个都可以,光盘文件系统默认就是 iso9660,其实也可以不用写,直接 mount /dev/cdrom /mnt/cdrom/
  4. 访问光盘:去挂载点下访问,即 /mnt/cdrom
  5. 弹出光盘:要正常卸载后才能弹出光盘,命令是 umount 设备文件名或挂载点 ,设备名或挂载点只能写一个

# 挂载 U 盘

  1. 查看 U 盘设备文件名: fdisk -l ,U 盘设备名不是固定的,U 盘挂载不能用远程工具 ssh 了,只能直接登录虚拟机后再直接插入 U 盘,否则是 windows 检测的 U 盘,此时才可以切换远程工具。
  2. 创建挂载点:找到 U 盘设备名后,直接用 mount 挂载即可,命令是 mount -t vfat /dev/sdb1 /mnt/usb/ ,注意如果你的 U 盘是 fat16,直接写 -t fat ,如果是 fat32,要写 -t vfat ,注意:linux 默认是不支持 NTFS 文件系统的,如果你的移动硬盘是 NTFS,那不支持(其实也有支持方法,下一节说明),就像有些移动硬盘接入 MacOS 只能看不能改。
  3. 卸载: umount /dev/sdb1

# 支持 NTFS 文件系统

Linux 默认不支持 NTFS 分区的,所以有些 NTFS 移动硬盘默认是不支持的。但是我们有几个方法可以是 linux 支持 NTFS。(注意一个区别:linux 硬件不需要驱动 <linux 内核包含>,而 windows 需要)

  1. 手工编译内核:重新编译内核,把 NTFS 驱动编译进来,这个很麻烦的,用的很少
  2. 利用第三方插件:这个比较简单,比如安装 NTFS-3G 插件
    [root@core-pods-3 ~]# tar -zxvf ntfs-3g_ntfsprogs-xxxx.tgz
    [root@core-pods-3 ~]# cd ntfs-3g_ntfsprogs-xxxx
    [root@core-pods-3 ~]# ./configure
    [root@core-pods-3 ~]# make
    [root@core-pods-3 ~]# make install
    [root@core-pods-3 ~]# yum install ntfs-3g
    [root@core-pods-3 ~]# fdisk -l
    [root@core-pods-3 ~]# mount -t ntfs-3g /dev/sdb1 /mnt/usb/    # 分区设备文件名 挂载点
    [root@core-pods-3 ~]# umount /mnt/usb/

# fdisk 分区

学习用 fdisk 给我们的 linux 新建一个分区

# fdisk 命令分区过程

  1. 添加新硬盘:虚拟机断电后添加新的硬件,虚拟机 - 设置 - 添加 硬盘,添加 SCSI 硬盘

  2. 查询新硬盘是否被识别: fdisk -l

  3. 使用 fdisk 命令分区: fdisk /dev/sdb ,分区完成后 sdb 后面才会出现数字,比如 sdb1、sdb2...

  4. fdisk 交互指令说明

    命令说明
    a设置可引导标记
    b编辑 bsd 磁盘标签
    c设置 DOS 操作系统兼容标记
    d删除一个分区
    l显示已知的文件系统类型。82 为 linux swap 分区,83 为 linux 分区
    m显示帮助菜单
    n新建分区
    o建立空白 DOS 分区表
    p显示分区列表
    q不保存退出
    s新建空白 SUN 磁盘标签
    t改变一个分区的系统 ID
    u改变显示记录单位
    v验证分区表
    w保存退出
    x附加功能(仅专家)
  5. 分区结束:可以重启 或者 执行 # partprobe (可以当成分区后必须执行的命令),此时使用 fdisk -l 可以查看到分区了

  6. 格式化分区:扩展分区不能格式化,命令是 mkfs -t ext4 /dev/sdb1

  7. 创建挂载点将分区挂载上:

    # mkdir /disk1
    # mkdir /disk5
    # mount /dev/sdb1 /disk1/
    # mount /dev/sdb5 /disk5/
    # mount

# 分区自动挂载与 fstab 文件修复

# /etc/fstab 文件

想要分区自动挂载,按格式修改 /etc/fstab 这个文件就行了。

  • 第一阶段:分区设备文件名或 UUID(硬盘通用唯一识别码,UUID 更可靠点,dumpe2fs 命令查看)
  • 第二阶段:挂载点
  • 第三阶段:文件系统名称
  • 第四阶段:挂载参数
  • 第五阶段:指定分区是否被 dump 备份,0 代表不备份,1 代表每天备份,2 代表不定期备份
  • 第六阶段:指定分区是否被 fsck 检测,0 代表不检测,其他数字代表检测的优先级,1 的优先级比 2 高,一般手工添加的都不要比 /boot 高。
[root@core-pods-3 ~]# vi /etc/fstab
# /etc/fstab
# Created by anaconda on Mon Mar 13 20:42:02 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
#
UUID=3437f1a0-f850-4f1b-8a7c-819c5f6a29e4 /                       ext4    defaults,discard,noatime        1 1
UUID=ad1361f7-4ab4-4252-ba00-5d4e5d8590fb /boot                   ext3    defaults,discard,noatime        1 2
/swap  none  swap  sw 0  0
[root@core-pods-3 ~]# mount -a  # 检测你添加的配置是否有问题,有问题会报错
# 如果写错了,重启可以输入 root 密码,重新挂载
[root@core-pods-3 ~]# mount -o remount,rw

# 分配 swap 分区

swap 分区是必须存在的,有时使用时发现我们的 swap 分区不足,此时需要增加空间。我们可以使用 free 查看内存与 swap 分区使用情况。一般交换分区几百兆就够了,使用不多。增加分区可以使用 fdisk 命令,注意 linux swap 分区 id 号是 82,不是默认的 83,+1G

  • cached(缓存):是指把读取出来的数据保存再内存当中,当再次读取时,不用读取硬盘而直接从内存当中读取,加速了数据的读取过程

  • buffer(缓冲):是指在写入数据时,先把分散的写入操作保存到内存当中,当达到一定程度再集中写入硬盘,减少了磁盘碎片和硬盘的反复寻道,加速了数据的写入过程

[root@core-pods-3 boot]# free
              total        used        free      shared  buff/cache   available
Mem:        1031912      220112      174992       25620      636808      602040
Swap:        533500        7100      526400
[root@core-pods-3 boot]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1007         215         170          25         621         587
Swap:           520           6         514
[root@core-pods-3 boot]# fdisk /dev/sdb   # 后续一系列 fdisk 交互命令
[root@core-pods-3 boot]# partprobe   # 报错不用管
[root@core-pods-3 boot]# mkswap /dev/sdb6  # 格式化 swap 分区,注意不是 mkfs
[root@core-pods-3 boot]# swapon /dev/sdb6  # 将新的 swap 分区加入 swap 分区
[root@core-pods-3 boot]# free -m   # 再去看 swap 空间大小
[root@core-pods-3 boot]# swapoff /dev/sdb6  # 将新的 swap 分区移出 swap 分区
[root@core-pods-3 boot]# vi /etc/fstab    # 启动自动挂载
/dev/sdb6    swap    swap    defaults    0 0