之前使用虚拟机体验Linux操作系统的使用,一般使用默认的磁盘分区设置,也很少涉及磁盘管理操作,且总有删除重装作为后盾。在安装Ubuntu双系统后,在使用过程中遇到了磁盘分区不合理导致的/boot分区空间不足、磁盘空间需要进行管理等问题,而使用简单粗暴的重装操作则失去了性价比,转而需要通过Linux系统自带的强大的磁盘和文件系统的管理功能来进行实际操作,这里记录平常使用过程中常用的相关的磁盘和文件系统管理所需要的命令和操作。
设备文件命名规则
在Linux系统环境下,设备均被视为文件,一般处于/dev文件夹下,对不同的设备类型,其对应的文件名不相同。
设备 | 设备对应的Linux文件名 |
IDE硬盘 | /dev/hd[ a - d ] |
SCSI/SATA/USB硬盘 | /dev/sd[ a - p ] |
软盘 | /dev/floppy |
其中,IDE硬盘根据其插入的接口不同,分为/dev/hda - /dev/hdd四个名字,而SCSI/SATA硬盘则根据系统检测到的硬盘的顺序分为 /dev/sda - /dev/sdp 等名称。
不同的硬件设备会根据其接入情况拥有不同的文件名,进一步的,同一硬件设备中可能存在多个不同的分区,系统通过在设备文件名之后加入数字后缀来进行区分(在后续表述中,一般认为一个分区对应一个文件系统)。以SCSI硬盘为例,其主分区的命名为 /dev/sda1 - /dev/sda4(注意这四个编号只能被主分区和拓展分区使用),而逻辑分区的命名为 /dev/sda5 - /dev/sda15.
关于设备的命名规则,可以参考文档 Linux allocated devices
文件系统的使用情况查看
可通过Linux命令 df 和 du 来获得当前系统使用情况的信息。
df
报告文件系统对磁盘空间的使用情况
df [Options] filename
.显示包含有参数文件名的文件系统的空间使用情况;
.不指定文件名时,则显示当前挂载的所有文件系统的磁盘使用情况
.直接指定对应的文件系统名显示相应的信息
Options:
-a 显示所有相关的文件系统的信息
-Bx 以 x 指定的单位来表示空间大小,x 可为整数+单位 的格式,如10K\M\G\T等
-h 以易读的方式显示空间,即以1024作为单位
-T 输出文件系统类型
使用 df -Th命令,显示情况如下
du
估计文件系统的使用情况
du [Options] FILE
总结FILE指定的文件集合的空间占用情况,若指定文件集合位目录,则会进行递归计算
-a 显示结果包括文件的空间占用情况,默认值只显示所有目录的空间占用情况
-Bx 以x指定的单元作为单位计算空间占用情况,如-BM,则以1M为单位进行显示
-c 结尾输出总空间占用量
-h 以人类易读的方式输出结果
-s 显示每个参数的总空间占用量
以命令 du -sc -BM ~/*运行的结果如下
磁盘管理
可借助Linux命令完成磁盘分区与格式化,磁盘的挂载等操作。
fdisk
磁盘的分区与管理等功能
fdisk [-i] 设备名称
.-l 选项会将设备名称对应的设备的所有分区信息显示后退出,不指定设备时显示系统能够识别的所有设备
.不使用参数时,则进入fdisk命令的交互界面,可按提示进行操作
注意,fdisk以设备名称作为参数,而不是文件系统名称,故而参数应该为/dev/sd[a - p]和/dev/hd[a - d]的形式。可通过df命令获取对应的设备名称的信息,如某文件系统名为/dev/sda8,则其所在的设备的名称为/dev/sda.
进入fdisk的交互界面后可根据提示完成获取磁盘信息、新增/删除一个分区等操作。对磁盘的操作首先位于内存中,只有通过 w 退出时才会将修改真正执行,相应的使用 q 退出则不会做修改。请确定操作无误后再执行。
通过fdisk输出设备/dev/sda的分区信息如下
其中,start和end分别表示对应特定分区的起始柱面号。
mkfs
完成系统的格式化操作
mkfs -t 格式名 设备文件名
mkfs命令会根据其参数调用实际执行的格式化工具,将文件系统格式化
在键入 mkfs 后按两下[tab]键,可以看到系统支持的格式化的类型。
mount
磁盘的挂载
mount
将磁盘分区与固定的目录建立联系,使得该目录成为进入该分区的入口
-a 将记录在/etc/fstab中而未挂载的磁盘进行挂载
-l 显示目前的挂载信息,只输入命令mount效果一样
-t 指定文件系统类型,包括 ext2/3、vfat、iso9660(光盘格式)、nfs、cifs等
-L "xx" 使用文件系统卷标名而不是文件系统名(如/dev/sda1)进行挂载,好处在于文件系统名可能随接入系统的接口的变化而改变
--bind 将一个目录挂载到另一个目录上,实现的效果类似于符号连接
-o 可接一些挂载时的一些参数
-o loop 直接将当前文件系统上的文件以loop设备进行挂载,如下载的iso镜像文件,不需要先刻录,直接通过 -o loop xx.iso 将其挂载,即可对其进行操作
笔者对于挂载的理解是将一个访问入口与一个对应的文件系统联系起来。Linux系统为系统软件,而文件系统实际存储在硬件设备中,挂载所做的就是将某个目录与文件系统关联(挂载),之后即可通过该目录来访问该文件系统。相应的,对于一个与文件系统A挂载的目录,将其与另一个文件系统B挂载,则其中的内容就变为文件系统B的内容,原文件系统A的内容不会改变,但只有经过挂载后才能再进行访问。一般建议挂载的目录为空目录,单个文件系统不要重复挂载。
事实上,Linux系统的挂载在开机阶段就有发生。在这一阶段,系统根据配置文件/etc/fstab中的设置将系统必需的根目录 / 等进行挂载。该配置文件中包含有文件系统、对应的挂载点、系统类型等信息。而在后续的系统使用过程中,系统的实际挂载情况则被写入/etc/mtab中(也可通过mount的 -n 选项使得挂载情况不被写入该文件)。
可通过 mount /dev/sdax ~/test 进行简单的挂载,系统会自动识别文件系统的类型,故而一般不需要通过 -t 选项指定。
对应的文件系统的卸载可以通过umount命令,其参数可以为文件系统名(/dev/sdax)、挂载点名(~/test)等,均可完成卸载操作。
磁盘二进制内容查看
xxd命令
xxd //可用于显示磁盘原始的二进制数据
-u //十六进制内容以大写内容显示
-g x //结果中每 x Bytes使用空格键隔开
-c n //结果中每行包含n个字节的内容
-l n //结果显示总共n个字节的内容
-s -/+n //+n表示自目标对象开始n字节处开始显示结果
//-n表示自目标对象结束处前n字节处开始显示结果
使用示例:
根据磁盘的第一个扇区应该为MBR(使用GPT格式的磁盘第一个扇区为类MBR结构),使用xxd命令查看其最后66字节:
sudo xxd -g 1 -l 64 -s +446 /dev/sda
命令表示将每个字节内容(两位十六进制数)使用空格隔开,在距文件开始偏移为446的位置开始,显示连续的66字节的内容,从而可以看到图示中原本属于分区表的内容和最后的结束标志0x55aa。
关于硬件设备文件的命名可参考:鸟叔的Linux私房菜-Linux主机规划与磁盘分区
关于Linux磁盘与文件系统管理可参考:鸟叔的Linux私房菜-Linux磁盘与文件系统管理