磁盘分区和格式化操作是比较接近硬件底层的操作,这两个操作也是至关重要的,决定了磁盘的使用效率和磁盘的数据安全。(相信现在应该没有什么特别的需要,一般都已经抛弃了ext2,ext4文件格式了吧~~~~,ext2,ext3,ext4,xfs ,等等文件系统格式的优缺点不在本文讨论范围,有想了解的百度即可啦)
本文也不讨论Windows的文件系统格式,比如什么DOS,fat16,fat32,ntfs这些啦,主要的是想说一下Linux下的分区表格式,那就是MBR和GPT和loop。
有些同学会奇怪,怎么还有一个loop,这里需要申明,loop是表示整盘分区的,意思就是整个硬盘作为一个独立的分区,比如,一个新的硬盘插到主板上后,Linux系统开机后,如果不出意外,将会lsblk命令可以看到,此时,不使用fdisk或者parted,gparted等分区格式化工具,直接 格式化整个硬盘,格式化完成后,此时的硬盘分区就是loop了。
假设我有一块新的硬盘被Linux系统识别为了sde, 那么,我只执行 mkfs.xfs /dev/sde 这个格式化命令,此时,这个硬盘就是loop分区格式啦!!!!!!!!~~~~~
下面将仔细讲解。
分区所使用的命令主要为fdisk和parted,查看磁盘的详细情况的命令主要为lsblk,blkid,df 这三个命令。
- lsblk
盲猜这个命令是 list status block的缩写,当然, 这么理解也是会更记忆深刻:列出所有块设备的状态。用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息。块设备有硬盘,闪存盘,cd-ROM等等。lsblk命令包含在util-linux-ng包中,现在该包改名为util-linux。这个包带了几个其它工具,如dmesg。要安装lsblk,请在此处下载util-linux包。如果没有此命令,来安装该包即可。比如,我的虚拟机的所有磁盘信息是这样的:
这里,表示有三个硬盘,sda,sdb,sdc,容量分别为100G,22G,3.7T,sda这个硬盘划分了两个分区,分别为sda1和sda2,sda2又是使用的lvm格式,并且每个分区的挂载点也列出来了,sda3和sda4容量基本可以忽略,并且没有进行挂载。sr0表示光驱,也没有挂载。
2. blkid
该命令显示所有已经格式化的分区详细信息,其中有UUID,该ID为系统随机分配的固定的唯一标识,因此,我们挂载的时候应该使用UUID写入/etc/fstab ,即使硬盘挂载顺序有变,依然保证挂载的有效(比如,我有很多硬盘,然后我把一个新的硬盘插到了某个旧的原有的硬盘位,而旧有的硬盘换位置啦,这个时候,可能sdb 就会变成sdd或者别的名字了,如果/etc/fstab 里写的是 诸如 /dev/sdb 这么固定的,那么,挂载必定会出错啦~~!!~~~~!!~~~~!!)
以上显示我所有的格式化过的分区,每个分区的文件系统类型也标识了出来,比如,/dev/sdb: UUID="0fe31ddd-9388-4b5f-ab21-28d6190eed94" TYPE="ext4" 表示 sdb这个硬盘格式化成了ext4文件系统,这个命令的用处就是查看并校验我们是否格式化成功的命令。
3. df
df 是一个古老的命令,该命令会显示所有已挂载到系统内的分区的使用情况,
这里比较特殊的是cgroup文件系统,它的定义大概是这样的(docker和cgroup是深度绑定的,因此,在这里稍微提一下。):
Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。这个项目最早是由Google的工程师在2006年发起(主要是Paul Menage和Rohit Seth),最早的名称为进程容器(process containers)。在2007年时,因为在Linux内核中,容器(container)这个名词太过广泛,为避免混乱,被重命名为cgroup,并且被合并到2.6.24版的内核中去。然后,其它开始了他的发展。
Linux CGroupCgroup 可让您为系统中所运行任务(进程)的用户定义组群分配资源 — 比如 CPU 时间、系统内存、网络带宽或者这些资源的组合。您可以监控您配置的 cgroup,拒绝 cgroup 访问某些资源,甚至在运行的系统中动态配置您的 cgroup。
这里这个示例我是使用的vm虚拟机,操作系统是centos7.4,总共挂载了三块硬盘,硬盘的情况如下:
这里提前说一下,我这个操作系统内有三种,sda是MBR分区表形式,sdb和c是loop分区表形式(也就是整盘挂载),GPT分区表后面在实现。
先容我卖一个关子,讲讲怎么看 MBR,GPT和loop的分区表信息吧~~~~~~~
A:查看MBR分区表信息:
前面已经说了sda是MBR分区表,以上命令是复制备份分区表信息,将信息存放到名为mbr.hex这个文件内的,查看该文件的内容是如下命令:
文件内容如下:
在末尾,可以看到mbr的标志:55aa,也就是说只要看到55aa,我们就应该可以确定,这个硬盘是MBR分区表形式啦。55aa是硬盘有效标志,若被篡改则系统认为硬盘损坏.早期一些dos下的病毒喜欢篡改这个标志,造成硬盘损坏,但是分区还在。比较出名的此类病毒比如熊猫烧香就是更改55aa标志啦。
B:
GPT分区表的查看
gpt标准的结构是32个扇区,所以这里要操作32次,即依次读取第一块硬盘的0~31扇区。
读取二进制文件的内容命令为:
GPT暂时没有,后面补充该文件的内容
首先开头的是一个保护性的MBR,为的是兼容,和早期的MBR类似,以55AA作为结束。
接下来是GPT头,以UEFI PART作为头标识字符。
C:
loop分区表的查看
文件内容如下:
在查看sdc的分区表,发现内容和sdb是一样的:
有一个有意思的事情,我们如果查看光驱,也就是sr0的分区表 ,将会看到MBR分区表的标识,但是,你可以发现,后面的几行全是0:
上面我们是通过复制备份硬盘的分区表,根据它自己的特点,可以看出是哪一类的分区,那有没有更快速有效的方法呢?当然有了,这时候就需要 fdisk和parted命令啦;
一,fdisk
古老的硬盘分区程序,Linux自带的,只是这个程序只支持MBR分区,并且该命令是修改内存的,也就是说不按w键,将不会对任何改动生效。
例如,我将sdc这个硬盘转换成GPT后,使用命令 fdisk /dev/sdc 将会出现如下输出,
如果是MBR,fdisk将不会提示:
二,parted命令
这个命令相比fdisk更新,因此,该程序向下兼容fdisk,也就是说可以分区MBR,也可以分区GPT,此命令是即时生效,这里需要注意,不同于fdisk哦,因此,该命令需要谨慎使用。查看分区类型的命令是 :parted 磁盘名称 print,比如看sdb和sdc
sdb是整盘分区,loop,sdc就是GPT啦。
其中的Warning: Partition(s) on /dev/sdc are being used.说的是硬盘在使用,如果强行更改分区表,数据将会全部丢失,选择当然是忽略Ignore啦,第二个是问要不要继续,当然是Yes啦。更改完后parted提示你要修改挂载配置文件 /etc/fstab。
Ignore/Cancel? Ignore
Warning: The existing disk label on /dev/sdc will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? Yes
Information: You may need to update /etc/fstab
以上仅仅是将磁盘sdc的分区表改为了GPT,还需要继续分区,命令是: mkpart mydata xfs
通过命令parted mkpart mydata xfs 输入20000(单位是M,mydata是一个自定义的名称,可以随意,但最好有一定的意义,自己清楚比较好哦),我们分了一个20G的区,现在格式化后(命令为mkfs.xfs /dev/sdc1)可以通过命令 blkid看到我们新分出来的这个区啦
为什么是sdc1呢?因为,我们通过lsblk命令可以看到啦!!!!!!!!!
那,现在并不想只有一个分区怎么办呢?光一个sdc1太孤单啦,在分一个区吧!!! 命令是:parted /dev/sdc mkpart mydata2
好啦,现在我们在通过lsblk和blkid看看sdc这个硬盘什么样了吧!!!
可以看到,又分了一个200G的名字叫mydata2的分区。以上分区操作,我们会发现使用M这个单位有点眼花啦,因为4t基本等于4000000M,光数0就很头疼啦,怎么办?可以指定单位是G啦,好了,现在就把所有分的区清理掉,命令是:parted /dev/sdc rm 1 parted /dev/sdc rm 2
如果你瞎写一个 不存在的分区序号,那么会简单报个错(比如,上面的分区已经删除完了,在执行一次 parted /dev/sdc rm 1):
现在开始正式的分区啦,当然,首先我们要看看sdc到底是多大的硬盘,命令如下:
可以看到,是4080G,第一个分区我们要分4t大小,那么,命令是这样的(非交互式的哦,效果是和上面的一样的):
可以看到,非交互式可以直接格式化好分区,交互式并不会。因为4T大于4080G,因此,是全部分完的哦。
再次删除,重新划分分区,这次是3000G和1000G两个分区,那么,命令应该是这样的(这里有技巧的,下一个分区的开始是上一个分区的结束,这里请仔细理解):
这里需要注意,第二个分区因为分区的时候输入了Ignore,因此,指定的xfs并没有显示,我们需要专门对此分区格式化一下,也就是命令 :
特别注意,这样指定的xfs其实并没有什么卵用,还是需要格式化一下的,因为,你如果不格式化,直接挂载是可以成功的,但df命令显示的容量是不对的。
mkfs.xfs /dev/sdc2 当然,也可以格式化成你想要的其它文件系统,比如ext4,这些都是没有什么问题的。
通过blkid我们查出sdc1的UUID,然后将这个UUID写入/etc/fstab 进行挂载就可以使用啦,当然,把这个写入/etc/fstab 文件内也是可以接受的---PARTUUID=4618b8db-269e-4255-ab88-e6c9e3c0ad9a
格式化后,挂载成功后,df命令将显示实际的准确的容量(文件系统毕竟也是要算容量的啊,当然会小很多啦。):
整盘分区也就是loop模式就是直接执行硬盘格式化命令,系统会认为这个硬盘是loop分区表啦,例子如下: