(六)管理磁盘
该调教一个磁盘了
新磁盘
得到一块磁盘,要进行一下操作
- 建立硬盘分区
- 对分区进行format(格式化),建立文件系统
- 然后可以对文件系统检验一下
- 最后挂载才能使用
观察磁盘分区状态
lsblk
- list block devices,列出所有存储设备
lsblk [-] [device]
-d
列出磁盘本身,不列出分区数据-f
同时列出磁盘内文件系统名字-i
使用ASCII的字符输出,而不用复杂的编码-m
输出设备在/dev的权限信息-p
列出设备的完整文件名-t
列出详细数据
1 | [manu@study ~]$ lsblk |
NAME
设备名MAJ:MIN
主要设备和次要设备代码RM
是否为可卸载设备(remove device),如光盘,usb等SIZE
容量RO
是否只读TYPE
有磁盘disk,分区partition,和只读存储器rom等MOUNTPOINT
挂载点
blkid
1 | [root@study ~]# blkid |
UUID是通用唯一标识符(Universally unique identifer),Linux会给每个设备独一无二的标识符
parted
- 列出磁盘的分区类型与分区信息
parted dev_name print
1 | [root@study ~]# parted /dev/sda print |
磁盘分区
- GPT使用
gdisk
工具 - MBR使用
fdisk
工具 - 使用完后可以用partprobe -s指令更新内核的分区表
不要去操作一个正在活动的分区,会导致系统不稳定,最好将它卸载再操作
创建文件系统
也就是格式化,使用mkfs创建文件系统,以下是支持的文件系统
1 | [root@study ~]# mkfs |
可以使用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
在单人维护模式下对根目录操作-L
Force Log Zeroing.
挂载的文件系统要卸载才能操作
fsck.ext4
可以对ext4检查
-p
需要修复时,不用你输入y-f
强制检查,一般只有遇到unclean才会强制检查-b
后接超级区块的位置(使用dumpe2fs可以查看),超级区块损坏时使用
1 | [root@study ~]# dumpe2fs -h /dev/sda5 | grep 'Blocks per group' |
grep可以锁定某一串字符
我尝试用书上的指令检查了一下sda5,发现和书上发生了相同的问题,这么巧合??
1 | [root@study ~]# fsck.ext4 -b 32768 /dev/sda5 |
只有出问题才去检查文件系统,没事别使用
执行命令的硬盘分区都要卸载
挂载和卸载
挂载前要注意
- 单一文件系统不能重复挂载在其他目录
- 单一目录不能挂载多个文件系统
- 挂载点的目录最好是空的
挂载指令mount
mount -a
照/etc/fstab的数据将未挂载的磁盘全部挂载mount [-l]
默认显示当前挂载信息,加上l显示labermount [-t fs] LABEL='' dir
mount [-t fs] UUID='' dir
mount [-t fs] dev dir
其实mount很复杂,更多信息还是man
mount默认只有root才能执行
实际上不加t选项也行,系统知道该是什么文件系统,我们在格式化就已经弄好了
在命令行挂载光盘后,无法退出光驱,要先卸载
那么Linux是怎么识别这些文件系统类型的呢?
Linux通过分析super block加上自己的驱动来测试挂载,测试成功就自动挂载,测试参考两个文件
- /etc/filesystems:测试挂载fs的优先级
- /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的驱动才行
重新挂载根木目录
根目录是不能卸载的,若根目录出现只读的状态,处理的办法有
- reboot
- 重新挂载,输入
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 | [manu@study ~]$ ll /dev/sda* |
一般都是自动产生的,在某些情况下就需要手动处理,这时就需要mknod
mknod dev [bcp] [Major] [Minor]
b
一个外接存储设备,磁盘等c
外接输入设备,如键盘鼠标etcp
设备名称是一个FIFO(先进先出)文件
xfs_admin
- 可以修改XFS的UUID和LABLEname
xfs_admin [-L label] [-u uuoid] dev
-l
Print the current filesystem label.-L
Set the filesystem label.-u
Print the current filesystem UUID.-U
set the filesystem UUID.
1 | [root@study ~]# xfs_admrein -l /dev/sda4 |
设置UUID前,先用uuidgen
产生新的、独一无二的UUID,卸载文件系统再设置
tune2fs
tune2fs [-l][-L label][-U uuid]
-l
显示超级区块的信息
自动挂载
前面手动挂载后重启,系统会查找/etc/fstab的信息挂载,自然我们也要重新手动挂载,能不能让系统自动挂载呢,这时候就要去修改fstab。有几个前提
/
必须挂载,且要最先挂载- 其他挂载点必须要是已建立目录,为了易读,最好按照FHS标准
- 所有挂载点同一时间内只能挂载一次
- 所有硬盘分区同一时间内只能挂载一次
- 卸载时要离开卸载的目录
查看fstab(filesystem table)
1 | # /etc/fstab |
原文件排版不是很好,我改了一下,顺便加上了每行的注释
- 第一列可以是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 | [root@study ~]# dd if=/dev/zero of=/srv/dvd bs=1M count=512 |
dd
if
input file,/dev/zero是一个一值输出0的设备of
ouput filebs
block sizecount
bs*count
2.创建文件系统、挂载
默认的xfs不能格式化文件,需要加上-f选项
mkfs.xfs -f file
- 查看
UUID
- 挂载
mount -o loop UUID="" dir
- 想要永久挂载就更新
fstab
注意设备名不建议写UUID,UUID通常是设备上的,最好使用文件名,不容易出现错误
内存交换分区swap
当内存不足时会将以一些数据暂存swap,在现在的来说很少用到,毕竟现在内存这么大, 动不动就是64G的,一般是用到服务器上以备不时之需的。
一般建立系统时可以创建swap
进入系统的创建方法
1.划出一个物理分区创建为swap
- 使用gdisk分区,分区默认code是8300,改成8200就代表swap
- 格式化分区使用
mkswap /dev
- 挂载,不过不是用mount,而是
swapon /dev
free
和swapon -s
可以查看内存使用量
2.大型文件转为swap
类似于loop设备文件,使用dd创建一个大文件,将其格式化,挂载就可以了
格式化指令mkswap dir
挂载指令swapon dir
关闭swap指令swapoff dir/dev
此外要自动挂载的话,更新fstab要注意文件的UUID系统搜不到,swap的挂载点要设为swap
分区通用指令parted
parted [dev] [command [options]]
command
- 创建分区:
mkpart [primary|logical|Extended] [ext4|vfat|xfs]
- 显示指令:
print
- 删除分区:
rm [partition]
参考《鸟哥的Linux私房菜 基础学习篇》
1.Linux服务器架设总结
2.进程
3.(十四)LVM
4.(十三)磁盘阵列
5.(十二)磁盘配额
6.(七)压缩与备份
7.(五)Linux文件系统管理
8.(四)Linux文件和目录