【linux相识相知】磁盘分区及文件系统管理详解

磁盘,提供持久的数据存储,它不像我们的内存,如果突然断电了,在内存中的数据一般都会被丢掉了,内存中的数据在保存的时候,会被写到硬盘里面,磁盘也是一种I/O设备。

我们都知道磁盘分区完成之后,还要进行格式化,这个格式化操作就是指定文件系统,文件系统的本质就是对一个存储设备上的元数据和数据就行组织,最终把数据有组织的放在可以长期存储的设备中。

本次博客主要是介绍可linux中的磁盘分区和文件系统管理。

磁盘的接口类型:

IDE:一种较老的接口技术,价格低廉,兼容性强,传输速度可达133MB/s;

SCSI:主要应用于中、高端服务器中,支持热拔插,价格较高,其中UltraSCSI可达320MB/S,UltraSCSI640可达640MB/S;

【linux相识相知】磁盘分区及文件系统管理详解

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相识相知】磁盘分区及文件系统管理详解

在Linux系统中,c代表字符设备,b为块设备(红色部分标识)。

后面黄色标注的两行为设备号:

主设备号:左列,区分设备类型,用于标明设备所需要的驱动程序;

次设备号:右列,区分同种类型下的不同的设备。

mknod命令

mknod可以创建设备文件,格式如下:

mknod  [OPTION]...  NAME  TYPE  [MAJOR  MINOR]
选项:
-m MODE:创建后的设备文件的访问权限
mknod /dev/ttyUSB32 c  

linux的设备文件都是放在/dev目录下的,应用程序可以通过这些设备文件完成都设备的读写等操作。之前写过设备都有主次设备号,linux有约定俗成的编号,如硬盘的主设备号在centos6和7中为8:

根据接口类型的不同,设备的文件名命令也有一些规定,在centos如下:

【linux相识相知】磁盘分区及文件系统管理详解

在引用设备的时候可以通过以下三种方式:

1.设备文件名,也就是/dev目录下的文件名;

2.系统卷标(volume label);

3.UUID,唯一表示码,能够唯一的表示一个设备。

MBR和GPT

一块磁盘是可以被分割成多个分区,从Windows的角度来看,就是C,D,E分区。磁盘分区的方式有MBR和GPT。

MBR(Master Boot Record)

总共大小为512字节,存在于磁盘的第0个扇区。

446bytes:引导启动操作系统的程序;

64bytes:分区表,每16bytes标识一个分区,一共能够有4个主分区,但是如果想划分更多的区,可以指定扩展分区,比如分为3个主分区,一个扩展分区,而扩展分区可以划分为若干个逻辑分区。

【linux相识相知】磁盘分区及文件系统管理详解

综上所述,如果使用MBR分区,就必须至少有一个扩展分区,然后将扩展分区分成逻辑分区,逻辑分区的序号从5开始。

GPT(GUID Partition Table):

MBR是另一种分区方式:

1):GPT分区表中最多可以支持128个主分区

2):突破了MBR单个分区只能是2.2T的限制,最大支持1EB容量

在GPT中主分区、扩展分区和模糊分区的概念就淡化了很多。

分区工具

fidisk

1.查看磁盘分区

fdisk -l device...:查看指定磁盘设备的分区情况

【linux相识相知】磁盘分区及文件系统管理详解

2.管理分区

fdisk为MBR方式的分区工具,提供了交互式的接口来管理分区所有的操作,都是在内存中完成的,当使用w保存的时候,才真正去创建或修改分区。

fdisk device

我们来试试,可以看到使用fdisk加设备名,就进入到了一个交互式的界面,输入m即可获得帮助:

[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
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.)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x3918c6ef 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
p primary ( primary, extended, free)
e extended
Select (default p): p
分区号 (-,默认 ):
起始 扇区 (-,默认为 ):
将使用默认值
Last 扇区, +扇区 or +size{K,M,G} (-,默认为 ):+20G
分区 已设置为 Linux 类型,大小设为 GiB
命令(输入 m 获取帮助):n
Partition type:
p primary ( primary, extended, free)
e extended
Select (default p): p
分区号 (-,默认 ):
起始 扇区 (-,默认为 ):
将使用默认值
Last 扇区, +扇区 or +size{K,M,G} (-,默认为 ):+20G
分区 已设置为 Linux 类型,大小设为 GiB
命令(输入 m 获取帮助):n
Partition type:
p primary ( primary, extended, free)
e extended
Select (default p): p
分区号 (,,默认 ):
起始 扇区 (-,默认为 ):
将使用默认值
Last 扇区, +扇区 or +size{K,M,G} (-,默认为 ):+20G
分区 已设置为 Linux 类型,大小设为 GiB
命令(输入 m 获取帮助):n
Partition type:
p primary ( primary, extended, free)
e extended
Select (default e): e
已选择分区
起始 扇区 (-,默认为 ):
将使用默认值
Last 扇区, +扇区 or +size{K,M,G} (-,默认为 ):
将使用默认值
分区 已设置为 Extended 类型,大小设为 GiB
命令(输入 m 获取帮助):n
All primary partitions are in use
添加逻辑分区
起始 扇区 (-,默认为 ):
将使用默认值
Last 扇区, +扇区 or +size{K,M,G} (-,默认为 ):+20G
分区 已设置为 Linux 类型,大小设为 GiB

查看分区情况:

[root@localhost ~]# fdisk -l /dev/sdb
磁盘 /dev/sdb:128.8 GB, 字节, 个扇区
Units = 扇区 of * = bytes
扇区大小(逻辑/物理): 字节 / 字节
I/O 大小(最小/最佳): 字节 / 字节
磁盘标签类型:dos
磁盘标识符:0x3918c6ef
设备 Boot Start End Blocks Id System
/dev/sdb1 Linux
/dev/sdb2 Linux
/dev/sdb3 Linux
/dev/sdb4 Extended
/dev/sdb5 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)
(看起来比fdisk麻烦多了)
我们来举个例子来说明parted的使用方法:
1)首先选择要分区的设备,使用select Device
(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]? #文件系统先不用管,后面会讲到
起始点? #
结束点? #默认为M

4)这样一个分区就创建好了,可以使用print查看

(parted) print
Model: ATA VMware Virtual I (scsi)
Disk /dev/sdc: .7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name 标志
1049kB 2048MB 2047MB my_data1

5)让我们再来新建一个分区,新建分区的起始点就是上一个分区的结束点

(parted) mkpart
分区名称? []? my_data2
文件系统类型? [ext2]?
起始点?
结束点?
(parted)
(parted) print
Model: ATA VMware Virtual I (scsi)
Disk /dev/sdc: .7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name 标志
1049kB 2048MB 2047MB my_data1
2048MB 4096MB 2048MB my_data2

6)作为linux的哲学思想之一,避免与用户交互,我们也可以使用以下方式来创建新的分区

(parted) mkpart my_data3
(parted)
(parted) print
Model: ATA VMware Virtual I (scsi)
Disk /dev/sdc: .7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name 标志
1049kB 2048MB 2047MB my_data1
2048MB 4096MB 2048MB my_data2
4096MB 6144MB 2048MB my_data3

7)parted使用quit退出即生效

(parted) quit
信息: You may need to update /etc/fstab.
[root@localhost ~]#
以上就是2种比较常用的分区工具了
特别要注意的是,在已经分区并且已经挂载在根文件系统的目录上的设备,再在这个设备上创建新的分区(比如在扩展分区上创建逻辑分区),内核可能在创建完成后无法直接识别。
可以查看/proc/partitions,确认内核是否已经识别:
[root@localhost ~]# cat /proc/partitions
major minor #blocks name
sdb
sdb1
sdb2
sdb3
sdb4
sdb5
sdc
sdc1
sdc2
sdc3
sda
sda1
sda2
sr0
dm-
dm-
dm-

如果没有识别可以使用以下两种方式通知内核强制重读磁盘分区表:

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的位置一次性将数据读取出来。

【linux相识相知】磁盘分区及文件系统管理详解

2.链式文件系统

和索引式文件系统不同的是莲式读取文件方式,常见于U盘的FAT格式,这种文件系统没有inode的存在,每个block的号码都记录在前一个block中。

【linux相识相知】磁盘分区及文件系统管理详解

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

linux下的EXT2文件系统

EXT2是一种比较旧的文件系统了,从Centos7开始文件系统已经开始使用了XFS,但是这种使用inode为基础的文件系统还是要了解的,毕竟后面也出现了它的升级版本,EXT3和EXT4。

前面说过inode记录是文件的权限和属性,inode和block在文件系统创建好之后就已经分好了的,但是我们想一想,如果一个硬盘有500G甚至更大,inode和block都放在一起就会显得不是很合理,数量过大,不容易去管理。所有在EXT2文件系统中在格式化的时候将文件系统分为多个区块,称为block group,每个block group都有自己的block/inode/superblock。

下面我们就来看看一个block group的大致样子:

【linux相识相知】磁盘分区及文件系统管理详解

在文件系统的最前面有一个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号码。

目录的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

VFS(Virtual Filesystem Switch),linux系统通过VFS的核心功能去读取文件系统。

比如/是使用的是/dev/sda1,其文件系统是ext2格式的,而/home使用的/dev/sda2,其格式为xfs,如果我们现在要读取/home/Frank,直接cat就行了,我们有指定要用什么文件系统的模块去读取吗?没有,这个就是VFS的功能,VFS可以管理所有的filesystem,示意图如下:

【linux相识相知】磁盘分区及文件系统管理详解

硬链接和符号链接

硬链接和符号链接都是都是链接文件,用"l"表示

【linux相识相知】磁盘分区及文件系统管理详解

(红色为符号链接标识l,黄色为引用计数)

 硬链接
指向同一个inode的多个文件路径
特性:目录不支持硬链接,硬链接不支持跨文件系统,创建硬链接会增加inode引用计数
创建硬链接:
ln   源文件  链接文件

我们来看一下如下:

[root@localhost ~]# ls -l /etc/ | grep "fstab"
-rw-r--r--. root root 7月 : fstab为其创建一个链接

为其创建一个链接

[root@localhost ~]# ln /etc/fstab /tmp/fstab.link

引用计数变为了2

[root@localhost ~]# ls -l /etc/ | grep "fstab"
-rw-r--r--. root root 7月 : fstab

再去看一下/tmp下的链接文件

[root@localhost ~]# ls -l /tmp/ | grep "link"
-rw-r--r--. root root 7月 : fstab.link

cat一下内容,因为指向的是inode,所有即使你删除了源文件,通过符号链接还是读取文件内容:

[root@localhost ~]# cat /tmp/fstab.link
#
# /etc/fstab
# Created by anaconda on Sun Jul ::
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(), findfs(), mount() and/or blkid() for more info
#
/dev/mapper/cl-root / xfs defaults
UUID=ee087898-527c-41b0-85f6-3880e6bf0b73 /boot xfs defaults
/dev/mapper/cl-var /var xfs defaults
/dev/mapper/cl-swap swap swap defaults

符号链接

指向一个文件路径的另一个文件路径

特性:符号链接与文件两个各自是独立的文件,各有自己的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

查看符号链接:

【linux相识相知】磁盘分区及文件系统管理详解

删除原文件后,符号填充色变黑,原文件名闪烁:

【linux相识相知】磁盘分区及文件系统管理详解

写了这么些文件系统的基础知识,应该可以大致理解文件系统是什么个东西了,下面我们就开始介绍如何管理和使用文件系统。

文件系统的管理

文件系统的创建:
mkfs
格式1:
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. (-Dec-)
文件系统标签=
OS type: Linux
块大小= (log=)
分块大小= (log=)
Stride= blocks, Stripe width= blocks
inodes, blocks
blocks (5.00%) reserved for the super user
第一个数据块=
Maximum filesystem blocks=
block groups
blocks per group, fragments per group
inodes per group
Superblock backups stored on blocks:
, , , , , , , , , Allocating group tables: 完成
正在写入inode表: 完成
Creating journal ( blocks): 完成
Writing superblocks and filesystem accounting information: 完成

也可以使用:

mkfs -t 文件系统格式  device

举例:将/dev/sdb1格式化为ext3格式

[root@localhost ~]# mkfs -t  ext3 /dev/sdb1
mke2fs 1.42. (-Dec-)
文件系统标签=
OS type: Linux
块大小= (log=)
分块大小= (log=)
Stride= blocks, Stripe width= blocks
inodes, blocks
blocks (5.00%) reserved for the super user
第一个数据块=
Maximum filesystem blocks=
block groups
blocks per group, fragments per group
inodes per group
Superblock backups stored on blocks:
, , , , , , , , , Allocating group tables: 完成
正在写入inode表: 完成
Creating journal ( blocks): 完成
Writing superblocks and filesystem accounting information: 完成

ext系列系统专用管理工具

mke2fs

创建一个ext2或ext3或ext4的文件系统,和mkfs命令类似

mke2fs [OPTIONS] device
常用选项:
-t {ext2|ext3|ext4}:指明要创建的文件系统类型
-b {||}:指明文件系统的块大小;
-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. (-Dec-)
文件系统标签=my_data
OS type: Linux
块大小= (log=)
分块大小= (log=)
Stride= blocks, Stripe width= blocks
inodes, blocks
blocks (5.00%) reserved for the super user
第一个数据块=
Maximum filesystem blocks=
block groups
blocks per group, fragments per group
inodes per group
Superblock backups stored on blocks:
, , , , , , , , , Allocating group tables: 完成
正在写入inode表: 完成
Creating journal ( blocks): 完成
Writing superblocks and filesystem accounting information: 完成
e2label
系统卷标的查看与设定
查看:
[root@localhost ~]# e2label  /dev/sdb1
my_data

设定:

[root@localhost ~]# e2label /dev/sdb2 mydata2
[root@localhost ~]#
[root@localhost ~]# e2label /dev/sdb2
mydata2
tune2fs
调整ext2/ext3/ext4的文件系统的某些属性,块大小写创建之后是不可以改变的
tune2fs [OPTIONS]  DEVICE
-l:查看super block的信息
修改文件系统的属性:
-j:修改文件系统
-L LABEL:修改卷标
-m #:调整预留空间百分比
-O [^]FEATURE:开启或关闭某种特性
-o [^]mout_options:开启或关闭某种默认挂载选项,比如 开启acl -o acl 或者关闭 -o ^acl
blkid
查看设备属性
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
检测ext2\ext3\ext4类型的linux文件系统
e2fsck  [OPTIONS] device
-y:对所有问题自动回答yes
-f:即使文件系统处于clean状态,也要强制检查,clean说明文件系统没有问题,反之为dirty

fsck

检查和修改一个linux的文件系统
-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

swap文件系统

linux上的交换分区必须使用独立的文件系统,system-ID必须是82
【linux相识相知】磁盘分区及文件系统管理详解

举例:现在要把分区sdb5转换为支持swap文件系统

[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
命令(输入 m 获取帮助):t
分区号 (-,默认 ):
Hex 代码(输入 L 列出所有代码):l
空 NEC DOS Minix / 旧 Linu bf Solaris
FAT12 隐藏的 NTFS Win Linux 交换 / So c1 DRDOS/sec (FAT-
XENIX root Plan Linux c4 DRDOS/sec (FAT-
XENIX usr 3c PartitionMagic OS/ 隐藏的 C: c6 DRDOS/sec (FAT-
FAT16 <32M Venix Linux 扩展 c7 Syrinx
扩展 PPC PReP Boot NTFS 卷集 da 非文件系统数据
FAT16 SFS NTFS 卷集 db CP/M / CTOS / .
HPFS/NTFS/exFAT 4d QNX4.x Linux 纯文本 de Dell 工具
AIX 4e QNX4.x 第2部分 8e Linux LVM df BootIt
AIX 可启动 4f QNX4.x 第3部分 Amoeba e1 DOS 访问
a OS/ 启动管理器 OnTrack DM Amoeba BBT e3 DOS R/O
b W95 FAT32 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) CP/M a0 IBM Thinkpad 休 eb BeOS fs
e W95 FAT16 (LBA) OnTrack DM6 Aux a5 FreeBSD ee GPT
f W95 扩展 (LBA) OnTrackDM6 a6 OpenBSD ef EFI (FAT-//
OPUS EZ-Drive a7 NeXTSTEP f0 Linux/PA-RISC
隐藏的 FAT12 Golden Bow a8 Darwin UFS f1 SpeedStor
Compaq 诊断 5c Priam Edisk a9 NetBSD f4 SpeedStor
隐藏的 FAT16 < SpeedStor ab Darwin 启动 f2 DOS 次要
隐藏的 FAT16 GNU HURD or Sys af HFS / HFS+ fb VMware VMFS
隐藏的 HPFS/NTF Novell Netware b7 BSDI fs fc VMware VMKCORE
AST 智能睡眠 Novell Netware b8 BSDI swap fd Linux raid 自动
1b 隐藏的 W95 FAT3 DiskSecure 多启 bb Boot Wizard 隐 fe LANstep
1c 隐藏的 W95 FAT3 PC/IX be Solaris 启动 ff BBT
Hex 代码(输入 L 列出所有代码):
已将分区“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, 字节, 个扇区
Units = 扇区 of * = bytes
扇区大小(逻辑/物理): 字节 / 字节
I/O 大小(最小/最佳): 字节 / 字节
磁盘标签类型:dos
磁盘标识符:0x3918c6ef
设备 Boot Start End Blocks Id System
/dev/sdb1 Linux
/dev/sdb2 Linux
/dev/sdb3 Linux
/dev/sdb4 Extended
/dev/sdb5 Linux swap / Solaris
 注意:windows无法识别linux的文件系统,要使用U盘在两种类型的设备上copy文件的时候,可以使用wimdows和Linux都能识别的文件系统:FAT32(vfat)。
~]# 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 % /
devtmpfs % /dev
tmpfs % /dev/shm
tmpfs % /run
tmpfs % /sys/fs/cgroup
/dev/sdb1 % /mnt
/dev/sda1 % /boot
/dev/mapper/cl-var % /var
tmpfs % /run/user/
tmpfs % /run/user/
 查看当前系统系统所有已经挂载的设备

三种方式:

#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- partition -
/dev/sdb5 partition -

配置文件/etc/fstab

 默认情况下只有根文件系统能够自动挂载,可将需要自动挂载的设备等信息按指定的格式写在/etc/fstab文件中:
[root@localhost ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Jul ::
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(), findfs(), mount() and/or blkid() for more info
#
/dev/mapper/cl-root / xfs defaults
UUID=ee087898-527c-41b0-85f6-3880e6bf0b73 /boot xfs defaults
/dev/mapper/cl-var /var xfs defaults
/dev/mapper/cl-swap swap swap defaults

从左到右分为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 ::
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(), findfs(), mount() and/or blkid() for more info
#
/dev/mapper/cl-root / xfs defaults
UUID=ee087898-527c-41b0-85f6-3880e6bf0b73 /boot xfs defaults
/dev/mapper/cl-var /var xfs defaults
/dev/mapper/cl-swap swap swap defaults
/dev/sr0 /mnt iso9660 defaults
 重启设备确认挂载成功:
[root@localhost ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/cl-root % /
devtmpfs % /dev
tmpfs % /dev/shm
tmpfs % /run
tmpfs % /sys/fs/cgroup
/dev/sr0 % /mnt
/dev/sda1 % /boot
/dev/mapper/cl-var % /var
tmpfs % /run/user/
tmpfs % /run/user/

其他常用命令

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 % /mnt

dd

 转换和拷贝文件,它每次从输入读取的是一个块的大小(默认512字节)
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= bs=

一个好玩的设备文件/dev/zero,是一个输入设备,它可以向外面不断的吐0,另外的一个设备文件是/dev/null,它像一个无底洞一样,可以吞噬一切数据。

4.格式化硬盘

dd if=/dev/zero of=/dev/sda bs= count=
 du

查看当前指定的文件或目录占磁盘空间的大小,会递归显示

du [OPTIONS] file
-a:显示对所有文件的统计,而不只是包含子目录。
-b:输出以字节为单位的大小,替代缺省时1024字节的计数单位。
--block-size=size:输出以块为单位的大小,块的大小为 size 字节。( file- utils-4.0 的新选项)
-h: 为每个数附加一个表示大小单位的字母,象用M表示二进制 的兆字节。
-k:输出以1024字节为计数单位的大小。
-m:输出以兆字节的块为计数单位的大小(就是 ,, 字节)。
--max-depth=n:只输出命令行参数的小于等于第 n 层的目录的总计。
详细可以查看man手册

参考链接:https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/59.html

 
 
 
 
 
 
 
上一篇:20154312《网络对抗》Exp2 后门原理与实践


下一篇:读<你必须知道的.NET>IL指令笔记