当前位置: 代码迷 >> 综合 >> Linux学习笔记(六):磁盘分区、格式化与挂载
  详细解决方案

Linux学习笔记(六):磁盘分区、格式化与挂载

热度:80   发布时间:2024-01-16 19:15:18.0

Linux学习笔记(六):磁盘分区、格式化与挂载

  • 磁盘的分区、格式化与挂载
    • 查看分区状态
    • 磁盘分区
    • 磁盘格式化
    • 文件系统检验
    • 文件系统挂载
    • 文件系统参数修改
  • 设定开机挂载
    • 开机挂载 /etc/fstab
    • 特殊设备loop挂载
  • 内存交换空间:swap
    • 使用实体分区槽创建swap
    • 使用文件创建swap

磁盘的分区、格式化与挂载

查看分区状态

lsblk指令
lsblk指令(list block)可以列出系统上的所有磁盘列表。指令格式为 lsblk [-dfimpt] [device]。其选项与参数包括:

  • -d:仅列出磁盘本身,不会列出该磁盘的分区数据;
  • -f:同时列出磁盘内的文件系统名称;
  • -i:使用ASCII输出,不要使用复杂的编码;
  • -m:同时输出该设备在/dev下的权限数据;
  • -p:列出设备的完整文件名;
  • -t:列出磁盘的详细数据,包括磁盘队列机制、预读写的数据量大小等。

lsblk指令的输出字段一般包括:

  • NAME:设备文件名;
  • MAJ:MIN:主要:次要设备代码;
  • RM:是否为可卸载装置(removable),如光盘、USB等;
  • SIZE:设备容量;
  • RO:是否为只读设备(read-only);
  • TYPE:是磁盘(disk)、分区槽(part)还是只读存储器(rom)等输出;
  • MOUNTPOINT:挂载点。

blkid指令
blkid指令(block ID)可以列出设备的UUID等参数。Linux系统内的每个设备都会有一个独一无二的全局单一标识符,也叫通用唯一识别码(Universally Unique Identifier, UUID)。

parted指令
parted指令可以列出磁盘的分区表类型与分区信息。指令格式为 parted device_name print

磁盘分区

MBR分区表使用fdisk指令分区,而GPT分区表使用gdisk指令分区。一般先通过lsblk和blkid指令找到磁盘,再使用parted指令查看磁盘分区信息,最后再使用fdisk或gdisk指令进行分区操作。

gdisk新增分区槽
在root权限下,在终端执行 gdisk device_name 可以开始对设备进行分区操作,比如 gdisk /dev/vda。输入 ? 可以查看能够执行的操作。输入p打印已有的分区信息。输入n开始新增分区。最后输入w写入磁盘分区表。

gdisk删除分区槽
gdisk选择一个设备后,输入d可以删除一个已有的分区。删除一个分区前需要先将其从文件系统卸除。切记不要删除一个正在使用中的分区。

partprobe更新分区信息
使用gdisk新增或删除的分区表并不会马上更新。可以通过重启系统或者 partprobe [-s] 指令来更新Linux核心的分区表信息。更新完分区信息后可以使用 lsblk device_name 查看磁盘最新的分区状态。也可以使用 cat /proc/partitions 指令查看Linux核心的分区记录。

fdisk指令
在root权限下,在终端执行 fdisk device_name 可以开始对设备进行分区操作。输入 m 可以查看能够执行的操作。

磁盘格式化

分区结束后就可以进行文件系统的格式化了。对应的指令为 mkfs,即make filesystem。终端输入mkfs并连按两下tab键可以查看系统支持格式化的文件系统及对应指令。

磁盘格式化的指令格式为 mkfs [-V] [-t 文件系统] [options] [设备名] [blocks]。如果要把某一个分区(比如 /dev/vda5)格式化为XFS文件系统,可以使用两个指令:mkfs -t xfs /dev/vda5 或者 mkfs.xfs /dev/vda5(实际上,前一个指令也是调用了后一个指令来实现格式化的)。

[root@study ~]$ mkfs -t ext4 /dev/vda6
[root@study ~]$ mkfs.ext4 /dev/vda6

文件系统检验

系统宕机等其他原因可能导致文件系统发生错误。下面将以xfs和ext4为例介绍如何处理文件系统错误。无论是xfs_repair还是fsck.ext4指令,只有身份为root用户且文件系统发生错误时才能使用,同时被检查的分区一定不能挂载到系统上。

xfs_repair
xfs_repair指令可以处理XFS文件系统错误。修复时文件系统不能被挂载。指令格式为 xfs_repair [-fnd] device_name。其选项与参数包括:

  • -f:后面接的是文件而不是一个实体设备;
  • -n:单纯检查而不修改文件系统任何数据;
  • -d:在单用户维护模式下对根目录进行检查与修复(风险操作!切勿随便使用!)。

fsck.ext4
fsck与mkfs一样是个综合指令。对于ext4文件系统,可以直接使用fsck.ext4指令。格式为 fsck.ext4 [-pf] [-b superblock] device_name

文件系统挂载

文件系统挂载前需要确认以下几点:

  • 单一文件系统不应该被重复挂载到不同的挂载点(目录)中;
  • 单一目录不应该重复挂载多个文件系统;
  • 作为挂载点的目录,在挂载前理论上应该都是空目录(否则目录下原有的内容会被暂时隐藏,新挂载的设备被卸载后才会重新出现)。

mount指令
挂载文件系统使用mount指令。指令格式包括:

[root@study ~]$ mount -a
[root@study ~]$ mount [-l]
# 其中,filesystem为文件系统名,mount_point为挂载点,device_name为设备名
# 使用UUID挂载能避免device_name重名的情况
[root@study ~]$ mount [-t filesystem] LABEL='' mount_point
[root@study ~]$ mount [-t filesystem] UUID='' mount_point
[root@study ~]$ mount [-t filesystem] device_name mount_point

仅输入mount指令会显示目前的挂载信息。其可选项与参数包括:

  • -a:依照配置文件 /etc/fstab 挂载所有未挂载的磁盘;
  • -l:显示Label列的信息;
  • -t:指定要挂载的文件系统类型。包括xfs, ext3, ext4, reiserfs, vfat, iso9660, nfs, cifs, smbfs;
  • -n:禁止将实际的挂载情况实时写入 /etc/mtab 文件(默认会实时写入);
  • -o:支持其他的额外参数,包括
    • async, sync:文件系统同步/异步写入内存(默认为异步写入);
    • atime, noatime:是否修改文件的读取时间(默认为是);
    • ro, rw:挂载文件系统为只读/可擦写;
    • auto, noauto:是否允许该文件系统以 mount -a 自动挂载(auto);
    • dev, nodev:是否允许该文件系统中创建设备文件;
    • suid, nosuid:是否允许该文件系统中包含suid和sgid文件格式;
    • exec, noexec:是否允许该文件系统中包含可执行二进制文件;
    • user, nouser:是否允许该文件系统让任何用户执行mount(默认仅root用户执行mount);
    • defaults:默认值为 rw, suid, dev, exec, auto, nouser, atime, async
    • remount:重新挂载(系统出错或更新参数时使用)。

/etc/filesystems 文件中包含了系统指定的测试挂载文件系统类型的优先级。/proc/filesystems 文件中包含了Linux系统已加载的文件系统类型。/lib/modules/$(uname -r)/kernel/fs/ 文件中记录了Linux系统支持的文件系统的驱动程序。

挂载xfs/ext4等文件系统

# 挂载XFS文件系统
[root@study ~]$ blkid /dev/vda4     # 查看分区的UUID
/dev/vda4: UUID="e061f-s60e-4cb7-a512-826a8bde2" TYPE="xfs"
[root@study ~]$ mount UUID="e061f-s60e-4cb7-a512-826a8bde2" /data/xfs     # 使用UUID挂载文件系统
mount: mount point /data/xfs does not exist
[root@study ~]$  mkdir -p /data/xfs     # 递归创建挂载点目录
[root@study ~]$ mount UUID="e061f-s60e-4cb7-a512-826a8bde2" /data/xfs
[root@study ~]$ df /data/xfs     # 查看磁盘使用量信息# 挂载EXT4文件系统
[root@study ~]$ blkid /dev/vda5
/dev/vda5: UUID="e03df-5ed3-4cb7-a6b2-926a8bde" TYPE="ext4"
[root@study ~]$ mkdir /data/ext4
[root@study ~]$ mount UUID="e03df-5ed3-4cb7-a6b2-926a8bde" /data/ext4
[root@study ~]$ df /data/ext4

挂载CD或DVD光盘
光驱挂载后需要先卸载才能退出。

[root@study ~]$ blkid
/dev/sr0: UUID="2018-04-01-00-21-35-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"
[root@study ~]$ mkdir /data/cdrom
[root@study ~]$ mount /dev/sr0 /data/cdrom
[root@study ~]$ df /data/cdrom

挂载USB磁盘

[root@study ~]$ blkid
/dev/sda1: UUID="35DC-6D6B" TYPE="vfat"
[root@study ~]$ mkdir /data/usb
# codepage=950代表繁体中文,936代表简体中文
[root@study ~]$ mount -o codepage=936,iocharset=utf8 UUID="35DC-6D6B" /data/usb
[root@study ~]$ df /data/usb

重新挂载根目录
根目录不能被卸载,但是在要修改挂载参数或者根目录出现只读状态时,可以重新挂载根目录。

[root@study ~]$ mount -o remount,rw,auto /

还可以使用mount指令将一个目录暂时挂载到另一个目录下。

[root@study ~]$ mkdir /data/var
[root@study ~]$ mount --bind /var /data/var
[root@study ~]$ ls -lid /var /data/var     # 属性和权限完全相同
16777346	drwxr-xr-x.	22	root	root	4096	Jun 15 23:43	/data/var
16777346	drwxr-xr-x.	22	root	root	4096	Jun 15 23:43	/var

umount指令
umount指令可以卸载已挂载的设备文件。格式为 umount [-fnl] 设备名或挂载点。其选项与参数包括:

  • -f:强制卸载;
  • -l:立刻卸载文件系统(比 -f 还强硬);
  • -n:在不更新 /etc/mtab 的情况下卸载。
[root@study ~]$ mount     # 查看挂载信息
/dev/vda4 on /data/xfs type xfs
/dev/vda5 on /data/ext4 type ext4
/dev/sr0 on /data/cdrom type iso9660
/dev/sda1 on /data/usb type vfat
/dev/mapper/centos-root on /data/var type xfs
......
[root@study ~]$ umount /dev/vda4     # 使用设备名卸载
[root@study ~]$ umount /data/ext4     # 使用挂载点卸载
[root@study ~]$ umount /data/cdrom
[root@study ~]$ umount /data/usb
[root@study ~]$ umount /data/var     # 只能使用挂载点卸载,因为对应设备还有另一个挂载点 /var

不要尝试在文件系统的挂载点对应目录下卸载该挂载点(会显示 target is busy)。

文件系统参数修改

mknod
回忆前文 lsblk 指令输出中的 MAJ:MIN 字段,分别被称为主要和次要设备代码。常见的磁盘文件名的设备代码如下:

磁盘文件名 主要设备代码(MAJ) 次要设备代码(MIN)
/dev/sda 8 0-15
/dev/sdb 8 16-31
/dev/loop0 7 0
/dev/loop1 7 1

某些情况下需要使用 mknod 指令手动处理设备文件。指令格式为 mknod 设备名 [bcp] [MAJ] [MIN]。选项b代表磁盘一类的存储设备,选项c代表鼠标和键盘等输入设备,选项p代表FIFO文件(管道)。其中的MAJ和MIN代码需要自己查阅,不能随意设定。

xfs_admin
如果在格式化磁盘时没有设置Label和UUID,对于XFS文件系统,可以使用 xfs_admin指令设置,而不需要重新格式化。指令格式为 xfs_admin [-lu] [-L Label] [-U UUID] 设备文件名。小写选项l和u用于显示设定好的Label和UUID,而大写选项L和U用于设定Label和UUID。

[root@study ~]$ xfs_admin -L la_xfs /dev/vda4     # 设定Label
[root@study ~]$ xfs_admin -l /dev/vda4
label = "la_xfs"
[root@study ~]$ mount LABEL=la_xfs /data/xfs
[root@study ~]$ umount /dev/vda4     # 使用该指令修改参数前先卸载设备[root@study ~]$ uuidgen     # 生成一个UUID
e0fa7252-d56e-987a-406e-3cbf41529e809
[root@study ~]$ xfs_admin -U e0fa7252-d56e-987a-406e-3cbf41529e809 /dev/vda4   # 设备名
[root@study ~]$ mount UUID=e0fa7252-d56e-987a-406e-3cbf41529e809 /data/xfs   # 挂载点

tune2fs
如果在格式化磁盘时没有设置Label和UUID,对于EXT4文件系统,可以使用 tune2fs指令设置,也不需要重新格式化。指令格式为 tune2fs [-l] [-L Label] [-U UUID] 装置文件名

设定开机挂载

开机挂载 /etc/fstab

当系统启动时,将自动读取 /ect/fstab 配置文件,将该文件中预先写入的文件系统加载到指定的目录。使用cat指令查看该文件可以发现文件中有六个字段(列),从左至右依次为:

  • Device:文件系统或磁盘的设备名,也可以是UUID或者Label名;
  • Mount point:挂载点(目录);
  • filesystem:文件系统类型;
  • paramters:mount指令参数,一般是默认(defaults);
  • dump:能否使用dump指令备份;
  • fsck:是否用fsck指令检验扇区。

/ect/fstab 是开机时的配置文件,实际的文件系统挂载信息会记录在 /etc/mtab/proc/mounts 这两个文件中。

特殊设备loop挂载

如果有光盘镜像文件,或者使用文件作为磁盘,也可使用mount指令挂载,而不需要刻录成光盘才能使用其中的数据。

[root@study ~]$ ls -lh /tmp/CentOS-7.0-1406-x86_64-DVD.iso
-rw-r--r--.	1	root	root	3.9G	Jul 7 2014	/tmp/CentOS-7.0-1406-x86_64-DVD.iso
[root@study ~]$ mkdir /data/centos_dvd
[root@study ~]$ mount -o loop /tmp/CentOS-7.0-1406-x86_64-DVD.iso /data/centos_dvd
[root@study ~]$ df /data/centos_dvd
[root@study ~]$ ls -l /data/centos_dvd     # 挂载后可以查看镜像文件中的内容
[root@study ~]$ umount /data/centos_dvd

内存交换空间:swap

Linux系统的swap分区类似于Windows系统的虚拟内存。当物理内存不足时,拿出部分硬盘空间当SWAP分区(虚拟成内存)使用,从而解决内存容量不足的情况。

使用实体分区槽创建swap

建立swap分区槽可以分为以下几个步骤:

  • 分区:使用gdisk在磁盘中分出一个分区槽作给swap(需要设定system ID);
  • 格式化:使用 mkswap device_name 格式化分区槽为swap格式;
  • 使用:使用 swapon device_name 启用swap设备;
  • 观察:使用 freeswapon -s 查看内存使用量。
[root@study ~]$ gdisk /dev/vda
Command (? for help): n
Last sector (69220352-83886046, default = 83886046) or {
    +-}size{
    KMGTP}: +512M     # 设定分区大小
Hex code or GUID (L to show codes, Enter = 8300): 8200     # 设定系统ID
Changed type of partition to 'Linux swap'
Command (? for help): p     # 打印分区信息
Number	Start sector	End sector	Size	Code	Name
6     	69220352    	70268927  	512MB	8200	Linux swap
Command (? for help): w     # 写入分区信息# 更新并查看分区信息
[root@study ~]$ partprobe
[root@study ~]$ lsblk# 格式化分区为swap
[root@study ~]$ mkswap /dev/vda6     # 注意数字6别忘了(分区槽Number)
[root@study ~]$ blkid /dev/vda6 [root@study ~]$ free     # 观察信息
[root@study ~]$ swapon /dev/vda6     # 启用分区
[root@study ~]$ free
[root@study ~]$ swapon -s     # 观察信息

使用文件创建swap

如果没有实体分区槽,使用前文提到的loop设备方法也可以创建swap。

# 使用dd指令在/tmp目录下新增一个128M文件
[root@study ~]$ dd if=/dev/zero of=/tmp/swap bs=1M count=128
[root@study ~]$ mkswap /tmp/swap
[root@study ~]$ swapon /tmp/swap
[root@study ~]$ swapon -s
# 设定开机自启动swap
[root@study ~]$ vi /etc/fstab
/tmp/swap	swap	swap	defaults	0	0
# 需要先关闭swap
[root@study ~]$  swapoff /tmp/swap /dev/vda6
[root@study ~]$ swapon -s     # 显示swap设备信息[root@study ~]$ swapon -a     # 自动启动所有swap设备
[root@study ~]$ swapon -s

References
[1] Linux mkfs命令
[2] 让你知道codepage的重要,关于多语言编码
[3] Linux swap是干嘛的