【Linux】Linux 磁盘与文件系统管理命令

本文详细介绍了Linux系统中文件系统的简单操作,包括使用df和du命令查看磁盘与目录容量,实体链接(硬链接)与符号链接(软链接)的区别及其创建方法。此外,还讲解了磁盘的分区、格式化、检验与挂载的步骤,如使用gdisk/fdisk进行MBR/GPT分区,mkfs创建EXT4和XFS文件系统,以及fsck.ext4和xfs_repair进行文件系统检查和修复。最后提到了设置开机挂载、创建内存交换空间swap以及使用parted进行高级分区操作。
摘要由CSDN通过智能技术生成

来自《鸟哥的 Linux 私房菜》,重复只是加深自己的印象。

本篇结构:

  • 文件系统的简单操作
  • 磁盘的分区、格式化、检验与挂载
  • 设置开机挂载
  • 内存交换空间(swap)之创建
  • 补充

一、文件系统的简单操作

1.1、磁盘与目录的容量

磁盘的整体数据是在 superblock 区块中,但是每个各别文件的容量则在 inode
当中记载的。在命令行下面该如何叫出这几个数据呢?

  • df:列出文件系统的整体磁盘使用量;
  • du:评估文件系统的磁盘使用量(常用在推估目录所占容量)
1.1.1、 df
df [-ahikHTm] [目录或文件名]

选项与参数:

  • -a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
  • -k :以 KBytes 的容量显示各文件系统;
  • -m :以 MBytes 的容量显示各文件系统;
  • -h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
  • -H :以 M=1000K 取代 M=1024K 的进位方式;
  • -T :连同该 partition 的 filesystem 名称 (例如 xfs) 也列出;
  • -i :不用磁盘容量,而以 inode 的数量来显示

    在 Linux 下面如果 df 没有加任何选项,那么默认会将系统内所有的,(不含特殊内存内的文件系统与 swap) 都以 1 KBytes 的容量来列出来!

所输出的结果信息:

  • Filesystem:代表该文件系统是在哪个 partition ,所以列出设备名称;
  • 1k-blocks:说明下面的数字单位是 1KB!可利用 -h 或 -m 来改变容量;
  • Used:顾名思义,就是使用掉的磁盘空间;
  • Available:也就是剩下的磁盘空间大小;
  • Use%:就是磁盘的使用率啦!如果使用率高达 90% 以上时, 最好需要注意一下了,免得容量不足造成系统问题;
  • Mounted on:就是磁盘挂载的目录所在。

范例一:将系统内的所有特殊文件格式及名称都列出来

范例二:将 /etc 下面的可用的磁盘容量以易读的容量格式显示

root@master:~# df -h /etc
Filesystem                  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-root 476G  148G  304G  33% /

范例三:将目前各个 partition 当中可用的 inode 数量列出

root@master:~# df -ih
Filesystem            Inodes  IUsed IFree IUse%  Mounted on
udev                    7.9M   419  7.9M   1% /dev
tmpfs                   7.9M   861  7.9M   1% /run
/dev/mapper/ubuntu--vg-root 31M  402K   30M    2% /
tmpfs                   7.9M     4  7.9M   1% /dev/shm
tmpfs                   7.9M     4  7.9M   1% /run/lock
tmpfs                   7.9M    16  7.9M   1% /sys/fs/cgroup
/dev/sda1               122K   310  122K   1% /boot
tmpfs                   7.9M     4  7.9M   1% /run/user/0
tmpfs                   7.9M     4  7.9M   1% /run/user/1000

由于 df 主要读取的数据几乎都是针对一整个文件系统,因此读取的范围主要是在 Superblock 内的信息, 所以这个指令显示结果的速度非常的快速!在显示的结果中需要特别留意的是根目录的剩余容量! 因为所有的数据都是由根目录衍生出来的,因此当根目录的剩余容量剩下 0 时,那 Linux 可能就问题很大了。

需要注意的是,如果使用 -a 这个参数时,系统会出现 /proc 这个挂载点,但是里面的东西都是 0 ,不要紧张! /proc 的东西都是 Linux 系统所需要载入的系统数据,而且是挂载在“内存当中”的, 所以当然没有占任何的磁盘空间。

/dev/shm/ 目录,其实是利用内存虚拟出来的磁盘空间,通常是总实体内存的一半!由于是通过内存仿真出来的磁盘,因此你在这个目录下面创建任何数据文件时,存取速度是非常快速的!(在内存内工作) 不过,也由于他是内存仿真出来的,因此这个文件系统的大小在每部主机上都不一样,而且创建的东西在下次开机时就消失了! 因为是在内存中!

1.1.2、du
du [-ahskm] 文件或目录名称

选项与参数:

  • -a :列出所有的文件与目录容量,因为默认仅统计目录下面的文件量而已;
  • -h :以人们较易读的容量格式 (G/M) 显示;
  • -s :列出总量而已,而不列出每个各别的目录占用容量;
  • -S :不包括子目录下的总计,与 -s 有点差别。
  • -k :以 KBytes 列出容量显示;
  • -m :以 MBytes 列出容量显示。

直接输入 du 没有加任何选项时,则 du 会分析“目前所在目录”的文件与目录所占用的磁盘空间。但是,实际显示时,仅会显示目录容量(不含文件),因此 . 目录有很多文件没有被列出来,所以全部的目录相加不会等于 . 的容量。此外,输出的数值数据为 1K 大小的容量单位。加上参数 -a 则可以将文件容量也显示出来。

范例一:检查根目录下面每个目录所占用的容量

du -sm /*

16	/bin
108	/boot
... 省略 ...
du: cannot access '/proc/104399/fd/4': No such file or directory
du: cannot access '/proc/104399/fdinfo/4': No such file or directory
... 省略 ...
1692	/tmp
9607	/usr
41054	/var

这是个很常被使用的功能,利用万用字符 * 来代表每个目录,如果想要检查某个目录下,哪个次目录占用最大的容量,可以用这个方法找出来。至于 /proc 里头会列出一堆“No such file or directory” 的错误,因为是内存内的程序,程序执行结束就会消失,因此会有些目录找不到,是正确的!

与 df 不一样的是,du 这个指令其实会直接到文件系统内去搜寻所有的文件数据,所以指令的运行会执行一小段时间。此外,在默认的情况下,容量的输出是以 KB 来设计的, 如果想要知道目录占了多少 MB ,那么就使用 -m 这个参数即可,如果只想要知道该目录占了多少容量的话,使用 -s 就可以。

至于 -S 这个选项部分,由于 du 默认会将所有文件的大小均列出,因此假设在 /etc 下面使用 du 时, 所有的文件大小,包括 /etc 下面的次目录容量也会被计算一次。然后最终的容量(/etc) 也会加总一次, 因此很多朋友都会误会 du 分析的结果不太对劲。如果想要列出某目录下的全部数据, 或许也可以加上 -S 的选项,减少次目录的加总。

1.2、实体链接与符号链接: ln

1.2.1、Hard Link (实体链接, 硬式链接或实际链接)
  • 每个文件都会占用一个 inode ,文件内容由 inode 的记录来指向;
  • 想要读取该文件,必须要经过目录记录的文件名来指向到正确的 inode 号码才能读取。

也就是说,其实文件名只与目录有关,但是文件内容则与 inode 有关。那么想一想, 有没有可能有多个文件名对应到同一个 inode 号码呢?有的!那就是 hard link 的由来。

简单说:hard link 只是在某个目录下新增一笔文件名链接到某 inode 号码的关连记录而已

如图,有个 /root/crontab 是 /etc/crontab 的实体链接,这两个文件名链接到同一个 inode :

使用 hard link 设置链接文件时,磁盘的空间与 inode 的数目都不会改变, hard link 只是在某个目录下的 block 多写入一个关连数据而已,既不会增加 inode 也不会耗用 block 数量(其实还是可能会改变系统的 block 的,那就是当新增这笔数据却刚好将目录的 block 填满时,就可能会新加一个 block 来记录文件名关连性,而导致磁盘空间的变化)。

由图也可知,事实上 hard link 应该仅能在单一文件系统中进行的,应该是不能够跨文件系统,所以 hard link 是有限制的

  • 不能跨 Filesystem;
  • 不能 link 目录。

因为如果使用 hard link 链接到目录时, 链接的数据需要连同被链接目录下面的所有数据都创建链接。

1.2.2、Symbolic Link (符号链接,亦即是捷径)

相对于 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在创建一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的文件名!由于只是利用文件来做为指向的动作, 所以,当来源文件被删除之后,symbolic link 的文件会“开不了”, 会一直说“无法打开某文件!”。实际上就是找不到原始“文件名”而已。

如图:

由 1 号 inode 读取到链接文件的内容仅有文件名,根据文件名链接到正确的目录去取得目标文件的 inode , 最终就能够读取到正确的数据了。可以发现的是,如果目标文件(/etc/crontab)被删除了,那么整个环节就会无法继续进行下去, 所以就会发生无法通过链接文件读取的问题了!

这个 Symbolic Link 与 Windows 的捷径可以给他划上等号,由 Symbolic link 所创建的文件为一个独立的新的文件,所以会占用掉 inode 与 block 。

1.2.3、指令
ln [-sf] 来源文件 目标文件

选项与参数:

  • -s :如果不加任何参数就进行链接,那就是hard link,至于 -s 就是symbolic link;
  • -f :如果 目标文件 存在时,就主动的将目标文件直接移除后再创建!

关于目录的 link 数量:

一个“空目录”里面至少会存在 . 与 … 这两个目录。那么,当创建一个新目录名称为 /tmp/testing 时,基本上会有三个东西,那就是:

  • /tmp/testing
  • /tmp/testing/.
  • /tmp/testing/…

而其中 /tmp/testing 与 /tmp/testing/. 其实是一样的!都代表该目录,而 /tmp/testing/… 则代表 /tmp 这个目录。所以说,当创建一个新的目录时, “新的目录的 link 数为 2 ,而上层目录的 link 数则会增加 1。

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

想要在系统里面新增一颗磁盘时,应该有如下动作需要做:

  1. 对磁盘进行分区,以创建可用的 partition ;
  2. 对该 partition 进行格式化 (format),以创建系统可用的 filesystem;
  3. 若想要仔细一点,则可对刚刚创建好的 filesystem 进行检验;
  4. 在 Linux 系统上,需要创建挂载点 (亦即是目录),并将他挂载上来。

2.1、观察磁盘分区状态

目前磁盘分区主要有 MBR 以及 GPT 两种格式,这两种格式所使用的分区工具不太一样,因此分区前要去找一下目前系统有的磁盘有哪些, 这些磁盘是 MBR 还是 GPT 等等。

2.1.1、lsblk 列出系统上的所有磁盘列表

lsblk 可以看成“ list block device ”的缩写,就是列出所有储存设备的意思。

lsblk [-dfimpt] [device]

选项与参数:

  • -d :仅列出磁盘本身,并不会列出该磁盘的分区数据
  • -f :同时列出该磁盘内的文件系统名称
  • -i :使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用)
  • -m :同时输出该设备在 /dev 下面的权限数据 (rwx 的数据)
  • -p :列出该设备的完整文件名!而不是仅列出最后的名字而已
  • -t :列出该磁盘设备的详细数据,包括磁盘伫列机制、预读写的数据量大小等

范例一:列出本系统下的所有磁盘与磁盘内的分区信息

root@master:/dev# lsblk
NAME                  MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                     8:0    0   500G  0 disk 
├─sda1                  8:1    0   487M  0 part /boot
├─sda2                  8:2    0     1K  0 part 
└─sda5                  8:5    0 499.5G  0 part 
  ├─ubuntu--vg-root   252:0    0 483.5G  0 lvm  /
  └─ubuntu--vg-swap_1 252:1    0    16G  0 lvm  [SWAP]
sr0                    11:0    1  1024M  0 rom  

系统主要有个 sr0 以及一个 sda 的设备,而 sda 的设备下面又有三个分区, 其中 sda5 甚至还有因为 LVM 产生的文件系统。

  • NAME:就是设备的文件名!会省略 /dev 等前导目录;
  • MAJ:MIN:其实核心认识的设备都是通过这两个代码来熟悉的!分别是主要:次要设备代码;
  • RM:是否为可卸载设备 (removable device),如光盘、USB 磁盘等等;
  • SIZE:当然就是容量;
  • RO:是否为只读设备的意思;
  • TYPE:是磁盘 (disk)、分区 (partition) 还是只读存储器 (rom) 等输出;
  • MOUTPOINT:挂载点!

范例二:仅列出 /dev/sda 设备内的所有数据的完整文件名

root@master:/dev# lsblk -ip /dev/sda
NAME                    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
/dev/sda                  8:0    0   500G  0 disk 
|-/dev/sda1               8:1    0   487M  0 part /boot
|-/dev/sda2               8:2    0     1K  0 part 
`-/dev/sda5               8:5    0 499.5G  0 part 
  |-/dev/mapper/ubuntu--vg-root  252:0 0 483.5G  0 lvm  /
  `
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值