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

文件系统是在是非常有趣的东西,鸟哥学了好几年很多东西都不懂,这里有一些经验以供参考

# 磁盘空间之浪费问题

前面 ext2 data block 中谈到一个 block 只能放置一个文件,因此太多小文件会浪费很多的磁盘容量。

[root@study ~]# ll -sh
总用量 16K
4.0K -rw-------. 1 root   root   2.2K 104 18:32 anaconda-ks.cfg
4.0K -rw-r--r--. 2 root   root    451 610 2014 crontab
   0 lrwxrwxrwx. 1 root   root     12 1022 00:00 crontab2 -> /etc/crontab
4.0K -rw-r--r--. 1 root   root   2.2K 104 18:42 initial-setup-ks.cfg
4.0K -rwxr-xrwx. 1 mrcode mrcode 2.2K 107 23:30 initial-setup-ks-mrcode.cfg
1
2
3
4
5
6
7

上述的总用量是每个文件所使掉 blcok 的容量的汇总,但是 哪个 crontab 文件实际只有用 451bytes,但是他却占用了整个 block (每个 block 为 4k)。所以总共占用了 16k 的容量,但是实际这里的文件总容量不到 7k

当讨论磁盘空间浪费问题的时候,需要考虑到文件容量的损耗

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

parted 同时支持 gdisk 和 fdisk 分区

parted [装置][指令][参数]

选项与参数,指令功能:
	新增分区:mkpart [primary|logical|extended][ext4|vfat|xfs] 开始 结束
	显示分区:print
	删除分区:rm [partition]
1
2
3
4
5
6

实践练习

# 列出目前本机的分区表资料
[root@study ~]# parted /dev/sda print
Model: ATA VBOX HARDDISK (scsi)				# 磁盘接口与型号
Disk /dev/sda: 43.8GB									# 磁盘文件名与容量
Sector size (logical/physical): 512B/512B		#每个扇区大小
Partition Table: gpt		# 分区表 gpt
Disk Flags: pmbr_boot

Number  Start   End     Size    File system     Name                  标志
 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
7
8
9
10
11
12
13
14
15
16

上面是最简单的 parted 指令功能简介,可以使用 man parted 或则 parted /dev/sda help mkpart查询更详细的数据。下面解释下每个字段是啥意思

  • Number:分区槽号码,比如 1 表示 /dev/sda1
  • Start:分区的其实位置在这颗磁盘的多少 MB 处?这里以容量作为单位
  • End:此分区的结束位置在这颗磁盘的多少 MB 处?
  • Size:由上述数据分析,得到这个分区槽有多少容量
  • File system:分析可能的文件系统类型
  • Name:如同 gdisk 的 System ID 的意思

不过这里你发现没有,start 与 end 的单位都不一样,看起来很费劲,可以通过以下指令固定

[root@study ~]# parted /dev/sda unit mb print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 43772MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: pmbr_boot

Number  Start    End      Size     File system     Name                  标志
 1      1.05MB   3.15MB   2.10MB                                         bios_grub
 2      3.15MB   1077MB   1074MB   xfs
 3      1077MB   33293MB  32216MB                                        lvm
 4      33293MB  34367MB  1074MB   xfs             Linux filesystem
 5      34367MB  35441MB  1074MB   ext4            Microsoft basic data
 6      35441MB  35978MB  537MB    linux-swap(v1)  Linux swap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

如果想将原本的 MBR 和 GPT 分区表互相换,也可以使用 parted,不过不要用本次的 sda 来测试,因为分区表格式不能转换,该磁盘上的系统会损坏的。

下面测试,笔者就没有条件测试了,直接记录笔记

# 将 /dev/sda 原本是 MBR 分区变成 GPT 分区表
parted /dev/sda print
...
Partition Table: msdos  # MBR 就是现实 msdos 格式

# 改变成 gpt 分区
parted /dev/sda mklabel gpt
1
2
3
4
5
6
7

新的示例:建立一个全新的分区槽,格式化为 vfat 格式,且挂载到 /data/win 目录

# 查看分区表情况
[root@study ~]# parted /dev/sda print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 43.8GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: pmbr_boot

Number  Start   End     Size    File system     Name                  标志
 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
# 找到最后一个分区的 end 位置,作为下一个分区的起始位置
[root@study ~]# parted /dev/sda mkpart primary fat32 36.0GB 36.5GB
信息: You may need to update /etc/fstab.
# 再次查看,就看到第 7 个了
[root@study ~]# parted /dev/sda print
 7      36.0GB  36.5GB  522MB                   primary
 
 # 确认真的存在
[root@study ~]# partprobe 
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。
[root@study ~]# lsblk /dev/sda7
NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda7   8:7    0  498M  0 part 

# 格式化分区为 vfat 格式
[root@study ~]# mkfs -t vfat /dev/sda7
mkfs.fat 3.0.20 (12 Jun 2013)
[root@study ~]# blkid /dev/sda7
/dev/sda7: SEC_TYPE="msdos" UUID="72BE-0556" TYPE="vfat" PARTLABEL="primary" PARTUUID="3a31eca1-2f5d-4960-8d61-739c4461b30f" 

# 添加到自动挂载
nano /etc/fstab
UUID="72BE-0556" /data/win vfat defaults 0 0

[root@study ~]# mkdir /data/win
[root@study ~]# mount -a
[root@study ~]# df /data/win/
文件系统        1K-块  已用   可用 已用% 挂载点
/dev/sda7      509672     0 509672    0% /data/win

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

事实上,你应该使用 gdisk 来处理 GPT 分区,不过 parted 非常适合通过脚本来一口气将分区全部建立,因为 parted 可以不用与用户交互