一、实验介绍
1.1 实验内容
本节实验的文件系统操作的内容十分简单,只会包含几个命令的几个参数的讲解,但掌握这些也将对你在学习 Linux 和实验楼后续其他课程的过程中有极大帮助。
因为本课程的定位为入门基础,尽快上手,故没有打算涉及太多理论内容,前面省略了关于 Linux 文件系统的一些基本知识,也因为我们是在线实验环境,所以也避开了很少一部分但又十分重要的关于硬件的内容,我们只能期待用户能够抱着提高自学能力的心态自己去补充相关的知识。
1.2 实验知识点
df,du,mount命令的使用
磁盘相关知识学习
二、基本操作
2.1 查看磁盘和目录的容量
使用 df 命令查看磁盘的容量
![9252cd7b2c70ab6edf27eff636347f06.png](https://i-blog.csdnimg.cn/blog_migrate/3b9bcf6cf266cd107cca01440897550d.png)
在实验楼的环境中你将看到如下的输出内容:
![e1ac5dc57acc062081a2dfe78089c539.png](https://i-blog.csdnimg.cn/blog_migrate/ae47ac64db751c76b6c7481abc3625ef.jpeg)
但在实际的物理主机上会更像这样:
![a692e58c4f40149f7f0201bc8bf21daf.png](https://i-blog.csdnimg.cn/blog_migrate/29fd388e3189245b26533268fbf340f6.jpeg)
物理主机上的 /dev/sda2 是对应着主机硬盘的分区,后面的数字表示分区号,数字前面的字母 a 表示第几块硬盘(也可能是可移动磁盘),你如果主机上有多块硬盘则可能还会出现 /dev/sdb,/dev/sdc 这些磁盘设备都会在 /dev 目录下以文件的存在形式。
接着你还会看到"1k-块"这个陌生的东西,它表示以磁盘块大小的方式显示容量,后面为相应的以块大小表示的已用和可用容量,在你了解 Linux 的文件系统之前这个就先不管吧,我们以一种你应该看得懂的方式展示:
![aa946baef31cab766ef81d35a8735577.png](https://i-blog.csdnimg.cn/blog_migrate/c36de79cb6e02f93529ed72621ea6c73.png)
![ea956e3bab4072349580c55096ea2148.png](https://i-blog.csdnimg.cn/blog_migrate/c65b4af9d801006b574de743c5d58c2c.jpeg)
现在你就可以使用命令查看你主机磁盘的使用情况了。至于挂载点如果你还记得前面第 4 节介绍 Linux 目录树结构的内容,那么你就应该能很好的理解挂载的概念,这里就不再赘述。
使用 du 命令查看目录的容量
这个命令前面其实已经用了很多次了:
![d517ad4dd4ec398f5d4996b2761decd1.png](https://i-blog.csdnimg.cn/blog_migrate/f5fd4dc606a464f2912433d4d382c7ed.jpeg)
-d参数指定查看目录的深度
![6d08c0eece4f8c10ac3f5a41a3f3003b.png](https://i-blog.csdnimg.cn/blog_migrate/c58e0483a3003c63c81a266dcfdcdbd0.jpeg)
常用参数
![4cf9ab0328b69d5870dc0417f9e2e6da.png](https://i-blog.csdnimg.cn/blog_migrate/f327528704025c6bc73062089fe1c4d6.jpeg)
![85f349a89492d48f507912c3ca031649.png](https://i-blog.csdnimg.cn/blog_migrate/d6f5bba60d716dae32dfc3f19b358e0e.jpeg)
du(estimate file space usage)命令与df(report file system disk space usage)命令只有一字之差,希望大家注意不要弄混淆了,你可以像我这样从man手册中获取命令的完整描述,记全称就不会搞混了。
三、简单的磁盘管理
下面涉及的命令具有一定的危险性,操作不当可能会丢失你的个人数据,初学者建议在虚拟环境中进行操作
通常情况下,这一小节应该直接讲如何挂载卸载磁盘,如何格式化磁盘,如何分区,但如你所见,由于实验环境的限制,环境中没有额外的磁盘可以挂载,也没有空闲空间测试分区命令,所以首先我们会先创建一个虚拟磁盘来进行后续的练习操作。
3.1创建虚拟磁盘
dd 命令简介(部分说明来自dd (Unix) wiki)
dd命令用于转换和复制文件,不过它的复制不同于cp。之前提到过关于 Linux 的很重要的一点,一切即文件,在 Linux 上,硬件的设备驱动(如硬盘)和特殊设备文件(如/dev/zero和/dev/random)都像普通文件一样,只是在各自的驱动程序中实现了对应的功能,dd 也可以读取文件或写入这些文件。这样,dd也可以用在备份硬件的引导扇区、获取一定数量的随机数据或者空数据等任务中。dd程序也可以在复制时处理数据,例如转换字节序、或在 ASCII 与 EBCDIC 编码间互换。
dd的命令行语句与其他的 Linux 程序不同,因为它的命令行选项格式为选项=值,而不是更标准的--选项 值或-选项=值。dd默认从标准输入中读取,并写入到标准输出中,但可以用选项if(input file,输入文件)和of(output file,输出文件)改变。
我们先来试试用dd命令从标准输入读入用户的输入到标准输出或者一个文件中:
![6495cfc10e174a41e19d0e96f468468c.png](https://i-blog.csdnimg.cn/blog_migrate/d4b5b7ac652670d294a31b01e692d6bf.jpeg)
![aedf827f66f9bec50819c8b0fde69fe5.gif](https://i-blog.csdnimg.cn/blog_migrate/68a7fac2935ac6bcb08e21e221e0853e.gif)
上述命令从标准输入设备读入用户输入(缺省值,所以可省略)然后输出到 test 文件,bs(block size)用于指定块大小(缺省单位为 Byte,也可为其指定如'K','M','G'等单位),count用于指定块数量。如上图所示,我指定只读取总共 10 个字节的数据,当我输入了“hello shiyanlou”之后加上空格回车总共 16 个字节(一个英文字符占一个字节)内容,显然超过了设定大小。使用du和cat命令看到的写入完成文件实际内容确实只有 10 个字节(那个黑底百分号表示这里没有换行符),而其他的多余输入将被截取并保留在标准输入。
前面说到dd在拷贝的同时还可以实现数据转换,那下面就举一个简单的例子:将输出的英文字符转换为大写再写入文件:
![8ca99a8f2254580741833690438ae41f.png](https://i-blog.csdnimg.cn/blog_migrate/a454ffb860c595266a6e068a51d5754f.png)
![2b9cdbab661a5001a80c93f28f300263.gif](https://i-blog.csdnimg.cn/blog_migrate/471f2cf0fecadc18bda96e6e2bf1e92d.gif)
你可以在man文档中查看其他所有转换参数。
使用 dd 命令创建虚拟镜像文件
通过上面一小节,你应该掌握了dd的基本使用,下面就来使用dd命令来完成创建虚拟磁盘的第一步。
从/dev/zero设备创建一个容量为 256M 的空文件:
![ecc3130182375058511efa3b49c7bf9d.png](https://i-blog.csdnimg.cn/blog_migrate/b1d7d447471ea32229b88a54ba5a9594.png)
![36c36f5d447ff91b8a9453ebe7573a32.png](https://i-blog.csdnimg.cn/blog_migrate/6a0c88727f6b5d3b283ce4061bcdb77c.jpeg)
然后我们要将这个文件格式化(写入文件系统),这里我们要学到一个(准确的说是一组)新的命令来完成这个需求。
使用 mkfs 命令格式化磁盘(我们这里是自己创建的虚拟磁盘镜像)
你可以在命令行输入 sudo mkfs 然后按下Tab键,你可以看到很多个以 mkfs 为前缀的命令,这些不同的后缀其实就是表示着不同的文件系统,可以用 mkfs 格式化成的文件系统。
我们可以简单的使用下面的命令来将我们的虚拟磁盘镜像格式化为ext4文件系统:
![96b6cbd1b2d3c2871b6543bc50099d0b.png](https://i-blog.csdnimg.cn/blog_migrate/11d7cf2d18ae67a8efbeb3e6e2be1e97.png)
![83086a86b2f86b269631a1d846e21ac8.png](https://i-blog.csdnimg.cn/blog_migrate/e9a8dcaaa28573bcef94d59c5127de7c.jpeg)
可以看到实际 mkfs.ext4 是使用 mke2fs 来完成格式化工作的。mke2fs 的参数很多,不过我们也不会经常格式化磁盘来玩,所以就掌握这基本用法吧,等你有特殊需求时,再查看 man 文档解决。
如果你想知道 Linux 支持哪些文件系统你可以输入ls -l /lib/modules/$(uname -r)/kernel/fs(我们的环境中无法查看)查看。
使用 mount 命令挂载磁盘到目录树
用户在 Linux/UNIX 的机器上打开一个文件以前,包含该文件的文件系统必须先进行挂载的动作,此时用户要对该文件系统执行 mount 的指令以进行挂载。该指令通常是使用在 USB 或其他可移除存储设备上,而根目录则需要始终保持挂载的状态。又因为 Linux/UNIX 文件系统可以对应一个文件而不一定要是硬件设备,所以可以挂载一个包含文件系统的文件到目录树。
Linux/UNIX 命令行的 mount 指令是告诉操作系统,对应的文件系统已经准备好,可以使用了,而该文件系统会对应到一个特定的点(称为挂载点)。挂载好的文件、目录、设备以及特殊文件即可提供用户使用。
我们先来使用mount来查看下主机已经挂载的文件系统:
![33fab5fb9b127bfbbca475268cf8254d.png](https://i-blog.csdnimg.cn/blog_migrate/799448b844c8ca258b4f92cc602d18c9.png)
![f1da0739c4d1529aa868fa666d964b49.png](https://i-blog.csdnimg.cn/blog_migrate/73ac9c4817c8d1bf9daa3f4708bcbc4d.jpeg)
输出的结果中每一行表示一个设备或虚拟设备,每一行最前面是设备名,然后是 on 后面是挂载点,type 后面表示文件系统类型,再后面是挂载选项(比如可以在挂载时设定以只读方式挂载等等)。
那么我们如何挂载真正的磁盘到目录树呢,mount命令的一般格式如下:
![c4e07e250f94647e387a8652cbd287e0.png](https://i-blog.csdnimg.cn/blog_migrate/6678356141a624a00804c131f7dc230f.png)
一些常用操作:
![d5f3ee345e53b193004034ddc53f2288.png](https://i-blog.csdnimg.cn/blog_migrate/6d7ecebdfc273c9deb6897d591aa6bda.png)
注意:由于实验楼的环境限制,mount 命令挂载及 umount 卸载都无法进行操作,可以简单了解这些步骤。
现在直接来挂载我们创建的虚拟磁盘镜像到/mnt目录:
![9df4d4bb9800b3a520e821fdd47fbc29.png](https://i-blog.csdnimg.cn/blog_migrate/d3152cae9b3585d4f2b0c717d228a8a0.jpeg)
使用 umount 命令卸载已挂载磁盘
注意:由于实验楼的环境限制,mount 命令挂载及 umount 卸载都无法进行操作,可以简单了解这些步骤。
![d8b98d0340bfd2cf2dae34af96344de6.png](https://i-blog.csdnimg.cn/blog_migrate/1a18e483311721e90c879702c1ed0c52.png)
不过遗憾的是,由于我们环境的问题(环境中使用的 Linux 内核在编译时没有添加对 Loop device的支持),所以你将无法挂载成功:
另外关于 loop 设备,你可能会有诸多疑问,那么请看下面来自维基百科/dev/loop的说明:
在类 UNIX 系统中,/dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))是一种伪设备,这种设备使得文件可以如同块设备一般被访问。
在使用之前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用。因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载。
这种设备文件经常被用于光盘或是磁盘镜像。通过循环挂载来挂载包含文件系统的文件,便使处在这个文件系统中的文件得以被访问。这些文件将出现在挂载点目录。如果挂载目录中本身有文件,这些文件在挂载后将被禁止使用。
使用 fdisk 为磁盘分区
注意:由于实验楼的环境限制,fdisk 命令无法进行操作,可以简单了解这些步骤。
同样因为环境中没有物理磁盘,也无法创建虚拟磁盘的原因我们就无法实验练习使用该命令了,下面我将以我的物理主机为例讲解如何为磁盘分区。
![ad27e7bb0f6e94ab53daba285f7caabb.png](https://i-blog.csdnimg.cn/blog_migrate/d3e5c9960d72feaf9b6233e9aaa20e6b.png)
![71ebc17148fa8a3740ce07bac3297f99.png](https://i-blog.csdnimg.cn/blog_migrate/4126cd288b388a4945cf2a9d152eb4f1.jpeg)
输出结果中开头显示了我主机上的磁盘的一些信息,包括容量扇区数,扇区大小,I/O 大小等信息。
我们重点看一下中间的分区信息,/dev/sda1,/dev/sda2 为主分区分别安装了 Windows 和 Linux 操作系统,/dev/sda3 为交换分区(可以理解为虚拟内存),/dev/sda4 为扩展分区其中包含 /dev/sda5,/dev/sda6,/dev/sda7,/dev/sda8 四个逻辑分区,因为主机上有几个分区之间有空隙,没有对齐边界扇区,所以分区之间不是完全连续的。
![f1c6b3b23a6ce46dded5613b288a89c2.png](https://i-blog.csdnimg.cn/blog_migrate/b7c3e8382d17616a2b8f16ef12542763.png)
![26191e3d6de7cdbccc3c785ca109a8d1.png](https://i-blog.csdnimg.cn/blog_migrate/05b5a07c76d47f0a50c1804c53c3c057.jpeg)
![9fec249c6137d82f411ba6dbca3b043a.png](https://i-blog.csdnimg.cn/blog_migrate/daa1112278465caa0e57cc6e54e88954.jpeg)
在进行操作前我们首先应先规划好我们的分区方案,这里我将在使用 128M(可用 127M 左右)的虚拟磁盘镜像创建一个 30M 的主分区剩余部分为扩展分区包含 2 个大约 45M 的逻辑分区。
操作完成后输入p查看结果如下:
![0727e66152c1627c245c7d05e4965338.png](https://i-blog.csdnimg.cn/blog_migrate/6de1ff73092dfd496becb82fc101046e.jpeg)
最后不要忘记输入w写入分区表。
使用 losetup 命令建立镜像与回环设备的关联
注意:由于实验楼的环境限制,losetup 命令无法进行操作,可以简单了解这些步骤。
同样因为环境原因中没有物理磁盘,也没有 loop device 的原因我们就无法实验练习使用该命令了,下面我将以我的物理主机为例讲解。
![c25be59c1d77adc95e5383279c248a73.png](https://i-blog.csdnimg.cn/blog_migrate/e5355f9ad969242be44ad84564208ebd.jpeg)
然后再使用mkfs格式化各分区(前面我们是格式化整个虚拟磁盘镜像文件或磁盘),不过格式化之前,我们还要为各分区建立虚拟设备的映射,用到kpartx工具,需要先安装:
![09da30bde769c461e6f97ddda8a0c9d8.png](https://i-blog.csdnimg.cn/blog_migrate/69f105736688c801556024bdbf0ec5d2.jpeg)
![d355d29d89f25bf5db64093e62453d4e.png](https://i-blog.csdnimg.cn/blog_migrate/52590f17ccba37b7da166d714044c36c.jpeg)
接着再是格式化,我们将其全部格式化为 ext4:
![eb972122b8502ec6e7b9cd267c5fe06b.png](https://i-blog.csdnimg.cn/blog_migrate/bf78ba14ff3ccb78c71c1af4c358766c.jpeg)
格式化完成后在/media目录下新建四个空目录用于挂载虚拟磁盘:
![c275ebcef48db569a8226dd31c0de2e9.png](https://i-blog.csdnimg.cn/blog_migrate/ba9347af79a9ab765f164ff68162a64b.png)
![42258c61fc0c85be68f027fafd702e60.png](https://i-blog.csdnimg.cn/blog_migrate/ec68dc3d6e0223f5bbc8e816f171017b.jpeg)
然后:
![af289863a535916be6d091509c4a1993.png](https://i-blog.csdnimg.cn/blog_migrate/38e381ee77275315727fbb0e8c0f35d7.png)
![f42bbf316cc684097248338655180bc1.png](https://i-blog.csdnimg.cn/blog_migrate/c6b4ecfec7fe3ecc97a717ee766a2b09.jpeg)
![59105eda24287e33747dd3b78ca1ce1d.png](https://i-blog.csdnimg.cn/blog_migrate/0eb19008977cb23c8e66262435ba5868.jpeg)
解析:
首先要了解三个常用命令:
du : 计算出单个文件或者文件夹的磁盘空间占用.
sort : 对文件行或者标准输出行记录排序后输出.
head : 输出文件内容的前面部分.
du:
-a:显示目录占用空间的大小,还要显示其下目录占用空间的大小
sort:
-n : 按照字符串表示的数字值来排序
-r :按照反序排列
head :
-n : 取出前多少行
以上的问题可以使用命令: du -a | sort -n -r | head -n 10
答案来自:https://blog.csdn.net/dexter159/article/details/72598470/