磁盘,提供持久的数据存储,它不像我们的内存,如果突然断电了,在内存中的数据一般都会被丢掉了,内存中的数据在保存的时候,会被写到硬盘里面,磁盘也是一种 I/O 设备。
我们都知道磁盘分区完成之后,还要进行格式化,这个格式化操作就是指定文件系统,文件系统的本质就是对一个存储设备上的元数据和数据就行组织,最终把数据有组织的放在可以长期存储的设备中。
本次博客主要是介绍可 linux 中的磁盘分区和文件系统管理。
IDE:一种较老的接口技术,价格低廉,兼容性强,传输速度可达 133MB/s;
SCSI:主要应用于中、高端服务器中,支持热拔插,价格较高,其中 UltraSCSI 可达 320MB/S,UltraSCSI640 可达 640MB/S;
SCSI 接口
SATA:主要用于 PC 上,串口硬盘,可达 6gbps;
SAS:是一种串行链接的 SCSI 接口技术,向下兼容 SATA,速度快;
USB:一种便携的存储设备,USB3.0 理论最大传输速度可达 500MB/s,现在最新的 USB3.1Gen 2 最高可达 10Gbps。
并口和串口的区别:
并口:同一线缆可以接多块设备,IDE 和 SCSI 为并口硬盘;
串口:同一线缆只可以接一个设备,SATA、SAS 和 USB 为串口,抗干扰能力强。
我们都知道作为 linux 的哲学思想之一,一切皆文件,在 linux 中使用设备文件来标识不同的硬盘,也就是设备的访问接口,在 Linux 中 I/O 设备分为 2 倍,字符设备和块设备,基于不同的功能进行分类的:
(1)字符设备:线性访问的,数据的交换单位是 "字符",提供的连续的数据流,不支持随机存取,举例来说,键盘、调制解调器都是典型的字符设备;
(2)块设备:可以提供随机访问,数据交换的单位是 "块",硬盘、CD-ROM 驱动器都是典型的块设备,应用可以寻址磁盘上的任何位置,并读取数据。
在 Linux 系统中,c 代表字符设备,b 为块设备(红色部分标识)。
后面黄色标注的两行为设备号:
主设备号:左列,区分设备类型,用于标明设备所需要的驱动程序;
次设备号:右列,区分同种类型下的不同的设备。
mknod 命令
mknod 可以创建设备文件,格式如下:
- mknod[OPTION]...NAME TYPE[MAJOR MINOR]选项: - m MODE:创建后的设备文件的访问权限
- mknod / dev / ttyUSB32 c 188 32
linux 的设备文件都是放在 / dev 目录下的,应用程序可以通过这些设备文件完成都设备的读写等操作。之前写过设备都有主次设备号,linux 有约定俗成的编号,如硬盘的主设备号在 centos6 和 7 中为 8:
根据接口类型的不同,设备的文件名命令也有一些规定,在 centos 如下:
在引用设备的时候可以通过以下三种方式:
1. 设备文件名,也就是 / dev 目录下的文件名;
2. 系统卷标(volume label);
3.UUID,唯一表示码,能够唯一的表示一个设备。
一块磁盘是可以被分割成多个分区,从 Windows 的角度来看,就是 C,D,E 分区。磁盘分区的方式有 MBR 和 GPT。
MBR(Master Boot Record)
总共大小为 512 字节,存在于磁盘的第 0 个扇区。
446bytes:引导启动操作系统的程序;
64bytes:分区表,每 16bytes 标识一个分区,一共能够有 4 个主分区,但是如果想划分更多的区,可以指定扩展分区,比如分为 3 个主分区,一个扩展分区,而扩展分区可以划分为若干个逻辑分区。
综上所述,如果使用 MBR 分区,就必须至少有一个扩展分区,然后将扩展分区分成逻辑分区,逻辑分区的序号从 5 开始。
GPT(GUID Partition Table):
MBR 是另一种分区方式:
1):GPT 分区表中最多可以支持 128 个主分区
2):突破了 MBR 单个分区只能是 2.2T 的限制,最大支持 1EB 容量
在 GPT 中主分区、扩展分区和模糊分区的概念就淡化了很多。
fidisk
1. 查看磁盘分区
- fdisk - l device...:查看指定磁盘设备的分区情况
2. 管理分区
fdisk 为 MBR 方式的分区工具,提供了交互式的接口来管理分区所有的操作,都是在内存中完成的,当使用 w 保存的时候,才真正去创建或修改分区。
- fdisk device
我们来试试,可以看到使用 fdisk 加设备名,就进入到了一个交互式的界面,输入 m 即可获得帮助:
- [root@localhost~]#fdisk / dev / sdb欢迎使用fdisk(util - linux 2.23.2)。更改将停留在内存中,直到您决定将更改写入磁盘。使用写入命令前请三思。Device does not contain a recognized partition table使用磁盘标识符0x3918c6ef创建新的DOS磁盘标签。命令 (输入m获取帮助):m命令操作a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition <= ======删除已有分区g create a new empty GPT partition table G create an IRIX(SGI) partition table l list known partition types <= =====列出已知的分区类型m print this menu <= ======查看帮助信息n add a new partition <= ======创建新的分区o create a new empty DOS partition table p print the partition table <= =====显示现有分区信息q quit without saving changes <= =====不保存退出s create a new empty Sun disklabel t change a partition 's system id <========修改分区类型
- u change display/entry units
- v verify the partition table
- w write table to disk and exit <========保存并退出
- x extra functionality (experts only)'
举个例子:现在新加了一块 120G 的磁盘,分为 3 个主分区,每个区 20G,余下的空间都给扩展分区并添加一个 20G 的逻辑分区。
- [root@localhost~]#fdisk / dev / sdb欢迎使用fdisk(util - linux 2.23.2)。更改将停留在内存中,直到您决定将更改写入磁盘。使用写入命令前请三思。Device does not contain a recognized partition table使用磁盘标识符0x3918c6ef创建新的DOS磁盘标签。命令 (输入m获取帮助):n Partition type: p primary(0 primary, 0 extended, 4 free) e extended Select(
- default p):
- p分区号 (1 - 4,默认1):1起始扇区 (2048 - 251658239,默认为2048):将使用默认值2048 Last扇区,
- +扇区or + size {
- K,
- M,
- G
- } (2048 - 251658239,默认为251658239): + 20G分区1已设置为Linux类型,大小设为20 GiB命令 (输入m获取帮助):n Partition type: p primary(1 primary, 0 extended, 3 free) e extended Select(
- default p):
- p分区号 (2 - 4,默认2):2起始扇区 (41945088 - 251658239,默认为41945088):将使用默认值41945088 Last扇区,
- +扇区or + size {
- K,
- M,
- G
- } (41945088 - 251658239,默认为251658239): + 20G分区2已设置为Linux类型,大小设为20 GiB命令 (输入m获取帮助):n Partition type: p primary(2 primary, 0 extended, 2 free) e extended Select(
- default p):
- p分区号 (3, 4,默认3):起始扇区 (83888128 - 251658239,默认为83888128):将使用默认值83888128 Last扇区,
- +扇区or + size {
- K,
- M,
- G
- } (83888128 - 251658239,默认为251658239): + 20G分区3已设置为Linux类型,大小设为20 GiB命令 (输入m获取帮助):n Partition type: p primary(3 primary, 0 extended, 1 free) e extended Select(
- default e):
- e已选择分区4起始扇区 (125831168 - 251658239,默认为125831168):将使用默认值125831168 Last扇区,
- +扇区or + size {
- K,
- M,
- G
- } (125831168 - 251658239,默认为251658239):将使用默认值251658239分区4已设置为Extended类型,大小设为60 GiB命令 (输入m获取帮助):n All primary partitions are in use添加逻辑分区5起始扇区 (125833216 - 251658239,默认为125833216):将使用默认值125833216 Last扇区,
- +扇区or + size {
- K,
- M,
- G
- } (125833216 - 251658239,默认为251658239): + 20G分区5已设置为Linux类型,大小设为20 GiB
查看分区情况:
- [root@localhost~]#fdisk - l / dev / sdb磁盘 / dev / sdb:128.8 GB,
- 128849018880字节,251658240个扇区Units = 扇区of 1 * 512 = 512 bytes扇区大小 (逻辑 / 物理):512字节 / 512字节I / O大小 (最小 / 最佳):512字节 / 512字节磁盘标签类型:dos磁盘标识符:0x3918c6ef设备Boot Start End Blocks Id System / dev / sdb1 2048 41945087 20971520 83 Linux / dev / sdb2 41945088 83888127 20971520 83 Linux / dev / sdb3 83888128 125831167 20971520 83 Linux / dev / sdb4 125831168 251658239 62913536 5 Extended / dev / sdb5 125833216 167776255 20971520 83 Linux
parted
这个工具既可以做 MBR 的分区,又可以做 GPT 的分区,主要时候用来做 GPT 的。
1. 查看分区情况:
- parted - l device(亲测:竟然也可以使用fdisk - l指定设备查看)
2. 管理分区
parted 也提供了交互式的接口来管理分区,输入 help 查看帮助,我们来看一下:
- [root@localhost~]#parted GNU Parted 3.1使用 / 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 create a new disklabel(partition table) mkpart PART - TYPE[FS - TYPE] START END make a partition name NUMBER NAME name partition NUMBER as NAME print[devices | free | list, all | NUMBER] display the partition table,
- available devices,
- free space,
- all found partitions,
- or a particular partition quit exit program rescue START END rescue a lost partition near START and END rm NUMBER delete partition NUMBER select DEVICE choose the device to edit 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]] toggle the state of FLAG on partition NUMBER unit UNIT set the
- default unit to UNIT version display the version number and copyright information of GNU Parted(parted)
- (parted) select / dev / sdc使用 / dev / sdc
2)选择分区格式为 GPT
- mklabel gpt
下面是命令的使用帮助
- (parted) help mklabel mklabel,
- mktable LABEL - TYPE create a new disklabel(partition table)"标签类型"是以下任意一项:aix,
- amiga,
- bsd,
- dvh,
- gpt,
- mac,
- msdos,
- pc98,
- sun,
- loop
3)使用 mkpart 分区时,不需要指定分区的数字标识(在 MBR 中可能要指定 1-4 或更多),可以直接给它加上名称,这说明在 GPT 分区的情况下,主分区扩展分区已经变得不那么重要了,分区的起始点最好从 1 开始
- (parted) mkpart分区名称? [] ? my_data1文件系统类型? [ext2] ? #文件系统先不用管,后面会讲到起始点?1#结束点?2048#默认为M
4)这样一个分区就创建好了,可以使用 print 查看
- (parted) print Model: ATA VMware Virtual I(scsi) Disk / dev / sdc: 53.7GB Sector size(logical / physical) : 512B / 512B Partition Table: gpt Disk Flags: Number Start End Size File system Name标志1 1049kB 2048MB 2047MB my_data1
5)让我们再来新建一个分区,新建分区的起始点就是上一个分区的结束点
- (parted) mkpart分区名称? [] ? my_data2文件系统类型? [ext2] ? 起始点?2048结束点?4096(parted)(parted) print Model: ATA VMware Virtual I(scsi) Disk / dev / sdc: 53.7GB Sector size(logical / physical) : 512B / 512B Partition Table: gpt Disk Flags: Number Start End Size File system Name标志1 1049kB 2048MB 2047MB my_data1 2 2048MB 4096MB 2048MB my_data2
6)作为 linux 的哲学思想之一,避免与用户交互,我们也可以使用以下方式来创建新的分区
- (parted) mkpart my_data3 4096 6144(parted)(parted) print Model: ATA VMware Virtual I(scsi) Disk / dev / sdc: 53.7GB Sector size(logical / physical) : 512B / 512B Partition Table: gpt Disk Flags: Number Start End Size File system Name标志1 1049kB 2048MB 2047MB my_data1 2 2048MB 4096MB 2048MB my_data2 3 4096MB 6144MB 2048MB my_data3
7)parted 使用 quit 退出即生效
- (parted) quit信息: You may need to update / etc / fstab. [root@localhost~]#
- [root@localhost~]#cat / proc / partitions major minor#blocks name 8 16 125829120 sdb 8 17 20971520 sdb1 8 18 20971520 sdb2 8 19 20971520 sdb3 8 20 1 sdb4 8 21 20971520 sdb5 8 32 52428800 sdc 8 33 1998848 sdc1 8 34 1999872 sdc2 8 35 1999872 sdc3 8 0 20971520 sda 8 1 512000 sda1 8 2 20458496 sda2 11 0 4277248 sr0 253 0 16261120 dm - 0 253 1 2097152 dm - 1 253 2 2097152 dm - 2
如果没有识别可以使用以下两种方式通知内核强制重读磁盘分区表:
- partx - a device kpartx - af device
如果命令一次不能成功,请多试几次。
磁盘分区完成之后,还要进行格式化,这个格式化操作就是指定文件系统,文件系统的本质就是对一个存储设备上的元数据和数据就行组织,最终把数据有组织的放在可以长期存储的设备中。
传统的说法是一个分区只能格式化成一种文件系统,但是由于新技术的产生,LVM 或者 RAID,一个分区可以被格式化成多个文件系统,也可以将多个分区格式格式化成一个文件系统。
数据一般分为实际的数据(实际的数据,一首 mp3)和元数据(文件的属性和权限等),它们在文件系统中存放的位置是不同的。实际的数据是存储在 data block 中,元数据则是存储在 innode 中,除此之外还有一个 superblock。
superblock:记录了文件系统的整体信息,包括 innode/block 的总量、使用量和剩余量和文件系统的格式等
inode:记录文件的属性,一个文件占一个 inode,同时也记录了文件所在的 block 号
block:实际记录文件的内容,若文件大小大于 block,则占用多个 block 块
下面就来讲一下 inode 和 block 之间的关系:
1. 索引式文件系统
若一个文件的 inode 号是 4,此中存放了其 block 的位置:2,7,13,15,那么操作系统读取数据的时候,就可以根据 inode 中 block 的位置一次性将数据读取出来。
2. 链式文件系统
和索引式文件系统不同的是莲式读取文件方式,常见于 U 盘的 FAT 格式,这种文件系统没有 inode 的存在,每个 block 的号码都记录在前一个 block 中。
3. 磁盘重组
磁盘重组的目的就是将写在磁盘中离散的 block 重新组织一下,将同一个文件的 block 块集合在一起,以便于数据的读取。导致数据离散的原因,一般是由于文件系统使用的时间过长,非常多次的数据的操作,比如删除、增加和修改的次数很多。
- Linux的文件系统: ext2(无日志功能),
- ext3,
- ext4,
- xfs,
- reiserfs,
- btrfs光盘:iso9660网络文件系统:nfs,
- cifs集群文件系统:gfs2,
- ocfs2内核级分布式文件系统:ceph windows的文件系统:vfat,
- ntfs伪文件系统:proc,
- sysfs,
- tmpfs,
- hugepagefs Unix的文件系统:UFS,FFS,JFS交换文件系统:swap用户空间的分布式文件系统:mogilefs,
- moosefs,
- glusterfs
EXT2 是一种比较旧的文件系统了,从 Centos7 开始文件系统已经开始使用了 XFS,但是这种使用 inode 为基础的文件系统还是要了解的,毕竟后面也出现了它的升级版本,EXT3 和 EXT4。
前面说过 inode 记录是文件的权限和属性,inode 和 block 在文件系统创建好之后就已经分好了的,但是我们想一想,如果一个硬盘有 500G 甚至更大,inode 和 block 都放在一起就会显得不是很合理,数量过大,不容易去管理。所有在 EXT2 文件系统中在格式化的时候将文件系统分为多个区块,称为 block group,每个 block group 都有自己的 block/inode/superblock。
下面我们就来看看一个 block group 的大致样子:
在文件系统的最前面有一个 Boot Sector,可以安装开机管理程序,这样我们就能将不同的开机管理程序安装在个别的文件系统之前,而不用覆盖整个磁盘的 MBR,这样就能做出多重开机的环境。
block group 的内容:
date block:用来放置文件内容的地方,大小一般为 1k、2k、4k,block 的大小在格式化之后就不能再改变了,每个 block 就能存放一个文件的数据。
inode table:记录了文件的权限,文件的大小,时间戳,flag 或者该文件的真正指向
superblock:block 和 inode 的数量信息,文件系统的时间戳,一个有效比特,该值为 0 代表已经被挂载,该值为 1 则没有被挂载
Filesystem Description:文件系统描述说明,描述了每个 block group 的开始和结束的 block 号码,已经说明了 superblock\bitmap\inodemap\data block 分别在哪个一个 block 号码之间。
block bitmap:block 位图,记录 block 的使用情况,标明了哪些 block 是空的,我们在删除的文件的时候,会发现很快,删除文件操作其实就是改变了该文件占用的 bitmap 的位置为空,block 的文件暂时没有删除,这就是我们的数据可以被找回的原因
inode bitmap:inode 位图,与 block bitmap 的功能类似,记录的是使用与未使用的 inode 号码。
文件系统会给目录分配至少一个 block,inode 记录了权限和属性以及分配到的 block 号,而 block 则记录了这个目录下的文件名与该文件名所占用的 inode 号码。
下面描述读取一个目录下文件的流程:
举例:root 读取 / tmp/test.txt 文件的过程:
1./ 的 inode:通过挂载点信息找到 inode 号码为 128 的根目录的 inode,取得权限和 block 号
2./ 的 block:根据 block 的号码,查看 block 的内容,找到目录 tmp / 的文件名和其 inode 号
3.tmp / 的 inode:根据 inode,获取权限信息和 block 号
4.tmp / 的 block:查看对应的 block 的内容,找到 test.txt 的 inode 号
5.test.txt 的 inode 号:根据 inode,获取权限信息和对应的 block 号
6.test.txt 的 block:获取文件的实际内容
数据存放区域:inode table,data block
metadata:中介数据,变化次数频繁,superblock,block bitmap 和 inode bitmap
新增一个文件的过程:
1. 根据目录文件的 inode 确定用户是否有权限
2. 根据 inode 位图找到没有使用的 inode 号,在 inode table 写入权限等信息
3. 根据 block 位图找到没有使用的 block 号,在 block 中写入实际数据,更新到 inode 中去
4. 更新 inode 位图和 block 位图,并更新到 superblock 中
一般一个完整的新建文件的过程就如上
但是但是出现特殊情况,比如断电,可能会出现数据仅仅写到了 inode table 和 block 中却没有更新 inode 位图和 block 位图,也没有更新 superblock,那就导致中介数据和真正存储数据的内容不一致。
在 EXT2 中,要使用 e2fsck 这个工具,要遍历整个文件系统,!!不敢想象啊!
所以就出现了日志式文件系统:
在文件系统中又单独划分一个区块,记录了写入或修改文件时的信息
1. 当要写入一个文件的时候,就在日志区块记录一下某个文件要写入了
2. 写入文件的数据,更新 metadata 数据
3. 完成数据和 metadate 的更新,在日志记录区块当中完成对该文件的记录
这样,当发生意外的时候,我们可以直接检查日志记录区块,查看哪些文件有问题,然后做出校验即可
EXT2 不支持日志式文件系统,EXT3 和 EXT4 都支持日志式文件系统,并向下兼容 EXT2
VFS(Virtual Filesystem Switch),linux 系统通过 VFS 的核心功能去读取文件系统。
比如 / 是使用的是 / dev/sda1,其文件系统是 ext2 格式的,而 / home 使用的 / dev/sda2,其格式为 xfs,如果我们现在要读取 / home/Frank, 直接 cat 就行了,我们有指定要用什么文件系统的模块去读取吗?没有,这个就是 VFS 的功能,VFS 可以管理所有的 filesystem,示意图如下:
硬链接和符号链接都是都是链接文件,用 "l" 表示
(红色为符号链接标识 l,黄色为引用计数)
- ln源文件链接文件
我们来看一下如下:
- [root@localhost~]#ls - l / etc / |grep "fstab" - rw - r--r--.1 root root 541 7月16 04 : 37 fstab为其创建一个链接
为其创建一个链接
- [root@localhost~]#ln / etc / fstab / tmp / fstab.link
引用计数变为了 2
- [root@localhost~]#ls - l / etc / |grep "fstab" - rw - r--r--.2 root root 541 7月16 04 : 37 fstab
再去看一下 / tmp 下的链接文件
- [root@localhost~]#ls - l / tmp / |grep "link" - rw - r--r--.2 root root 541 7月16 04 : 37 fstab.link
cat 一下内容,因为指向的是 inode,所有即使你删除了源文件,通过符号链接还是读取文件内容:
- [root@localhost~]#cat / tmp / fstab.link## / etc / fstab#Created by anaconda on Sun Jul 16 04 : 37 : 14 2017##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 / cl - root / xfs defaults 0 0 UUID = ee087898 - 527c - 41b0 - 85f6 - 3880e6bf0b73 / boot xfs defaults 0 0 / dev / mapper / cl -
- var /
- var xfs defaults 0 0 / dev / mapper / cl - swap swap swap defaults 0 0
符号链接
指向一个文件路径的另一个文件路径
特性:符号链接与文件两个各自是独立的文件,各有自己的 inode,对文件创建符号链接不会增加引用计数
支持对目录创建符号链接,可以跨文件系统,删除原文件,符号链接指定的路径就不存在了,此时变成了无效链接:
- ln - s源文件链接文件
- [root@localhost~]#touch frank.txt[root@localhost~]#echo "hello" > . / frank.txt[root@localhost~]#cat frank.txt hello
创建符号链接:
- [root@localhost~]#ln - s frank.txt frank.link
查看符号链接:
删除原文件后,符号填充色变黑,原文件名闪烁:
写了这么些文件系统的基础知识,应该可以大致理解文件系统是什么个东西了,下面我们就开始介绍如何管理和使用文件系统。
- mkfs.文件系统格式device文件系统格式:mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat
举例:将 / dev/sdb1 格式化为 ext4 格式
- [root@localhost~]#mkfs.ext4 / dev / sdb1 mke2fs 1.42.9(28 - Dec - 2013)文件系统标签 = OS type: Linux块大小 = 4096(log = 2)分块大小 = 4096(log = 2) Stride = 0 blocks,
- Stripe width = 0 blocks 1310720 inodes,
- 5242880 blocks 262144 blocks(5.00 % ) reserved
- for the super user第一个数据块 = 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: 完成正在写入inode表: 完成Creating journal(32768 blocks) : 完成Writing superblocks and filesystem accounting information: 完成
也可以使用:
- mkfs - t文件系统格式device
举例:将 / dev/sdb1 格式化为 ext3 格式
- [root@localhost~]#mkfs - t ext3 / dev / sdb1 mke2fs 1.42.9(28 - Dec - 2013)文件系统标签 = OS type: Linux块大小 = 4096(log = 2)分块大小 = 4096(log = 2) Stride = 0 blocks,
- Stripe width = 0 blocks 1310720 inodes,
- 5242880 blocks 262144 blocks(5.00 % ) reserved
- for the super user第一个数据块 = 0 Maximum filesystem blocks = 4294967296 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: 完成正在写入inode表: 完成Creating journal(32768 blocks) : 完成Writing superblocks and filesystem accounting information: 完成
mke2fs
创建一个 ext2 或 ext3 或 ext4 的文件系统,和 mkfs 命令类似
- mke2fs[OPTIONS] device常用选项: - t {
- ext2 | ext3 | ext4
- }:指明要创建的文件系统类型 - b {
- 1024 | 2048 | 4096
- }:指明文件系统的块大小; - L LABEL:指明系统卷标; - j:创建有日志功能的文件系统ext3; - i#:bytes - per - inode,指明inode与字节的比率;即每多少字节创建一个Indode; - N#:直接指明要给此文件系统创建的inode的数量; - m#:指定预留的空间,百分比;
也可以使用 - O 选项,指定特性,具体指定的各种 feature 可以使用命令 "man 5 ext4" 查看
- mke2fs - O feature device
- [root@localhost~]#mke2fs - t ext4 - L my_data / dev / sdb1 mke2fs 1.42.9(28 - Dec - 2013)文件系统标签 = my_data OS type: Linux块大小 = 4096(log = 2)分块大小 = 4096(log = 2) Stride = 0 blocks,
- Stripe width = 0 blocks 1310720 inodes,
- 5242880 blocks 262144 blocks(5.00 % ) reserved
- for the super user第一个数据块 = 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: 完成正在写入inode表: 完成Creating journal(32768 blocks) : 完成Writing superblocks and filesystem accounting information: 完成
- [root@localhost~]#e2label / dev / sdb1 my_data
设定:
- [root@localhost~]#e2label / dev / sdb2 mydata2[root@localhost~]# [root@localhost~]#e2label / dev / sdb2 mydata2
- tune2fs[OPTIONS] DEVICE - l:查看super block的信息修改文件系统的属性: - j:修改文件系统 - L LABEL: 修改卷标 - m#:调整预留空间百分比 - O[ ^ ] FEATURE:开启或关闭某种特性 - o[ ^ ] mout_options:开启或关闭某种默认挂载选项,比如开启acl - o acl或者关闭 - o ^ acl
- blkid device blkid - L LABEL:根据LABEL定位设备blkid - U UUID:根据唯一表示号定位设备
举例
- [root@localhost~]#blkid / dev / sdb1 / dev / sdb1: LABEL = "my_data"UUID = "0557dfda-a2ab-4d75-93be-38f84c6663a1"TYPE = "ext4"
因进程意外终止或者系统崩溃的时候,可能会造成文件损坏,此时应该检查并修复文件系统,建立离线修复。
- e2fsck[OPTIONS] device - y:对所有问题自动回答yes - f:即使文件系统处于clean状态,也要强制检查,clean说明文件系统没有问题,反之为dirty
fsck
- - t fstype:指名文件系统 - a:无须交互而自动修复所有的错误 - r:交互式修复
也可以使用以下格式:
- [root@localhost~]#fsck fsck fsck.cramfs fsck.ext3 fsck.fat fsck.msdos fsck.xfs fsck.btrfs fsck.ext2 fsck.ext4 fsck.minix fsck.vfat[root@localhost~]#fsck.ext2 / dev / sdb1
在 centos7 上,默认使用的文件系统是 xfs,centos6 默认不可以格式化分区为 xfs 文件系统,可以安装其文件系统驱动,在 centos6 安装:
- [root@localhost~]#yum - y install xfsprogs
举例:现在要把分区 sdb5 转换为支持 swap 文件系统
- [root@localhost~]#fdisk / dev / sdb欢迎使用fdisk(util - linux 2.23.2)。更改将停留在内存中,直到您决定将更改写入磁盘。使用写入命令前请三思。命令 (输入m获取帮助):t分区号 (1 - 5,默认5):5 Hex代码 (输入L列出所有代码):l 0空24 NEC DOS 81 Minix / 旧Linu bf Solaris 1 FAT12 27隐藏的NTFS Win 82 Linux交换 / So c1 DRDOS / sec(FAT - 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS / sec(FAT - 3 XENIX usr 3c PartitionMagic 84 OS / 2隐藏的C: c6 DRDOS / sec(FAT - 4 FAT16 < 32M 40 Venix 80286 85 Linux扩展c7 Syrinx 5扩展41 PPC PReP Boot 86 NTFS卷集da非文件系统数据6 FAT16 42 SFS 87 NTFS卷集db CP / M / CTOS / .7 HPFS / NTFS / exFAT 4d QNX4.x 88 Linux纯文本de Dell工具8 AIX 4e QNX4.x第2部分8e Linux LVM df BootIt 9 AIX可启动4f QNX4.x第3部分93 Amoeba e1 DOS访问a OS / 2启动管理器50 OnTrack DM 94 Amoeba BBT e3 DOS R / O b W95 FAT32 51 OnTrack DM6 Aux 9f BSD / OS e4 SpeedStor c W95 FAT32(LBA) 52 CP / M a0 IBM Thinkpad休eb BeOS fs e W95 FAT16(LBA) 53 OnTrack DM6 Aux a5 FreeBSD ee GPT f W95扩展 (LBA) 54 OnTrackDM6 a6 OpenBSD ef EFI(FAT - 12 / 16 / 10 OPUS 55 EZ - Drive a7 NeXTSTEP f0 Linux / PA - RISC 11隐藏的FAT12 56 Golden Bow a8 Darwin UFS f1 SpeedStor 12 Compaq诊断5c Priam Edisk a9 NetBSD f4 SpeedStor 14隐藏的FAT16 < 3 61 SpeedStor ab Darwin启动f2 DOS次要16隐藏的FAT16 63 GNU HURD or Sys af HFS / HFS + fb VMware VMFS 17隐藏的HPFS / NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE 18 AST智能睡眠65 Novell Netware b8 BSDI swap fd Linux raid自动1b隐藏的W95 FAT3 70 DiskSecure多启bb Boot Wizard隐fe LANstep 1c隐藏的W95 FAT3 75 PC / IX be Solaris启动ff BBT Hex代码 (输入L列出所有代码):82已将分区"Linux"的类型更改为"Linux swap / Solaris"命令 (输入m获取帮助):w The partition table has been altered ! Calling ioctl() to re - read partition table.正在同步磁盘。
再来查看 sdb 的分区情况
- [root@localhost~]#fdisk - l / dev / sdb磁盘 / dev / sdb:128.8 GB,
- 128849018880字节,251658240个扇区Units = 扇区of 1 * 512 = 512 bytes扇区大小 (逻辑 / 物理):512字节 / 512字节I / O大小 (最小 / 最佳):512字节 / 512字节磁盘标签类型:dos磁盘标识符:0x3918c6ef设备Boot Start End Blocks Id System / dev / sdb1 2048 41945087 20971520 83 Linux / dev / sdb2 41945088 83888127 20971520 83 Linux / dev / sdb3 83888128 125831167 20971520 83 Linux / dev / sdb4 125831168 251658239 62913536 5 Extended / dev / sdb5 125833216 167776255 20971520 82 Linux swap / Solaris
- ~]#mkfs.vfat device
文件系统创建完毕之后,想要使用,就必须要挂载到指定的位置。
根文件系统之外的其他系统想要能够被访问,就必须挂载在根文件系统上的某一个目录上,而此目录被称为挂载点。
挂载点:一个文件系统的访问入口,它有以下特性:
1. 目录必须实现存在
2. 应该使用未被或者不会被其他进程使用的目录
3. 挂载点下原有的文件会被隐藏
mount
挂载文件系统
- mount[ - nrw][ - t vfstype][ - o options] device dir命令选项: - r:readonly,只读挂载; - w:read and write,
- 读写挂载; - n:默认情况下,设备挂载或卸载的操作会同步更新至 / etc / mtab文件中; - n用于禁止此特性; - t vfstype:指明要挂载的设备上的文件系统的类型;多数情况下可省略,此时mount会通过blkid来判断要挂载的设备的文件系统类型; - L LABEL:挂载时以卷标的方式指明设备;mount - L LABEL dir - U UUID:挂载时以UUID的方式指明设备;mount - U UUID dir - o options:挂载选项sync / async:同步 / 异步操作;atime / noatime:文件或目录在被访问时是否更新其访问时间戳;diratime / nodiratime:目录在被访问时是否更新其访问时间戳;remount:重新挂载;acl:支持使用facl功能;#mount - o acl device dir#tune2fs - o acl device ro:只读rw:读写dev / nodev:此设备上是否允许创建设备文件;exec / noexec:是否允许运行此设备上的程序文件;auto / noauto:user / nouser:是否允许普通用户挂载此文件系统;suid / nosuid:是否允许程序文件上的suid和sgid特殊权限生效;defaults:Use
- default options:
- rw,
- suid,
- dev,
- exec,
- auto,
- nouser,
- async,
- and relatime.
举例: 将 / dev/sdb1 挂载到 / mnt 目录下
- [root@localhost~]#mount / dev / sdb1 / mnt / [root@localhost~]#df - l文件系统1K - 块已用可用已用 % 挂载点 / dev / mapper / cl - root 16250880 3542180 12708700 22 % /
- devtmpfs 1000180 0 1000180 0% /dev tmpfs 1016076 84 1015992 1 % /dev/shm tmpfs 1016076 9116 1006960 1 % /run
- tmpfs 1016076 0 1016076 0% /sys / fs / cgroup / dev / sdb1 20511312 45080 19401272 1 % /mnt
- /dev / sda1 508580 151316 357264 30 % /boot
- /dev / mapper / cl -
- var 2086912 427172 1659740 21 % /var
- tmpfs 203216 16 203200 1% /run / user / 42 tmpfs 203216 0 203216 0 % /run/user / 0
三种方式:
- #mount#cat / etc / mtab#cat / proc / mounts
- umount device / dir#指定设备名和目录都可以
注意:
如果挂载点下有文件被访问,我们无法卸载
可以使用以命令来查看哪些进程占用了挂载点:
- lsof MOUNT_POINT fuser - v MOUNT_POINT
并可以使用如下面命令,强制终止所有正在访问的某挂载点
- fuser - km MOUNT_POINT
交换分区的启用和禁用
交换分区不需要挂载。
创建交换分区:
- mkswap device#将指定的分区创建支持swap格式的文件系统,也可以进入fdisk的交互模式下,使用t选项
- swapon[OPTION][DEVICE] - a:定义在 / etc / fstab文件中的所有swap设备;
禁用:
- swapoff device
- [root@localhost mnt]#cat / proc / swaps Filename Type Size Used Priority / dev / dm - 1 partition 2097148 0 - 1 / dev / sdb5 partition 20971516 0 - 2
- [root@localhost~]#cat / etc / fstab## / etc / fstab#Created by anaconda on Sun Jul 16 04 : 37 : 14 2017##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 / cl - root / xfs defaults 0 0 UUID = ee087898 - 527c - 41b0 - 85f6 - 3880e6bf0b73 / boot xfs defaults 0 0 / dev / mapper / cl -
- var /
- var xfs defaults 0 0 / dev / mapper / cl - swap swap swap defaults 0 0
从左到右分为 6 个字段:
(1)要挂载的设备,可以使用设备文件,卷标和 UUID
(2)挂载点,swap 类型的设备文件挂载点为 swap
(3)文件系统类型
(4)挂载选项:defaults 为默认挂载选项,多个挂载选项之间用逗号隔开
(5)转储频率:0:从不备份,1:每天备份,2:每隔一天备份
(6)自检次序:0:不自检,1:首先自检,只能是根文件系统,2,次级自检,以此类推
可以使用 mount -a:自动挂载在此文件中所支持的自动挂载设备
举个例子:将系统光盘自动挂载在 / mnt 目录下,使其开机自动挂载:
- [root@localhost~]#vim / etc / fstab## / etc / fstab#Created by anaconda on Sun Jul 16 04 : 37 : 14 2017##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 / cl - root / xfs defaults 0 0 UUID = ee087898 - 527c - 41b0 - 85f6 - 3880e6bf0b73 / boot xfs defaults 0 0 / dev / mapper / cl -
- var /
- var xfs defaults 0 0 / dev / mapper / cl - swap swap swap defaults 0 0 / dev / sr0 / mnt iso9660 defaults 0 0
- [root@localhost~]#df文件系统1K - 块已用可用已用 % 挂载点 / dev / mapper / cl - root 16250880 3542224 12708656 22 % /
- devtmpfs 1000180 0 1000180 0% /dev tmpfs 1016076 84 1015992 1 % /dev/shm tmpfs 1016076 9116 1006960 1 % /run
- tmpfs 1016076 0 1016076 0% /sys / fs / cgroup / dev / sr0 4276440 4276440 0 100 % /mnt
- /dev / sda1 508580 151316 357264 30 % /boot
- /dev / mapper / cl -
- var 2086912 427160 1659752 21 % /var
- tmpfs 203216 12 203204 1% /run / user / 42 tmpfs 203216 0 203216 0 % /run/user / 0
df
报告文件系统磁盘的使情况
- df[OPTIONS] file - l:显示本地文件的相关信息 - h:以human_readabel的方式显示 - i:显示inode的使用状态,而不是block
- [root@localhost~]#df - l文件系统1K - 块已用可用已用 % 挂载点 / dev / mapper / cl - root 16250880 3542172 12708708 22 % /
- devtmpfs 1000180 0 1000180 0% /dev tmpfs 1016076 84 1015992 1 % /dev/shm tmpfs 1016076 9112 1006964 1 % /run
- tmpfs 1016076 0 1016076 0% /sys / fs / cgroup / dev / sda1 508580 151316 357264 30 % /boot
- /dev / mapper / cl -
- var 2086912 426924 1659988 21 % /var
- tmpfs 203216 12 203204 1% /run / user / 42 tmpfs 203216 0 203216 0 % /run/user / 0
- [root@localhost~]#df - l / mnt / CentOS_BuildTag#查看某个文件属于哪个文件系统文件系统1K - 块已用可用已用 % 挂载点 / dev / sr0 4276440 4276440 0 100 % /mnt/
dd
- if = FILE:从FILE读而不是标准输入of = FILE:写到FILE里去,而不是标准输出ibs = BYTES: 一次读取BYTES个字节obs = BYTES:一次写BYTES个字节bs = BYTES:一次性读写BYTES个字节skip = blocks: 在拷贝之前,跳过输出文件的前blocks个块,每块大写为ibs个字节seek = blocks:在拷贝之前,跳过输出文件的前blocks块,每块大小为obs - byte字节count = blocks:只拷贝输入文件的前blocks块(每块的大小为ibs - byte字节),而不是全部内容,直到文件末尾。
举例:
1. 将本地的 / dev/sda 整盘备份到 / dev/sdb 中
- dd
- if = /dev/sda of = /dev/sdb
2. 将 / dev/sda 整盘保存到 / root/my_sda
- dd
- if = /dev/sda of = /root/my_sda
3. 备份 MBR
- dd
- if = /dev/sda of = /root/my_mbr count = 1 bs = 512
一个好玩的设备文件 / dev/zero,是一个输入设备,它可以向外面不断的吐 0,另外的一个设备文件是 / dev/null,它像一个无底洞一样,可以吞噬一切数据。
4. 格式化硬盘
- dd
- if = /dev/zero of = /dev/sda bs = 512 count = 1
查看当前指定的文件或目录占磁盘空间的大小,会递归显示
- du[OPTIONS] file - a: 显示对所有文件的统计,而不只是包含子目录。 - b: 输出以字节为单位的大小,替代缺省时1024字节的计数单位。--block - size = size:输出以块为单位的大小,块的大小为size字节。 (file - utils - 4.0的新选项) - h:为每个数附加一个表示大小单位的字母,象用M表示二进制的兆字节。 - k:输出以1024字节为计数单位的大小。 - m:输出以兆字节的块为计数单位的大小 (就是1, 048, 576字节)。--max - depth = n:只输出命令行参数的小于等于第n层的目录的总计。详细可以查看man手册
参考链接:https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/59.html
来源: http://www.cnblogs.com/liubinsh/p/7250985.html