Linux最传统的磁盘文件系统(filesystem)使用的是EXT4格式,所以要了解文件系统就得要由认识EXT4开始,而文件系统是创建在硬盘上面的,因此我们得了解硬盘的物理组成才行,下面我们回来详细谈一谈磁盘,inode,block还有superblock等文件系统,的理论知识.
♥ 文章声明 ♥ 该系列文章部分文字描述,整理于以下文献,化繁为简. 《鸟哥的Linux私房菜 (基础学习篇 第三版)》 - 作者:鸟哥 《Linux就该这么学》 - 作者:刘遄
关于磁盘与分区
目前在市场中磁盘的分类也是五花八门,一般在主机中使用的磁盘无外乎,以下几种,包括常用的构造,我们在这里说明.
接口分类:IDE、SATA、SCSI、SAS、光纤通道接口等 构造分类:机械硬盘(HDD)、固态硬盘(SSD)、混合硬盘(HHD) 制造厂商:希捷、西部数据、东芝、三星、英特尔、闪迪 尺寸大小:3.5英寸、2.5 英寸、1.8英寸、1.3/1.0/0.85英寸
磁盘的常用参数,有以下几种形式:
容量:MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB 转速:台式机(7200rpm)、笔记本(5400rpm)、服务器(10000rpm,15000rpm) 传输速度: STAT3(500M/s)、SCSI(320M/s)、SAS(500M/s)、PCI-E(1200M/s) 缓存:硬盘控制器的内存芯片,内部存储和接口的缓存
接下来我们在说明一下磁盘的物理组成,整个磁盘的组成主要有:
● 圆形的盘片(主要记录数据的部分) ● 机械手臂与手臂上的磁头(用来读写盘片上的数据) ● 主轴马达,可以转动盘片,让机械臂在盘片上都写
从上面我们知道数据储存与读取的重点在于磁盘的盘片,而盘片上的物理组成则为,以下构造:
● 扇区(Sector):为最小的物理存储单位,每个扇区为512bytes ● 柱面(Cylinder):将扇区组成一个圆就是柱面,柱面是分区(partition)的最小单位 ● 第一个扇区最重要,里面记录着硬盘主引导记录(MBR)以及分区表(PT),其中MBR占446bytes,而PT则占用64bytes
所谓的磁盘分区指的是告诉操作系统 『我这块磁盘在此分区可以访问的区域是,由A柱面到B柱面之间的块』,如此一来操作系统就能够知道,他可以在所指定的区块内进行文件数据的读/写/查找等操作,也就是说,磁盘分区意即指定分区的起始于结束柱面就可以.
因为分区表仅有64bytes而已,因此最多只能记录四条分区的记录,这四条分区记录我们称为主分区(primary)或扩展分区(extended),其中扩展分区还可以再分出逻辑分区(logical),而能被格式化的则仅有主分区和逻辑分区.
最后我们再把分区的定义拿出来说明一下:
1.主分区与扩展分区最对可以有4个(硬盘限制) 2.扩展分区最多只有一个(操作系统的限制) 3.逻辑分区是由扩展分区持续分出来的分区 4.只有逻辑分区能被格式化,扩展分区无法格式化 5.逻辑分区在Linux系统中,IDE硬盘最多59个,SATA硬盘最多11个
关于文件系统的特性
我们都知道磁盘分区完毕后还需要进行格式化(format),之后操作系统才能够使用这个分区,为什么需要进行『格式化』呢? 这是因为每种操作系统所配置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此就需要将分区进行格式化,以成为操作系统能够利用的『文件系统格式(filesystem)』.
那么文件系统是如何运行的呢? 这与操作系统的文件数据有关,较新的操作系统的文件数据除了文件实际内容外,通常含有非常多的属性,例如 Linux 操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等),文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中,另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等.
superblock:记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等 inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码 block:实际记录文件的内容,若文件太大时,会占用多个 block
由于每个 inode 与 block 都有编号,而每个文件都会占用一个 inode,inode 内则有文件数据放置的 block 号,因此我们可以知道的是,如果能够找到文件的 inode 的话,那么自然就会知道这个文件所放置数据的 block 号,当然也就能够读出该文件的实际数据了,这是个比较有效率的作法,因为如此一来我们的磁盘就能够在短时间内读取出全部的数据,读写的效率非常好.
data block 真正存储数据的地方
data block 是用来放置文件内容数据地方,在 Ext4 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种而已,在格式化时 block 的大小就固定了,且每个 block 都有编号,以方便 inode 的记录,不过要注意的是,由于 block 大小的差异,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同。,因为 block 大小而产生的 Ext4 文件系统限制如下:
代码语言:javascript复制Block大小 1KB 2KB 4KB
最大单一文件限制 16GB 256GB 2TB
最大文件系统总容量 2TB 8TB 16TB
除此之外 Ext4 文件系统的 block 还有什么限制呢? 有的!基本限制如下: ● 原则上block的大小与数量在格式化完就不能够再改变了(除非重新格式化) ● 每个block内最多只能够放置一个文件的数据 ● 承上如果文件大于block的大小则一个文件会占用多个 block 数量 ● 承上若文件小于block则该block的剩余容量就不能够再被使用了(磁盘空间会浪费)
Superblock 超级块记录
Superblock 是记录整个文件系统分配的地方,没有 Superblock 就没有这个文件系统了,他记录的信息主要有: ● block 与 inode 的总量 ● 未使用与已使用的 inode / block 数量 ● block 与 inode 的大小 (block 为 1, 2, 4K,inode 为 128 bytes) ● 文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息 ● 一个 valid bit 数值若此文件系统已被挂载,则 valid bit 为 0 若未被挂载则 valid bit 为 1
Superblock 是非常重要的,因为我们这个文件系统的基本信息都写在这里,因此如果 superblock 死掉了,你的文件系统可能就需要花费很多时间去挽救,一般来说 superblock 的大小为 1024bytes.
关于主引导记录的解释
主引导记录(MBR,Main Boot Record)是位于磁盘最前边的一段引导(Loader)代码,它负责磁盘操作系统(DOS)对磁盘进行读写时分区合法性的判别、分区引导信息的定位,它由磁盘操作系统(DOS)在对硬盘进行初始化时产生的.
主引导记录在磁盘最前边的一段引导代码,占用了磁盘的第一个分区,结构为: ● 主引导程序(boot loader)占用了446byte ● 分区表(Partition table)占用了64byte ● 有效标志符(magic number)占用了2byte(55AAH代表有效)
主引导扇区的读取流程是 ? ● BIOS 加电自检 ( Power On Self Test -- POST )BIOS执行内存地址的跳转指令,跳转到固化在ROM中的自检程序,对系统硬件(包括内存)进行检查 ● 读取主引导记录(MBR),当BIOS检查到硬件正常并与 CMOS 中的设置相符后,按照 CMOS 中对启动设备的设置顺序检测可用的启动设备,BIOS将相应启动设备的第一个扇区(也就是MBR扇区)读入内存 ● 检查MBR的结束标志位是否等于55AAH,若不等于则转去尝试其他启动设备,如果没有启动设备满足要求则显示“NO ROM BASIC”然后死机 ● 当检测到有启动设备满足要求后,BIOS将控制权交给相应启动设备,启动设备的MBR将自己复制到0000:0600H处,然后继续执行 ● 根据MBR中的引导代码启动引导程序,进入下一个引导环节
关于MBR分区表的介绍
主引导记录(Master Boot Record,缩写:MBR)又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1).
MBR是由分区程序(如Fdisk,Parted)所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而能够实现多系统引导.
从主引导记录的结构可以知道,它仅仅包含一个64个字节的硬盘分区表,由于每个分区信息需要16个字节,所以对于采用MBR型分区结构的硬盘(其磁盘卷标类型为MS-DOS),最多只能识别4个主要分区,所以对于一个采用此种分区结构的硬盘来说,想要得到4个以上的主要分区是不可能的,这里就需要引出扩展分区了,扩展分区也是主分区(Primary partition)的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区,每一个逻辑分区都有一个和MBR结构类似的扩展引导记录(EBR),在MBR分区表中最多4个主分区或者3个主分区+1个扩展分区,也就是说扩展分区只能有一个,然后可以再细分为多个逻辑分区.
在Linux系统中,硬盘分区命名为sda1-sda4或者hda1-hda4(其中a表示硬盘编号可能是a、b、c等等),在MBR硬盘中,分区号1-4是主分区(或者扩展分区),逻辑分区号只能从5开始.
在MBR分区表中,一个分区最大的容量为2T,且每个分区的起始柱面必须在这个disk的前2T内,你有一个3T的硬盘,根据要求你至少要把它划分为2个分区,且最后一个分区的起始扇区要位于硬盘的前2T空间内,如果硬盘太大则必须改用GPT.
关于GPT分区表的介绍
全局唯一标识分区表(GUID Partition Table,缩写:GPT)是一个实体硬盘的分区结构,它是EFI(可扩展固件接口标准)的一部分,用来替代BIOS中的主引导记录分区表,但因为MBR分区表不支持容量大于2.2TB(2.2 × 1012字节)的分区,所以也有一些BIOS系统为了支持大容量硬盘而用GPT分区表取代MBR分区表.
在MBR硬盘中,分区信息直接存储于主引导记录(MBR)中(主引导记录中还存储着系统的引导程序),但在GPT硬盘中,分区表的位置信息储存在GPT头中,但出于兼容性考虑,硬盘的第一个扇区仍然用作MBR,之后才是GPT头.
与支持最大卷为2 TB(Terabytes)并且每个磁盘最多有4个主分区(或3个主分区,1个扩展分区和无限制的逻辑驱动器)的MBR磁盘分区的样式相比,GPT磁盘分区样式支持最大卷为18 EB(Exabytes)(1EB=1048576TB)并且每磁盘的分区数没有上限,只受到操作系统限制(由于分区表本身需要占用一定空间,最初规划硬盘分区时,留给分区表的空间决定了最多可以有多少个分区,IA-64版Windows限制最多有128个分区,这也是EFI标准规定的分区表的最小尺寸),与MBR分区的磁盘不同,至关重要的平台操作数据位于分区,而不是位于非分区或隐藏扇区.另外,GPT分区磁盘有备份分区表来提高分区数据结构的完整性.
其中转换为GPT的时候可以创建两个隐藏分区,ESP和MSR.ESP是efi系统分区用于保存引导文件,MSR是微软的保留分区,用于安装操作系统.
MBR与GPT,两种分区的小总结
- MBR分区表:Master Boot Record,即硬盘主引导记录分区表,只支持容量在 2.1TB 以下的硬盘,超过2.1TB的硬盘只能管理2.1TB,最多只支持4个主分区或三个主分区和一个扩展分区,扩展分区下可以有多个逻辑分区。
- GPT分区表:GPT,全局唯一标识分区表(GUID Partition Table),与MBR最大4个分区表项的限制相比,GPT对分区数量没有限制,但Windows最大仅支持128个GPT分区,GPT可管理硬盘大小达到了18EB。只有基于UEFI平台的主板才支持GPT分区引导启动。
- GPT分区表下的隐藏分区:
①. ESP分区:EFI system partition,该分区用于采用了EFI BIOS的电脑系统,用来启动操作系统。分区内存放引导管理程序、驱动程序、系统维护工具等。如果电脑采用了EFI系统,或当前磁盘用于在EFI平台上启动操作系统,则应建议ESP分区。
②. MSR分区:即微软保留分区,是GPT磁盘上用于保留空间以备用的分区,例如在将磁盘转换为动态磁盘时需要使用这些分区空间。
- 两种硬盘分区模式分别对应的BIOS启动方式:
硬盘分区格式为MBR格式,启动模式应该为Legacy; 硬盘分区格式为GUID(GPT)格式,启动模式应该为UEFI。
- MBR分区表的构成:
⦁主引导程序(boot loader)占用了446byte ⦁分区表(Partition table)占用了64byte ⦁有效标志符(magic number)占用了2byte(55AAH代表有效)
- GPT分区表的构成:
⦁LBA 0 :GPT分区的最开头,考虑兼容性问题,开头仍然存放MBR分区表,只是里面存放的是指向GPT的指针。防止有一些系统不识别GPT分区表。
⦁LBA 1 :存储了硬盘的总存储空间,以及GPT分区表的信息,定义最多能创建128个分区,每个分信息占用的空间是128字节;128个分区中有一个是用来存储备份分区表的,所以可以手动指定的分区数为127个分区。
⦁LBA 2-33:每个分区信息存放的位置,上边说了每个分信息占用的空间是128字节。2-33正好是32个扇区。32*512=16384,每个分区信息占用了128字节,16384/128=128个分区。
磁盘管理命令
◆dumpe2fs 查询磁盘参数◆
dumpe2fs命令用于打印 ext2/ext3/ext4 文件系统的超级块和块组信息,其实它可以查询磁盘的很多参数,下面我们先来看一下它的具体参数吧.
代码语言:javascript复制[root@localhost ~]# dumpe2fs --help
命令语法:[ dumpe2fs [选项] 磁盘路径 ]
-b #打印文件系统中预留的块信息
-h #仅显示超级块信息
-i #从指定的文件系统映像文件中读取文件系统信息
-x #以16进制格式打印信息块成员
-ob 超级块 #指定检查文件系统时使用的超级块
-OB 块大小 #检查文件系统时使用的指定的块大小
实例:通过dumpe2fs -h
显示指定/dev/sdb
分区的详细参数
[root@localhost ~]# dumpe2fs -h /dev/sdb
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: <none> #文件分区的名字(Label)
Last mounted on: <not available>
Filesystem UUID: 5dc23dc0-8245-4113-b40a-4cb09ad9f4de #文件系统的UUID
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl #默认挂载的参数
Filesystem state: clean #这个文件系统是没有问题的(clean)
Errors behavior: Continue
Filesystem OS type: Linux #文件系统类型是Linux
Inode count: 1310720 #Inode的总数
Block count: 5242880 #Block的总数
Reserved block count: 262144
Free blocks: 5116558 #剩余Blocks数量
Free inodes: 1310709 #剩余Inodes数量
First block: 0
Block size: 4096 #每个Block块的大小
Fragment size: 4096
Group descriptor size: 64
Reserved GDT blocks: 1024
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
Flex block group size: 16
Filesystem created: Sun Nov 18 08:59:48 2018
Last mount time: Sun Nov 18 08:59:59 2018
Last write time: Sun Nov 18 08:59:59 2018
Mount count: 1
Maximum mount count: -1
Last checked: Sun Nov 18 08:59:48 2018
Check interval: 0 (<none>)
Lifetime writes: 132 MB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256 #每个Inodes块的大小
Required extra isize: 28
Desired extra isize: 28
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: f00ad08a-e990-4c45-96c3-749116a4e540
Journal backup: inode blocks
Journal features: journal_64bit
Journal size: 128M
Journal length: 32768
Journal sequence: 0x00000002
Journal start: 1
◆df 查询磁盘信息◆
df命令用于显示磁盘分区上的可使用的磁盘空间,默认显示单位为KB,可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息,下面我们先来看一下它的具体参数吧.
代码语言:javascript复制[root@localhost ~]# df --help
命令语法:[ df [选项] ]
-a #列出所有的文件系统,包括/proc等系统
-k #以KB为单位,显示各文件系统
-m #以MB为单位,显示各文件系统
-h #以常用单位显示文件系统大小
-H #以M=1000替代M=1024显示数据
-T #显示文件系统类型
-i #不用硬盘容量,以Inode数量来显示
实例:以通用格式显示系统文件信息.
代码语言:javascript复制[root@localhost ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/rhel-root xfs 17G 1.2G 16G 7% /
devtmpfs devtmpfs 98M 0 98M 0% /dev
tmpfs tmpfs 110M 0 110M 0% /dev/shm
tmpfs tmpfs 110M 5.5M 104M 6% /run
tmpfs tmpfs 110M 0 110M 0% /sys/fs/cgroup
/dev/sr0 iso9660 4.4G 4.4G 0 100% /mnt
/dev/sda1 xfs 1014M 130M 885M 13% /boot
tmpfs tmpfs 22M 0 22M 0% /run/user/0
/dev/sdb ext4 20G 45M 19G 1% /lyshark
◆du 统计文件大小◆
du命令也是查看使用空间的,但是与df命令不同的是Linux,du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的,下面我们先来看一下它的具体参数吧.
代码语言:javascript复制[root@localhost ~]# du --help
命令语法:[ du [选项] 文件或目录 ]
-a #列出所有的文件与目录容量
-h #以常用单位显示容量信息
-s #只列出总容量,而不统计每个个别目录占用容量
-S #不包括子目录下的总计,区别于 -s
-m #以MB为单位显示
-k #以KB为单位显示
实例:通过du -sh
显示目录的总容量.
[root@localhost ~]# du -sh /etc/
31M /etc/
[root@localhost ~]# du -sh /usr/bin/
63M /usr/bin/
◆lsblk 查所有可用设备◆
lsblk命令用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息,块设备有硬盘,闪存盘,cd-ROM等,lsblk命令包含在util-linux-ng包中,现在该包改名为util-linux,这个包带了几个其它工具,如dmesg,要安装lsblk,请使用 yum install util-linux-ng 来安装,下面我们先来看一下它的具体参数吧.
代码语言:javascript复制[root@localhost ~]# lsblk --hlep
命令语法:[ lsblk [选项] ]
-a #显示所有设备
-m #显示权限信息
-l #使用列表格式显示
-n #不显示标题
-o 列名 #输出指定列
-P #以键和值的方式显示
-t #使用拓展格式输出
-r #使用原始格式输出
实例:使用lsblk -t
显示磁盘信息
[root@localhost ~]# lsblk -t
NAME ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE RA WSAME
sda 0 512 0 512 512 1 deadline 128 4096 32M
├─sda1 0 512 0 512 512 1 deadline 128 4096 32M
└─sda2 0 512 0 512 512 1 deadline 128 4096 32M
├─rhel-root 0 512 0 512 512 1 128 4096 32M
└─rhel-swap 0 512 0 512 512 1 128 4096 32M
sdb 0 512 0 512 512 1 deadline 128 4096 0B
sr0 0 2048 0 2048 2048 1 deadline 128 128 0B
◆e2label 设置卷标名◆
e2label命令用来设置第二扩展文件系统的卷标,此命令无参数,下面直接看一下使用技巧.
代码语言:javascript复制[root@localhost ~]# dumpe2fs -h /dev/sdb |grep "Filesystem volume name"
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: <none>
[root@localhost ~]# e2label /dev/sdb "lyshark desk"
[root@localhost ~]# dumpe2fs -h /dev/sdb |grep "Filesystem volume name"
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: lyshark desk
◆fsck 检查修复文件系统◆
fsck命令被用于检查并且试图修复文件系统中的错误,当文件系统发生错误,可用fsck指令尝试加以修复.
代码语言:javascript复制[root@localhost ~]# fsck --help
命令语法:[ fsck [选项] 磁盘路径 ]
-a #自动修复文件系统,不询问
-A #依照/etc/fstab配置文件的内容,检查文件内所列的全部文件系统
-t 类型 #指定检查文件系统类型
-V #显示指令执行过程
实例:检查并修复一个文件系统,应该先卸载在检查.
代码语言:javascript复制[root@localhost ~]# fsck -t ext4 -a /dev/sdb
fsck from util-linux 2.23.2
lyshark_desk: clean, 11/1310720 files, 126322/5242880 blocks
◆mkfs 格式化◆
mkfs命令用于在设备上(通常为硬盘)创建Linux文件系统,mkfs本身并不执行建立文件系统的工作,而是去调用相关的程序来执行,下面我们先来看一下它的具体参数吧.
代码语言:javascript复制[root@localhost ~]# mkfs -help
命令语法:[ mkfs [文件类型] 磁盘路径 ]
-t ext2 #格式化为ext2
-t ext3 #格式化为ext3
-t ext4 #格式化为ext4
[root@localhost ~]# mkfs.
mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.minix mkfs.xfs
xfs_group
实例:格式化一个分区,试一下.
代码语言:javascript复制[root@localhost ~]# mkfs -t ext4 /dev/sdb
mke2fs 1.42.9 (28-Dec-2013)
/dev/sdb is entire device, not just one partition!
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1310720 inodes, 5242880 blocks
262144 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2153775104
160 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
◆mount/umount 挂载与卸载磁盘◆
mount命令用于加载文件系统到指定的加载点,此命令的最常用于挂载cdrom,使我们可以访问cdrom中的数据,因为你将光盘插入cdrom中,Linux并不会自动挂载,必须使用Linux mount命令来手动完成挂载,下面老样子先看参数.
代码语言:javascript复制[root@localhost ~]# mount --help
命令语法:[ mount [选项] [原盘符] [挂载到] ]
-t ext2 #格式化为ext2
-a #根据/etc/fstab配置,重新挂载一遍
-l #显示已挂载文件系统列表
-t #指定挂载类型(ext2/ext3/vfat/reiserfs/iso9660)
-L #通过文件系统的卷标名称进行挂载
-r #将文件系统加载为只读模式
-v #输出指令执行详细信息
-o #指定额外挂载参数(ro,rw只读读写/exec,noexec是否可执行/remount 重新挂载)
实例1: 挂载光盘 /dev/sr0 挂载到 /mnt 目录下
代码语言:javascript复制[root@localhost ~]# mount -t iso9660 /dev/sr0 /mnt/
mount: /dev/sr0 is write-protected, mounting read-only
实例2: 挂载硬盘,挂载时指定语系为 iocharset=cp950 挂载到 /mnt/flash
代码语言:javascript复制[root@localhost ~]# mount -t vfat -o iocharset=cp950 /dev/sda1 /mnt/flash
实例3: 将根分区重新挂载,并加上读写权限
代码语言:javascript复制[root@localhost ~]# mount -o remount,rw,auto /
实例4: 将/home这个目录,临时挂载到/tmp/home下
代码语言:javascript复制[root@localhost ~]# mount --bind /home/ /tmp/home/
[root@localhost ~]# ll /tmp/home/
实例5: 利用卷标名来挂载
代码语言:javascript复制[root@localhost home]# mount -L "LyShark_Disk" /tmp/disk/
实例6: 挂载一个ISO镜像,例如Centos.iso
代码语言:javascript复制[root@localhost ~]# mount -o loop /root/Centos.iso /mnt/centos_dvd
实例7: 卸载磁盘或任意外部介质
代码语言:javascript复制[root@localhost home]# umount -v /dev/sr0
umount: /mnt (/dev/sr0) unmounted
磁盘分区命令-Fdisk
fdisk命令用于观察硬盘实体使用情况,也可对硬盘分区,它采用传统的问答式界面,而非类似DOS fdisk的cfdisk互动式操作界面,因此在使用上较为不便,但功能却丝毫不打折扣.
◆命令参数解释◆
代码语言:javascript复制[root@localhost ~]# fdisk -l #查看系统所有硬盘及分区
[root@localhost ~]# fdisk 磁盘设备名(/dev/sda) #创建或修改磁盘的分区结构
[root@localhost ~]# fdisk /dev/sd*
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): help
h: unknown command
Command action
p:打印分区表
n:新建一个新分区
d:删除一个分区
t:更改分区类型(82=交换分区)
m:输出菜单
q:退出不保存
w:把分区写进分区表,保存并退出
Command (m for help):
注:若报错Device or resource busy. The kernel still uses the old table.The new table will be used at the next reboot。则需要重启系统,重新加载硬盘,才能进一步操作。
partprobe 强制读取所有分区
⦁当出现上述情况时,也可不必重启,问题导致原因为内核正在使用分区表,那么我们可以是用partprobe强制读取所有分区达到不需要重启从而解决设备占用的问题。
命令没有请安装:parted-2.*-*-*.rpm
◆fdisk 分区实例◆
1.查看磁盘,查看是否有新的磁盘且没有被格式化的.
代码语言:javascript复制[root@localhost ~]# ls -l /dev/sd*
brw-rw---- 1 root disk 8, 0 Sep 21 07:26 /dev/sda
brw-rw---- 1 root disk 8, 1 Sep 21 07:26 /dev/sda1
brw-rw---- 1 root disk 8, 2 Sep 21 07:26 /dev/sda2
brw-rw---- 1 root disk 8, 16 Sep 21 07:26 /dev/sdb
代码语言:javascript复制[root@localhost ~]# fdisk -l
Disk /dev/sda: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000cc3ff
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 20971519 9436160 8e Linux LVM
↓ 此处就是我们的新磁盘,且没有被格式化
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
2.输入相应盘符进入分区界面
代码语言:javascript复制[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x5b3d4ae9.
Command (m for help):
3.开始分区,下面将逐个解释其分区含义
代码语言:javascript复制[root@localhost ~]# fdisk /dev/sdb #指定要分区的盘符
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x5b3d4ae9.
Command (m for help): p #打印当前分区信息
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5b3d4ae9
Device Boot Start End Blocks Id System
--------------------------------------------------------------------------------
[划分主分区]
Command (m for help): n #新建一个分区
Partition type:
p primary (0 primary, 0 extended, 4 free) #创建一个主分区
e extended #创建一个逻辑分区
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-20971519, default 2048): 2048 #默认从哪里开始划分
Last sector, sectors or size{K,M,G} (2048-20971519, default 20971519): 5G #指定划分5个GB
Partition 1 of type Linux and of size 5 GiB is set
Command (m for help): p #打印分区情况
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5b3d4ae9
Device Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 83 Linux #此处可看到一个主分区了
--------------------------------------------------------------------------------
[划分拓展分区]
Command (m for help): n #继续创建分区
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): e #这次选择创建逻辑分区
Partition number (2-4, default 2): 2 #默认从2开始
First sector (10487808-20971519, default 10487808): 10487808 #默认开始无需动
Last sector, sectors or size{K,M,G} (10487808-20971519, default 20971519): #由于是拓展分区,所以这里不能指定大小
Using default value 20971519
Partition 2 of type Extended and of size 5 GiB is set
Command (m for help): p
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5b3d4ae9
Device Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 83 Linux
/dev/sdb2 10487808 20971519 5241856 5 Extended #这里可以看到已经有一个拓展结构了,接下来分区
--------------------------------------------------------------------------------
[在拓展分区的基础上划分逻辑分区]
Command (m for help): n
Partition type:
p primary (1 primary, 1 extended, 2 free)
l logical (numbered from 5) #这里选择l新建逻辑分区
Select (default p): l
Adding logical partition 5
First sector (10489856-20971519, default 10489856): 10489856 #默认开始位置
Last sector, sectors or size{K,M,G} (10489856-20971519, default 20971519): #划分全部空间
Using default value 20971519
Partition 5 of type Linux and of size 5 GiB is set
Command (m for help): w #保存分区表并退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]#
4.接下来使用fdisk -l 可以查看分区情况
代码语言:javascript复制[root@localhost ~]# fdisk -l
Disk /dev/sda: 10.7 GB, 10737418240 bytes, 20971520 sectors #这是/dev/sda逻辑磁盘
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000cc3ff
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 20971519 9436160 8e Linux LVM
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors #这是/dev/sdb逻辑磁盘
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5b3d4ae9
Device Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 83 Linux #这就是刚刚划分的主分区
/dev/sdb2 10487808 20971519 5241856 5 Extended #这是拓展结构
/dev/sdb5 10489856 20971519 5240832 83 Linux #这是逻辑分区
磁盘分区命令-Parted
parted命令是由GNU组织开发的一款功能强大的磁盘分区和分区大小调整工具,与fdisk不同它支持调整分区的大小,作为一种设计用于Linux的工具,它没有构建成处理与fdisk关联的多种分区类型,但是它可以处理最常见的分区格式,包括:ext2、ext3、fat16、fat32、NTFS、ReiserFS、JFS、XFS、UFS、HFS以及Linux交换分区.
既然有fdisk为啥还出个parted分区呢? 1.parted命令可以划分单个分区大于2T的GPT格式的分区,也可以划分普通的MBR分区,fdisk命令对于大于2T的分区无法划分. 2.大于2.2TB的存储空间用fdisk不支持,需要采用parted来分区,所以用fdisk无法看到parted划分的GPT格式的分区.
◆parted常用参数◆
代码语言:javascript复制[root@localhost ~]# parted
GNU Parted 3.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) help
align-check TYPE N check partition N for TYPE(min|opt) alignment
help [COMMAND] print general help, or help on COMMAND
mklabel,mktable LABEL-TYPE 创建新的磁盘卷标(分区表)
mkpart PART-TYPE [FS-TYPE] START END 创建一个分区
name NUMBER NAME name partition NUMBER as NAME
print [devices|free|list,all|NUMBER] 打印当前分区信息
quit exit program
rescue START END rescue a lost partition near START and END
resizepart NUMBER END resize partition NUMBER
rm NUMBER 删除一个分区
select DEVICE 选择需要编辑的设备
disk_set FLAG STATE change the FLAG on selected device
disk_toggle [FLAG] toggle the state of FLAG on selected device
set NUMBER FLAG STATE change the FLAG on partition NUMBER
toggle [NUMBER [FLAG]] 切换分区表状态
unit UNIT set the default unit to UNIT
version display the version number and copyright information of GNU Parted
(parted)
◆parted 分区实例◆
1.磁盘参数解释
代码语言:javascript复制--------------------------------------------------------------------------------
[root@localhost ~]# parted /dev/sdb
GNU Parted 3.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
↓ 磁盘参数
Model: VMware, VMware Virtual S (scsi)
↓ 磁盘大小
Disk /dev/sdb: 10.7GB
↓ 扇区大小
Sector size (logical/physical): 512B/512B
Partition Table: msdos ← 分区表格式
Disk Flags:
1 2 3 4 5 6 7
Number Start End Size Type File system Flags
(parted)
1.Number:分区号
2.Start:分区起始位置,这里不再像fdisk用柱面表示,而是使用byte更加直观
3.End:分区结束位置
4.Size:分区大小
5.Type:分区类型
6.FileSystem:文件系统类型,parted不支持格式化成ext4,但能识别
7.标志(flags):分区标记
--------------------------------------------------------------------------------
2.将分区表格式修改成GPT
代码语言:javascript复制(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
(parted) mklabel msdos #原格式是mbr
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be
lost. Do you want to continue?
Yes/No? Yes
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt #新格式是gpe
Disk Flags:
Number Start End Size File system Name Flags
(parted)
3.创建一个分区
代码语言:javascript复制(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
(parted) mkpart #创建分区
Partition name? []? disk1 #分区名
File system type? [ext2]? ext2 #分区格式,parted只能创建ext2,这里我们出去格式化吧
Start? 1MB #磁盘开始位置
End? 2000MB #磁盘结束为止
(parted) print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 2000MB 1999MB ext2 disk1 #此处已创建完成
(parted) q
磁盘分区命令-Swap
swap命令用于创建交换空间(包括交换文件和交换分区)
代码语言:javascript复制[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 218M 112M 22M 5.1M 82M 69M
Swap: 1.0G 520K 1.0G
[root@localhost ~]# dd if=/dev/zero of=/tmp/swap bs=1024 count=100000
100000 0 records in
100000 0 records out
102400000 bytes (102 MB) copied, 2.6988 s, 37.9 MB/s
[root@localhost ~]# mkswap /tmp/swap
Setting up swapspace version 1, size = 99996 KiB
no label, UUID=7d7f22ed-466e-4205-8efe-1b6184dc5e1b
[root@localhost ~]# swapon /tmp/swap
swapon: /tmp/swap: insecure permissions 0644, 0600 suggested.
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 218M 109M 3.2M 2.8M 105M 75M
Swap: 1.1G 2.8M 1.1G
[root@localhost ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Sep 18 09:05:06 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=13d5ccc2-52db-4aec-963a-f88e8edcf01c /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
UUID=7d7f22ed-466e-4205-8efe-1b6184dc5e1b swap swap defaults 0 0
[root@localhost ~]# swapoff /tmp/swap
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 218M 109M 5.5M 2.8M 103M 75M
Swap: 1.0G 2.7M 1.0G
磁盘的挂载与自动挂载
◆格式化与挂载◆
1.首先格式化一个磁盘.
代码语言:javascript复制[root@localhost ~]# ll /dev/sd*
brw-rw---- 1 root disk 8, 0 Sep 21 07:26 /dev/sda
brw-rw---- 1 root disk 8, 1 Sep 21 07:26 /dev/sda1
brw-rw---- 1 root disk 8, 2 Sep 21 07:26 /dev/sda2
brw-rw---- 1 root disk 8, 16 Sep 21 07:50 /dev/sdb
brw-rw---- 1 root disk 8, 17 Sep 21 07:50 /dev/sdb1
brw-rw---- 1 root disk 8, 18 Sep 21 07:50 /dev/sdb2
brw-rw---- 1 root disk 8, 21 Sep 21 07:50 /dev/sdb5
[root@localhost ~]#
[root@localhost ~]# mkfs -t ext4 /dev/sdb1 #格式化一个磁盘
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
2.接着挂载这个磁盘
代码语言:javascript复制[root@localhost ~]# mkdir /sdb1 #创建挂载点
[root@localhost ~]# mount -t ext4 /dev/sdb1 /sdb1/ #将磁盘挂载
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 8.0G 1.3G 6.8G 16% /
devtmpfs 98M 0 98M 0% /dev
/dev/sda1 1014M 130M 885M 13% /boot
/dev/sdb1 4.8G 20M 4.6G 1% /sdb1 #这个就是我们的磁盘
◆分区的自动挂载◆
1.首先我们要查看指定磁盘的UUID号
代码语言:javascript复制[root@localhost ~]# ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 Sep 21 07:26 13d5ccc2-52db-4aec-963a-f88e8edcf01c -> ../../sda1
lrwxrwxrwx 1 root root 9 Sep 21 07:26 2018-05-03-20-55-23-00 -> ../../sr0
lrwxrwxrwx 1 root root 10 Sep 21 07:56 3439c4dd-d074-4900-a507-126e41b55e26 -> ../../sdb1 #此处就是我们sdb1的UUID
lrwxrwxrwx 1 root root 10 Sep 21 07:26 4604dcf2-da39-455a-9719-e7c5833e566c -> ../../dm-0
lrwxrwxrwx 1 root root 10 Sep 21 07:26 f6a4b420-aa6a-4e66-bbb3-c8e8280a099f -> ../../dm-1
2.打开/etc/fstab写入以下内容实现效果,这里千万别写错
代码语言:javascript复制[root@localhost ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Sep 18 09:05:06 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=13d5ccc2-52db-4aec-963a-f88e8edcf01c /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
UUID=3439c4dd-d074-4900-a507-126e41b55e26 /sdb1 ext4 defaults 0 0
--------------------------------------------------------------------------------
[说明]
1.设备文件名(UUID)
2.挂载点
3.文件系统类型
4.挂载特殊选项
5.是否备份: 0不备份 1每天备份 2不定期备份
6.是否检查磁盘状态: 0不检查 1启动时检查 2启动后检查
3.最后使用mount -a 测试是否能挂载上
代码语言:javascript复制[root@localhost ~]# mount -a
[root@localhost ~]#
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 8.0G 1.3G 6.8G 16% /
devtmpfs 98M 0 98M 0% /dev
tmpfs 110M 0 110M 0% /dev/shm
tmpfs 110M 5.5M 104M 5% /run
tmpfs 110M 0 110M 0% /sys/fs/cgroup
/dev/sda1 1014M 130M 885M 13% /boot
tmpfs 22M 0 22M 0% /run/user/0
/dev/sdb1 4.8G 20M 4.6G 1% /sdb1 #能说明成功