Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。为了管理这些设备,系统为设备编了号,设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。对于常用设备,Linux有约定俗成的编号,如硬盘的主设备号是3。
在linux中,一切皆文件,包括硬件设备,而系统识别一个设备,是靠ID
设备文件,只有元数据,没有数据,因为设备本身就是用来输入或保存数据的,所以,设备文件是一种特殊文件。
硬件设备的ID分为主设备号和次设备号
主设备号:用来区分不同种类的设备
次设备号:用来区分同一类型的多个设备
ll /dev
发现,本来用标识文件大小的位置,用逗号隔开成两段,前面是主设备号,后面是次设备号
1、硬盘接口类型
并行:
IDE:133MB/s
SCSI: 640MB/s
串口:
SATA:6Gbps
SAS:串列式SCSI,sas3的速率12Gbps
USB,最新的usb3的速率480MB/s
并行接口,多条线路并行传输数据,常规来说,效率应该比串行高。但电磁信号会产生干扰,所以为了提高数据传输的准确性,速率不会很高。
2、磁盘文件名
磁盘的文件名和驱动有关
#sata/scsi,都是用的scsi驱动
/dev/sd{a-p}
#IDE接口
/dev/hd{a-p}
#只有在虚拟化环境中磁盘文件名才会被识别成vd,当磁盘的类型用半虚拟化的时候才会被识别成vd,使用的是半虚化驱动
/dev/vd{a-p}
3、查看磁盘信息
lsblk
vdb 252:16 0 20G 0 disk
└─vdb1 252:17 0 20G 0 part
vdb,表示是一个虚拟化磁盘
vdb1,表示这是第一个分区
4、磁盘的概念
磁盘由多个盘片、机械手臂、磁头组成
每个盘片上面有磁道、扇区(512字节,最新硬盘为4K)
磁柱:多个盘片叠加起来形成一个圆柱
柱面:所有盘片的同一个磁道我们称为柱面
块/簇:扇区是磁盘最小的物理存储单元,但是扇区的空间比较小且数目众多,在寻址时比较困难,所以操作系统就将多个扇区组合在一起,形成一个集合,再对这个集合进行整体的操作。这个集合,在Windows下叫做簇;在Linux下叫做块(block),默认4K。
硬盘分区最常见的类型为mbr(或msdos)和gpt:
MBR分区
传统的BIOS只支持MBR分区硬盘启动,一个硬盘只能有四个主分区,后来为了支持更多的分区,引入了扩展分区及逻辑分区的概念。并且单个硬盘最大不能超过2TB,超过2TB以后的空间,不能分配地址,也就无法管理了。
GPT分区
UEFI标准规范的一种较新的磁盘分区表结构的标准,是未来磁盘分区的主要形式。与MBR分区方式相比,突破MBR4个主分区限制,每个磁盘最多支持128个分区,空间最大可支持到18EB。同时兼容MBR分区
5、MBR分区
5.1、分区
通过某种方式,将磁盘划分成多个更小的且相互之间不会相互影响的逻辑小空间
rhel6是用柱面来划分
rhel7是以扇区来划分,比如从扇区200到扇区10000分成一个分区
5.2、分区表
分区表记录的是一个分区的起始扇区和结束扇区
主分区和扩展分区的分区信息存放在磁盘的第一个扇区
逻辑分区的分区信息存放在扩展分区的前2048个扇区,而不是在第一个扇区
逻辑分区的文件名从5开始,即使没有4这个分区
磁盘的第一个扇区(头512字节)
第一个扇区的1-446字节是MBR(主引导记录),放置了部分的bootloader程序
第一个扇区的447-510字节,共64个字节,存放的是分区信息,每一个分区信息占用16个字节,所以最多可以分4个分区,为了可以超过这个限制,有了扩展分区
第一个扇区还剩下2个字节,存放的是标记信息,标记前面510字节的信息是否可用
5.3、扩展分区
扩展分区不能直接使用,必须分成若干逻辑分区。
扩展分区不能被格式化
一个磁盘最多可以划分1个扩展分区
注意:
对于系统磁盘,必须有一个主分区,作为引导盘
6、GPT分区
GPT使用34个扇区来记录分区表
为了兼容MBR,第一个扇区还是MBR
从第二个扇区到第34个扇区都是GPT分区表,也就是共33个GPT分区,为了安全,还将硬盘的最后33个扇区作为备份。
GPT最大支持128个分区,每个分区信息128字节。同时没有扩展分区和逻辑分区的概念
唯一的要求:硬件要支持,现在的硬件基本都支持
注意:
因为BIOS无法识别GPT分区,所以,BIOS下GPT磁盘不能用于启动操作系统
UEFI可同时识别MBR分区和GPT分区,因此UEFI下,MBR磁盘和GPT磁盘都可用于启动操作系统
7、分区工具
7.1、fdisk
针对mbr分区
#查看磁盘信息
fdisk /dev/sdb -l
#进入分区交互模式
fdisk /dev/sdb
m 帮助
p 打印当前分区信息
n 新建一个分区
p 主分区
e 扩展分区
t 调整分区ID
w 保存退出,将分区信息写入磁盘
注意:
fdisk是在内存中完成,w保存后,才会同步到硬盘
使用w保存退出后,内核可能不会立即识别新分区,可用partprobe /dev/vdb命令,让内核重新去读分区表
#查看内核是否识别到分区
cat /proc/partitions
7.2、gdisk
使用gdisk分区,默认就是GPT格式
#查看磁盘
gdisk -l
#分区
gdisk /dev/vdb
?或m,帮助
n,建立分区
d,删除分区
c,更改分区名字
I,显示分区的详细信息
p,显示分区信息
t,转换分区类型
a,将指定分区设置/取消 活动分区
l ,查看分区类型
o ,重建分区表
v ,验证分区表,显示剩余没有被分区划分的扇区数量
q ,退出不保存,不保存,所有的修改都不生效
w ,退出并保存
注意:
如果原来的分区是MBR格式,再用gdisk再分,会将MBR分区覆盖
7.3、parted
parted命令是由GNU组织开发的一款功能强大的磁盘分区和分区大小调整工具,支持mbr和gpt
#查看磁盘
parted -l
#分区
parted /dev/vdb
help,查看帮助
print,查看分区信息
mklabel,设置分区格式,mbr还是gpt
mkpart,创建分区
rm,删除分区
gpt,把MBR格式转换成GPT格式,如果已经是GPT,这里可以用msdos转换成MBR
quit,退出
例:
#设置gpt分区
mklabel gpt
#创建第一个分区
mkpart primary 0 10G
注意:
parted是一个实时生效的命令,当分完一个区后,不用结束立即生效。不像fdisk和gdisk,需要退出后才生效。
#查看磁盘分区
parted /dev/vdb print
8、格式化
分完区后,接下来就要进行格式化
对分区进行格式化,也就是创建文件系统
8.1、文件系统
所谓文件系统,就是对文件的一种组织方式
硬盘分完区,就好比一张白纸,如果想在这张白纸上漂亮的组织文字,就需要对这张纸进行画线,然后按线写字,就不会显得乱了。而组织方法,可以各种各样,所以文件系统也有很多种。
linux下常用文件系统:
ext2,ext3,ext4,xfs
光盘文件系统:iso9660
网络文件系统:NFS,CIFS
集群文件系统:GFS2(redhat),OCFS2(oracle)
分布式文件系统:CEPH,GlusterFS
对于不同的文件系统,对数据存和取的方式不一样,分为日志型和非日志型
日志型:ext3,ext4,xfs
非日志型:ext2,vfat
8.2、日志型文件系统
所谓日志型,就是将磁盘分为三个区域:数据、元数据、日志
写入文件,先将元数据写到日志区域,等数据完整写入数据区域,再将元数据移到元数据区域。
这样做的好处是,万一数据还没写完,就出现意外中断(比如断电),数据就不完整。而系统会在重新挂载文件系统前,检查上次是否正确卸载,如果非正确卸载,就会对其进行检查。
在非日志文件系统中,要检查并修复类似的错误就必须对整个文件系统的数据结构进行检查。
为了避免这样的问题,日志文件系统分配了一个称为日志(journal)的区域来提前记录要对文件系统做的更改。在崩溃后,只要读取日志重新执行未完成的操作,文件系统就可以恢复一致
8.3、文件系统组成部分
内核模块:ext4,xfs,vfat
用户空间的管理工具:mkfs.ext4,mkfs.xfs,mkfs.vfat
8.4、Linux的虚拟文件系统VFS
Linux 中允许众多不同的文件系统共存,如 ext3, ext4, xfs等。通过使用同一套文件 I/O 系统调用即可对 Linux 中的任意文件进行操作而无需考虑其所在的具体文件系统格式
8.5 创建文件系统
#查看系统支持文件系统
#前面没有nodev的文件系统,表示当前已经加载
cat /proc/filesystems
#格式化,创建文件系统
#如果已经格式化过了,再重新格式化,需要加上-f选项,强制。
mkfs -t xfs /dev/vdb1
#-L表示指定标签(label),将一分区格式的时候,可以指定一个标签
#注意:每个分区的label必须唯一,不能重复
mkfs -t xfs -L label1 /dev/vdb1
#mke2fs,只针对ext系列文件系统
mke2fs -t ext4 /dev/vdb1
-b {1024|2048|4096},指定文件系统块大小
-i,为数据空间中每多少个字节,创建一个inode,大小不能小于block大小
10、查看文件系统
10.1、xfs格式
#查看文件系统UUID
xfs_admin -u /dev/vdb1
#查看label
xfs_admin -l /dev/vdb1
#在挂载之后,查看文件系统信息
xfs_info /dev/vdb1
10.2、ext4/ext3格式
#ext系列专用工具,查看或设定lable
e2lable /dev/vdb1 lable2
#tune2fs也可以用来重新设定ext系列文件系统的可调参数的值
tune2fs -l /dev/vdb1
-l,查看超级块信息
所谓超级块,由于当前分区越来越大,为了方便管理块,将数据空间的块进行分组,每组内的块数据是一样的。像这种分组信息,哪些块分到哪个组,一共还有多少块没被使用等这些分区内的信息,都需要存储,而用来存储这些信息的块,我们称为超级块,为了安全,一般会有多个备份超级块
#查看更详细信息
dumpe2fs /dev/vdb1
10.3、统一工具
#查看所有文件系统的UUID、label、type
blkid
#查看文件系统使用空间
df -Th
-T 表示type,显示文件系统的类型
-h 以人类可读的方式显示大小
#查看inode使用量
df -i
#以posix兼容的格式输出
#主要用于如果输出太长,默认会自动换行,这时使用awk等工具进行过滤时,就会出问题,而用了这种方式,不论再长,都只会在一行中显示
df -P
#计算一个目录总大小
du -sh /etc
-s,summary
11、检查文件系统
#检查文件系统
fsck.ext4 /dev/vdb1
-a,自动修复错误
-r,交互式修复错误
#e2fsck是ext系列文件系统专用的检查工具
e2fsck -f /dev/vdb1
-f,强制性修复,不交互
12、挂载
分区格式化之后,需要挂载才能使用
在没有挂载之前,就相当于一个没门没窗的房间,为了能够进入文件系统进行读写数据,必须先挂载
将一个文件系统和一个目录关联起来,就叫挂载,进而使得此目录作为一个文件系统的访问入口。这个目录,我们称为挂载点
注意:挂载点下如果有文件,挂载后,这些文件会被隐藏。所以建议挂载点为一个空目录
#查看已挂载的文件系统
mount
实际是在读取/etc/mtab文件
12.1、使用分区文件挂载
#创建挂载点
mkdir /mnt/tt
#挂载
mount /dev/vdb1 /mnt/tt
这是没有指定文件系统类型,因为mount会自动调用blkid来识别。
-t,指定文件系统类型
-r,以只读方式挂载
-w,以读写挂载
mount -o async /dev/vdb1 /mnt/tt
-o,挂载文件系统的选项
async,异步模式,数据修改后,不马上存盘
sync,同步模式,数据一修改,马上存盘
atime,修改访问时间
noatime,不修改访问时间,用于大量访问的文件,减轻IO
ro,只读挂载
rw,读写挂载
suid,启用suid功能
dev,支持在此文件系统上使用设备文件
exec,支持将文件系统上的程序运行为进程
auto,支持自动挂载
nouser,不允许普通用户挂载
acl,启用acl功能,rhel6默认没启用,rhel7默认已启用
注意,
如果不指定挂载选项,会有默认选项,defaults
defaults包含:rw, suid, dev, exec, auto, nouser, async
#默认,挂载后,都会更新这个文件,但也可以使用mount -n,挂载时不更新此文件
cat /etc/mtab
#文件系统挂载后,内核追踪到的挂载,都会将挂载信息输出到这个文件中
cat /proc/mounts
12.2、使用UUID挂载
#查看所有块设备的UUID
blkid
#使用UUID挂载
mount UUID=”XXXXXXXXXX” /mnt/tt
12.3、使用标签去挂载
#查看标签
blkid
#使用标签挂载
mount LABEL=”tt” /mnt/tt
注意:
最好不使用分区名进行挂载,因为系统在识别磁盘文件名的时候,有可能第一次和第二次不一样。最好用UUID或label去挂载
12.4、查看挂载
df -Th
12.5、挂载ISO文件
注意:rhel6及之前版本,是不能自动识别ISO文件系统类型的,rhel7可以自动识别
mount /root/rhel7.iso /mnt/iso
mount -t iso9660 /root/rhel7.iso /mnt/iso
12.6、光驱
/dev/sr0
/dev/cdrom
它是sr0的一个连接文件
12.7、U盘挂载
U盘会被识别成一个sd磁盘
13、卸载
#挂载点或分区名都可以
umount /mnt/tt
#查看下在访问文件系统的进程
fuser -v MOUNT_POINT
#将访问该文件系统的所有进程kill掉
#一般用于卸载时,无法卸载的情况
fuser -km MOUNT_POINT
注意:
在使用中的文件系统,是不能卸载的
14、开机自动挂载
vim /etc/fstab
分区文件
挂载点
分区文件系统类型
挂载参数,如果要使用ACL,这里要写成defautls,acl,如果挂载ISO文件,这是要写成defaults,loop
备份:0,不做备份;1,每天备份;2,每隔一天备份
自检次序:0,不自检;1,首先自检,一般用于rootfs
注意:
自检,一般出现在非法关机,然后开机时,对文件系统进行自检,检查文件有没损坏,能修复就修复,不能修复就删除。
建议存放数据的文件系统不要做自检,因为自检,有可能造成文件丢失
#将fstab中还没有挂载的进行挂载
mount -a
15、SWAP交换分区
交换分区,当内存不够用的时候,系统会将不经常使用的内存页置换到swap分区,一旦数据要被使用了,又重新从swap加载到内存
当大量的使用swap分区时,系统会很慢
当内存小于2G时,swap设成内存的2倍
当内存大于2G时,swqp设成内存一样大
#上面的值只是官方推荐值,可以自己定义
15.1、分区
选择类型82,这只是一个标识而已,没有实际意义
15.2、格式化
mkswap /dev/vdb3
15.3、激活
#激活交换分区
#-p,指定优先级,用于多个交换分区的情况。如果优先级一样,负载均衡使用。
swapon /dev/vdb3
#激活所有交换分区
swapon -a
15.4、关闭swap
swapoff /dev/vdb3
15.5、查看
free -m
-m,以MB为单位
-g,以GB为单位
注意,物理内存已使用空间,包含buffers和cached,这两者统称为缓存空间
swapon -s
15.6、写进fstab
vi /etc/fstab
/dev/vdb3 swap swap defaults,pri=1 0 0
pri代表优先级,如果有两个swap分区,先使用优先级高的,空间用完再用优先级低的,如果两个优先级一样,循环使用,实现负载均衡
#激活所有交换分区
swapon -a
注意:
swap还是需要的,即使内存很大的时候。