返回介绍

7.6 文件系统的特殊观察与操作

发布于 2020-11-10 06:52:39 字数 16267 浏览 1030 评论 0 收藏 0

7.6 文件系统的特殊观察与操作

文件系统实在是非常有趣的东西,鸟哥学了好几年还是很多东西不很懂呢!在学习的过程中很多朋友在讨论区都有提供一些想法! 这些想法将他归纳起来有下面几点可以参考的数据呢!

7.6.1 磁盘空间之浪费问题

我们在前面的 EXT2 data block 介绍中谈到了一个 block 只能放置一个文件, 因此太多小文件将会浪费非常多的磁盘容量。但你有没有注意到,整个文件系统中包括 superblock, inode table 与其他中介数据等其实都会浪费磁盘容量喔!所以当我们在 /dev/vda4, /dev/vda5 创建起 xfs/ext4 文件系统时, 一挂载就立刻有很多容量被用掉了!

另外,不知道你有没有发现到,当你使用 ls -l 去查询某个目录下的数据时,第一行都会出现一个“total”的字样! 那是啥东西?其实那就是该目录下的所有数据所耗用的实际 block 数量 * block 大小的值。 我们可以通过 ll -s 来观察看看上述的意义:

[[email protected] ~]# ll -sh
total 12K
4.0K -rw-------. 1 root root 1.8K May  4 17:57 anaconda-ks.cfg
4.0K -rw-r--r--. 2 root root  451 Jun 10  2014 crontab
 0 lrwxrwxrwx. 1 root root   12 Jun 23 22:31 crontab2 -> /etc/crontab
4.0K -rw-r--r--. 1 root root 1.9K May  4 18:01 initial-setup-ks.cfg
 0 -rw-r--r--. 1 root root    0 Jun 16 01:11 test1
 0 drwxr-xr-x. 2 root root    6 Jun 16 01:11 test2
 0 -rw-rw-r--. 1 root root    0 Jun 16 01:12 test3
 0 drwxrwxr-x. 2 root root    6 Jun 16 01:12 test4

从上面的特殊字体部分,那就是每个文件所使用掉 block 的容量!举例来说,那个 crontab 虽然仅有 451Bytes , 不过他却占用了整个 block (每个 block 为 4K),所以将所有的文件的所有的 block 加总就得到 12KBytes 那个数值了。 如果计算每个文件实际容量的加总结果,其实只有不到 5K 而已~所以啰,这样就耗费掉好多容量了!未来大家在讨论小磁盘、 大磁盘,文件大小的损耗时,要回想到这个区块喔! ^_^

7.6.2 利用 GNU 的 parted 进行分区行为(Optional)

虽然你可以使用 gdisk/fdisk 很快速的将你的分区切割妥当,不过 gdisk 主要针对 GPT 而 fdisk 主要支持 MBR ,对 GPT 的支持还不够! 所以使用不同的分区时,得要先查询到正确的分区表才能用适合的指令,好麻烦!有没有同时支持的指令呢?有的!那就是 parted 啰!

Tips 老实说,若不是后来有推出支持 GPT 的 gdisk,鸟哥其实已经爱用 parted 来进行分区行为了!虽然很多指令都需要同时开一个终端机去查 man page, 不过至少所有的分区表都能够支持哩! ^_^

parted 可以直接在一行命令行就完成分区,是一个非常好用的指令!它常用的语法如下:

[[email protected] ~]# parted [设备] [指令 [参数]]
选项与参数:
指令功能:
          新增分区:mkpart [primary|logical|extended] [ext4|vfat|xfs] 开始 结束
          显示分区:print
          删除分区:rm [partition]

范例一:以 parted 列出目前本机的分区表数据
[[email protected] ~]# parted /dev/vda print
Model: Virtio Block Device (virtblk)         <==磁盘接口与型号
Disk /dev/vda: 42.9GB                        <==磁盘文件名与容量
Sector size (logical/physical): 512B/512B    <==每个扇区的大小
Partition Table: gpt                         <==是 GPT 还是 MBR 分区
Disk Flags: pmbr_boot

Number  Start   End     Size    File system     Name                  Flags
 1      1049kB  3146kB  2097kB                                        bios_grub
 2      3146kB  1077MB  1074MB  xfs
 3      1077MB  33.3GB  32.2GB                                        lvm
 4      33.3GB  34.4GB  1074MB  xfs             Linux filesystem
 5      34.4GB  35.4GB  1074MB  ext4            Microsoft basic data
 6      35.4GB  36.0GB  537MB   linux-swap(v1)  Linux swap
[  1 ]  [  2 ]  [  3  ] [  4  ] [  5  ]         [  6  ]

上面是最简单的 parted 指令功能简介,你可以使用“ man parted ”,或者是“ parted /dev/vda help mkpart ”去查询更详细的数据。比较有趣的地方在于分区表的输出。我们将上述的分区表示意拆成六部分来说明:

  1. Number:这个就是分区的号码啦!举例来说,1号代表的是 /dev/vda1 的意思;
  2. Start:分区的起始位置在这颗磁盘的多少 MB 处?有趣吧!他以容量作为单位喔!
  3. End:此分区的结束位置在这颗磁盘的多少 MB 处?
  4. Size:由上述两者的分析,得到这个分区有多少容量;
  5. File system:分析可能的文件系统类型为何的意思!
  6. Name:就如同 gdisk 的 System ID 之意。

不过 start 与 end 的单位竟然不一致!好烦~如果你想要固定单位,例如都用 MB 显示的话,可以这样做:

[[email protected] ~]# parted /dev/vda unit mb print

如果你想要将原本的 MBR 改成 GPT 分区表,或原本的 GPT 分区表改成 MBR 分区表,也能使用 parted ! 但是请不要使用 vda 来测试!因为分区表格式不能转换!因此进行下面的测试后,在该磁盘的系统应该是会损毁的! 所以鸟哥拿一颗没有使用的U盘来测试,所以文件名会变成 /dev/sda 喔!再讲一次!不要恶搞喔!

范例二:将 /dev/sda 这个原本的 MBR 分区表变成 GPT 分区表!(危险!危险!勿乱搞!无法复原!)
[[email protected] ~]# parted /dev/sda print
Model: ATA QEMU HARDDISK (scsi)
Disk /dev/sda: 2148MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos    # 确实显示的是 MBR 的 msdos 格式喔!

[[email protected] ~]# parted /dev/sda mklabel gpt
Warning: The existing disk label on /dev/sda will be destroyed and all data on 
this disk will be lost. Do you want to continue?
Yes/No? y

[[email protected] ~]# parted /dev/sda print
# 你应该就会看到变成 gpt 的模样!只是...后续的分区就全部都死掉了!

接下来我们尝试来创建一个全新的分区吧!再次的创建一个 512MB 的分区来格式化为 vfat,且挂载于 /data/win 喔!

范例三:创建一个约为 512MB 容量的分区
[[email protected] ~]# parted /dev/vda print
.....(前面省略).....
Number  Start   End     Size    File system     Name                  Flags
.....(中间省略).....
 6      35.4GB  36.0GB  537MB   linux-swap(v1)  Linux swap  # 要先找出来下一个分区的起始点!

[[email protected] ~]# parted /dev/vda mkpart primary fat32 36.0GB 36.5GB
# 由于新的分区的起始点在前一个分区的后面,所以当然要先找出前面那个分区的 End 位置!
# 然后再请参考 mkpart 的指令功能,就能够处理好相关的动作!
[[email protected] ~]# parted /dev/vda print
.....(前面省略).....
Number  Start   End     Size    File system     Name                  Flags
 7      36.0GB  36.5GB  522MB                   primary

[[email protected] ~]# partprobe
[[email protected] ~]# lsblk /dev/vda7
NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda7 252:7    0  498M  0 part      # 要确定它是真的存在才行!

[[email protected] ~]# mkfs -t vfat /dev/vda7
[[email protected] ~]# blkid /dev/vda7
/dev/vda7: SEC_TYPE="msdos" UUID="6032-BF38" TYPE="vfat"

[[email protected] ~]# nano /etc/fstab
UUID="6032-BF38"  /data/win  vfat  defaults   0  0

[[email protected] ~]# mkdir /data/win
[[email protected] ~]# mount -a
[[email protected] ~]# df /data/win
Filesystem     1K-blocks  Used Available Use% Mounted on
/dev/vda7         509672     0    509672   0% /data/win

事实上,你应该使用 gdisk 来处理 GPT 分区就好了!不过,某些特殊时刻,例如你要自己写一只脚本,让你的分区全部一口气创建, 不需要 gdisk 一条一条指令去进行时,那么 parted 就非常有效果了!因为他可以直接进行 partition 而不需要跟用户互动!这就是它的最大好处! 鸟哥还是建议,至少你要操作过几次 parted ,知道这家伙的用途!未来有需要再回来查!或使用 man parted 去处理喔!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文