(六)管理磁盘

该调教一个磁盘了

新磁盘

得到一块磁盘,要进行一下操作

  1. 建立硬盘分区
  2. 对分区进行format(格式化),建立文件系统
  3. 然后可以对文件系统检验一下
  4. 最后挂载才能使用

观察磁盘分区状态

lsblk

  • list block devices,列出所有存储设备
  • lsblk [-] [device]
  • -d列出磁盘本身,不列出分区数据
  • -f同时列出磁盘内文件系统名字
  • -i使用ASCII的字符输出,而不用复杂的编码
  • -m输出设备在/dev的权限信息
  • -p列出设备的完整文件名
  • -t列出详细数据
1
2
3
4
5
6
7
8
9
10
[manu@study ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 2M 0 part
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 30G 0 part
├─centos-root 253:0 0 10G 0 lvm /
├─centos-swap 253:1 0 2G 0 lvm [SWAP]
└─centos-home 253:2 0 5G 0 lvm /home
sr0 11:0 1 10.3G 0 rom /run/media/manu/CentOS 7 x86_64
  • NAME设备名
  • MAJ:MIN主要设备和次要设备代码
  • RM是否为可卸载设备(remove device),如光盘,usb等
  • SIZE容量
  • RO是否只读
  • TYPE有磁盘disk,分区partition,和只读存储器rom等
  • MOUNTPOINT挂载点

blkid

1
2
3
4
5
6
7
8
[root@study ~]# blkid
/dev/sda1: PARTUUID="0914c759-c4fa-4ec5-8f17-286976c070d1"
/dev/sda2: UUID="1bedab37-0c01-459c-a8f7-cfd4c5f203f9" TYPE="xfs" PARTUUID="83aceed5-29cd-45df-9151-9f450ccdadfa"
/dev/sda3: UUID="YUgqln-n8fP-6ecM-NMyS-lGlw-PTrz-KTxWfv" TYPE="LVM2_member" PARTUUID="522d939a-fc63-4e61-af9e-6f66527afcb5"
/dev/sr0: UUID="2019-09-09-19-08-41-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"
/dev/mapper/centos-root: UUID="5b52ce1c-18f5-43d0-8c31-ededfefd6aeb" TYPE="xfs"
/dev/mapper/centos-swap: UUID="080b56ed-a551-4b09-ab36-43515cdb2b78" TYPE="swap"
/dev/mapper/centos-home: UUID="8eccf850-c8c0-4aab-a24a-55f5b4ef0dbe" TYPE="xfs"

UUID是通用唯一标识符(Universally unique identifer),Linux会给每个设备独一无二的标识符

parted

  • 列出磁盘的分区类型与分区信息
  • parted dev_name print
1
2
3
4
5
6
7
8
9
10
11
[root@study ~]# parted /dev/sda print
Model: VMware, VMware Virtual S (scsi) #磁盘模块名称
Disk /dev/sda: 42.9GB #总容量
Sector size (logical/physical): 512B/512B #每个逻辑/物理扇区容量
Partition Table: gpt #分区表格式
Disk Flags: pmbr_boot

Number Start End Size File system Name 标志
1 1049kB 3146kB 2097kB bios_grub
2 3146kB 1077MB 1074MB xfs
3 1077MB 33.3GB 32.2GB lvm

磁盘分区

  • GPT使用gdisk工具
  • MBR使用fdisk工具
  • 使用完后可以用partprobe -s指令更新内核的分区表

不要去操作一个正在活动的分区,会导致系统不稳定,最好将它卸载再操作

创建文件系统

也就是格式化,使用mkfs创建文件系统,以下是支持的文件系统

1
2
[root@study ~]# mkfs
mkfs mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.fat mkfs.minix mkfs.msdos mkfs.vfat mkfs.xfs

可以使用mkfs -t fsname partition或者mkfs.fsname partition创建

创建xfs几乎瞬间完成,而ext4则是等了一会

其实创建时有很多选项,有关于RAID的,但都要对文件系统有所了解,针对性的创建对性能有一定的优化,想要加一些选项的话,自己man吧

文件系统检验

突发情况文件系统会发生错乱,这时候就需要检验文件系统

xfs_repair

  • xfs_repair [-fnd] 某个分区
  • -f后面的设备其实是个文件
    • 官方原文:Specifies that the filesystem image to be processed is stored in a regular file at device (see the mkfs.xfs -d file option). This might happen if an image copy of a filesystem has been copied or written into an ordinary file. This option implies that any external log or realtime section is also in an ordi‐nary file.
  • -n只是检查而不修改任何数据
  • -d在单人维护模式下对根目录操作
  • -LForce Log Zeroing.

挂载的文件系统要卸载才能操作

fsck.ext4

可以对ext4检查

  • -p需要修复时,不用你输入y
  • -f强制检查,一般只有遇到unclean才会强制检查
  • -b后接超级区块的位置(使用dumpe2fs可以查看),超级区块损坏时使用
1
2
3
[root@study ~]# dumpe2fs -h /dev/sda5 | grep 'Blocks per group'
dumpe2fs 1.42.9 (28-Dec-2013)
Blocks per group: 32768

grep可以锁定某一串字符

我尝试用书上的指令检查了一下sda5,发现和书上发生了相同的问题,这么巧合??

1
2
3
4
5
6
7
8
9
10
11
12
[root@study ~]# fsck.ext4 -b 32768 /dev/sda5
e2fsck 1.42.9 (28-Dec-2013)
/dev/sda5 was not cleanly unmounted, 强制检查.
第一步: 检查inode,块,和大小
删除 inode 1577 has zero dtime. 处理<y>? 是
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息

/dev/sda5: ***** 文件系统已修改 *****
/dev/sda5: 11/65536 files (0.0% non-contiguous), 12955/262144 blocks

只有出问题才去检查文件系统,没事别使用

执行命令的硬盘分区都要卸载

挂载和卸载

挂载前要注意

  1. 单一文件系统不能重复挂载在其他目录
  2. 单一目录不能挂载多个文件系统
  3. 挂载点的目录最好是空的

挂载指令mount

  • mount -a照/etc/fstab的数据将未挂载的磁盘全部挂载

  • mount [-l]默认显示当前挂载信息,加上l显示laber

  • mount [-t fs] LABEL='' dir

  • mount [-t fs] UUID='' dir

  • mount [-t fs] dev dir

  • 其实mount很复杂,更多信息还是man

  • mount默认只有root才能执行

  • 实际上不加t选项也行,系统知道该是什么文件系统,我们在格式化就已经弄好了

  • 在命令行挂载光盘后,无法退出光驱,要先卸载

那么Linux是怎么识别这些文件系统类型的呢?

Linux通过分析super block加上自己的驱动来测试挂载,测试成功就自动挂载,测试参考两个文件

  1. /etc/filesystems:测试挂载fs的优先级
  2. /proc/filesystems:已挂载的fs

驱动写在下面的文件中

  • /lib/modules/$(uname -r)/kernel/fs/
1
2
3
4
[root@study ~]# cd /lib/modules/$(uname -r)/kernel/fs/
[root@study fs]# ls
binfmt_misc.ko.xz cachefiles cifs dlm ext4 fscache gfs2 jbd2 mbcache.ko.xz nfs_common nls pstore udf
btrfs ceph cramfs exofs fat fuse isofs lockd nfs nfsd overlayfs squashfs xfs

挂载vfat移动磁盘

挂载时可以指定文件系统的语系,中文语系是950,By default, codepage 437 is used.还可以指定编码,比如

1
mount -o codepage=950,iocharset=utf-8 UUID='' dir

如果磁盘是NTFS,那么需要安装NTFS的驱动才行

重新挂载根木目录

根目录是不能卸载的,若根目录出现只读的状态,处理的办法有

  1. reboot
  2. 重新挂载,输入mount -o remount,rw,auto /

挂载文件结构层次

我的理解就是类似符号链接一样,将这个目录挂载到其他的目录,两个目录都链接到了同一个inode

指令

1
mount --bind olddir dir

umount卸载

  • umount [-fn] 设备名或者挂载点
  • -f强制卸载
  • -l立刻卸载
  • -n不更新/etc/mtab情况下卸载
  • 不过要注意,要离开这个挂载点才能卸载

磁盘、文件系统参数自定义

mknod

Linux的文件代表设备,就是通过文件的major和minor数值来代替的,比如下面的8和0,1,2,3..就是major和minor,更多信息https://www.kernel.org/doc/html/latest/admin-guide/devices.html

1
2
3
4
5
6
7
[manu@study ~]$ ll /dev/sda*
brw-rw----. 1 root disk 8, 0 1月 10 03:22 /dev/sda
brw-rw----. 1 root disk 8, 1 1月 10 03:22 /dev/sda1
brw-rw----. 1 root disk 8, 2 1月 10 03:22 /dev/sda2
brw-rw----. 1 root disk 8, 3 1月 10 03:22 /dev/sda3
brw-rw----. 1 root disk 8, 4 1月 10 03:22 /dev/sda4
brw-rw----. 1 root disk 8, 5 1月 10 03:22 /dev/sda5

一般都是自动产生的,在某些情况下就需要手动处理,这时就需要mknod

  • mknod dev [bcp] [Major] [Minor]

  • b一个外接存储设备,磁盘等

  • c外接输入设备,如键盘鼠标etc

  • p设备名称是一个FIFO(先进先出)文件

xfs_admin

  • 可以修改XFS的UUID和LABLEname
  • xfs_admin [-L label] [-u uuoid] dev
  • -l Print the current filesystem label.
  • -LSet the filesystem label.
  • -uPrint the current filesystem UUID.
  • -Uset the filesystem UUID.
1
2
3
4
5
[root@study ~]# xfs_admrein -l /dev/sda4
label = ""
[root@study ~]# xfs_admin -L yang.xfs /dev/sda4
writing all SBs
new label = "yang.xfs"

设置UUID前,先用uuidgen产生新的、独一无二的UUID,卸载文件系统再设置

tune2fs

  • tune2fs [-l][-L label][-U uuid]
  • -l显示超级区块的信息

自动挂载

前面手动挂载后重启,系统会查找/etc/fstab的信息挂载,自然我们也要重新手动挂载,能不能让系统自动挂载呢,这时候就要去修改fstab。有几个前提

  1. /必须挂载,且要最先挂载
  2. 其他挂载点必须要是已建立目录,为了易读,最好按照FHS标准
  3. 所有挂载点同一时间内只能挂载一次
  4. 所有硬盘分区同一时间内只能挂载一次
  5. 卸载时要离开卸载的目录

查看fstab(filesystem table)

1
2
3
4
5
6
7
8
9
10
11
# /etc/fstab
# Created by anaconda on Sat Dec 28 07:29:36 2019
#
# 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
#
#devices Mount point filesystem options dump fsck
/dev/mapper/centos-root / xfs defaults 0 0
UUID=1bedab37-0c01-459c-a8f7-cfd4c5f203f9 /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0

原文件排版不是很好,我改了一下,顺便加上了每行的注释

  • 第一列可以是UUID、LABEL、/dev/,代表那个设备
  • 第二列是挂载点
  • 第三列是文件系统
  • 第四列是文件系统参数
options 表示意义
async(异步)/sync(同步) 设置磁盘是否以异步执行,默认async
auto/noauto 执行mount -a时,是否会被主动测试挂载,默认auto
rw(读写)/ro(只读) 挂载的状态,若设置ro,就算有w也不能写
exec/noexec 是否可执行这个文件系统
user/nouser 是否允许用户使用mount挂载,默认nouser
suid/nosuid 是否有SUID,有执行文件时还是设置suid比较好
defaults 表示rw,suid,dev(解析文件上的特殊设备),exec,auto,nouser,async

更多options参见mount(8)和https://wiki.archlinux.org/index.php/Fstab_(简体中文))

  • 第五列是dump备份
  • 第六列是fsck检验扇区

比如我要挂载我的sda4,就在fstab下添加一行

1
LABEL=yang.xfs                  /data/xfs           xfs          defaults        0    0

修改fstab后最好mount -a测试一下,如果重启错误会进入单人维护模式,根目录只读.

需要指令mount -n -o remount,rw /

loop设备挂载

有光盘镜像文件时,可以直接挂载,不用刻录

挂载CD/DVD镜像文件

直接输入指令

1
mount -o loop file mouontpoint

这里我碰到了一个小问题,我的CentOS-everthing有10.3G,挂载后使用ll -h看了下,整个镜像文件就像缩水一样,最小14,最大几十M,但是在桌面环境查看却没啥异样,是ll -h的单位不一样吗?

来自几个月后的我解决了这个问题, ll -h显示的单位是bloock

制作loop设备并挂载

既然镜像文件能够被挂载,于是有一个想法,就是建立一个大文件,把这个文件创建文件系统,然后挂载。感觉吧就像分区里的分区,如果某个分区太大,我可以在分出一部分,将它挂载,等于多了一个分区

1.建立大型文件

1
2
3
4
5
6
[root@study ~]# dd if=/dev/zero of=/srv/dvd bs=1M count=512
记录了512+0 的读入
记录了512+0 的写出
536870912字节(537 MB)已复制,3.77046 秒,142 MB/秒
[root@study ~]# ll -h /srv/dvd
-rw-r--r--. 1 root root 512M 1月 10 19:57 /srv/dvd

dd

  • ifinput file,/dev/zero是一个一值输出0的设备
  • ofouput file
  • bsblock size
  • countbs*count

2.创建文件系统、挂载

默认的xfs不能格式化文件,需要加上-f选项

  1. mkfs.xfs -f file
  2. 查看UUID
  3. 挂载mount -o loop UUID="" dir
  4. 想要永久挂载就更新fstab

注意设备名不建议写UUID,UUID通常是设备上的,最好使用文件名,不容易出现错误

内存交换分区swap

当内存不足时会将以一些数据暂存swap,在现在的来说很少用到,毕竟现在内存这么大, 动不动就是64G的,一般是用到服务器上以备不时之需的。

一般建立系统时可以创建swap

进入系统的创建方法

1.划出一个物理分区创建为swap

  • 使用gdisk分区,分区默认code是8300,改成8200就代表swap
  • 格式化分区使用mkswap /dev
  • 挂载,不过不是用mount,而是swapon /dev
  • freeswapon -s可以查看内存使用量

2.大型文件转为swap

类似于loop设备文件,使用dd创建一个大文件,将其格式化,挂载就可以了

格式化指令mkswap dir

挂载指令swapon dir

关闭swap指令swapoff dir/dev

此外要自动挂载的话,更新fstab要注意文件的UUID系统搜不到,swap的挂载点要设为swap

分区通用指令parted

  • parted [dev] [command [options]]

command

  1. 创建分区:mkpart [primary|logical|Extended] [ext4|vfat|xfs]
  2. 显示指令:print
  3. 删除分区:rm [partition]

参考《鸟哥的Linux私房菜 基础学习篇》

作者

manu

发布于

2020-01-14

更新于

2023-01-06

许可协议


:D 一言句子获取中...