1.设备文件
(1)磁盘存储术语
head:磁头
track:磁道
cylinder: 柱面
secotr: 扇区,512bytes
(2)寻址方式
·CHS(cylinder,head,secotr)称为硬盘的三围
采用24bit位寻址
其中前10位表示cylinder,中间8位表示head,后面6位表示sector。
最大寻址空间8GB
因为一个硬盘的磁头数/盘面数为256(2^8),一个盘面上有1024(2^10)个磁道,每个磁道有64(2^6)个扇区,每个扇区512字节
256*1024*64*512/1024/1024/1024=8GB 所以一个硬盘大小为8GB
(64*512*256/1024/1024/1024=8M 一个柱面大小为8MB)
·LBA(logical block addressing)
LBA是一个整数,通过转换成CHS格式完成磁盘具体寻址
LBA采用48个bit位寻址
最大寻址空间128PB (空间单位B KB MB GB TB PB EB ZB YB BB NB DB)
由于CHS寻址方式的寻址空间在大概8GB以内,所以在磁盘容量小于大概8GB时,可以使用CHS寻址方式或是LBA寻址方式;在磁盘容量大于大概8GB时,则只能使用LBA寻址方式
(3)磁盘分区
为什么分区:
优化I/O性能
实现磁盘空间配额限制
提高修复速度
隔离系统和程序
安装多个OS
采用不同文件系统
2.分区方式
(1)两种分区方式:MBR(MSDOS),GPT
MBR: Master BootRecord,1982年,使用32位表示扇区数,分区不超过2T
(512*2^32/1024/1024/1024/1024=2T)
如何分区:按柱面
0磁道0扇区:512bytes
其中:前446bytes: bootloader(Grub)引导分区(先不研究这个)
之后的64bytes:分区表(共有4个)
16bytes: 标识一个分区
最后2bytes:55AA 标识位,代表分区结束
使用hexdump -C -n 512 -v /dev/sda 查看分区表
4个主分区;3主分区+1扩展(N个逻辑分区)
·备份
dd if=/dev/sda of=/dev/sdx bs=1 count=512
然后使用hexdumo -C mbr查看分区,就跟sda一样了。
·破坏分区,格式化
dd if=/dev/zero of=/dev/sdx bs=1 count=512
就是将zero复制过去,因此分区就没了。
使用fdisk查看,果然没有了。
使用hexdump -C -n 512 -v /dev/sda 查看分区表也空了。
(2)MBR分区结构
扩展分区指向另外一个扇区,那个扇区也有512个字节,前446个字节未使用,后两位为55AA,中间的64个字节存储着扩展分区中的逻辑分区。扩展分区自身存储着第一个EBR的位置,一个EBR只对应一个逻辑分区,第二个分区用来指向下一个EBR的位置,以此类推。因此删除一个逻辑分区,不会影响下一个逻辑分区。
逻辑分区的信息不存在MBR中,使用dd复制的时候不会复制逻辑分区的内容。
(3)MBR中DPT结构
(4)GPT分区
GPT:GUID(Globals Unique Identifiers) partition table 支持128个分区,使用64位,支持8Z(512Byte/block )64Z( 4096Byte/block)
使用128位UUID(Universally Unique Identifier) 表示磁盘和分区 GPT分区表自动备份在头和尾两份,并有CRC校验位
UEFI (统一扩展固件接口)硬件支持GPT,使操作系统启动
GPT分区结构:
(分为4部分)
3.管理分区
(1)列出和创建
·列出块设备
方法一:lsblk
以树状结构列出块设备(包括光驱),可以看到每个硬盘的分区,设备号,挂载点,类型
也可以指定列出某一块设备某个分区
方法三:cat /proc/partitions
·创建分区:
fdisk 创建MBR分区
gdisk 创建GPT分区
parted 高级分区操作(创建、复制、调整大小等等)
(2)fdisk分区
fdisk -l /dev/sdX 查看硬盘分区信息
7里面显示的start End是以扇区数为单位
6里面显示的start End是以柱面数为单位
如果两个分区用的同一个柱面,就会显示一段话提示我们,我们管这种模式叫DOS模式。
-c 打开或禁用dos模式(centos6)
-c=dos -c=nondos 打开、禁用dos模式(centos7)
本来默认有dos模式的CentOS6在使用-c后dos模式就被禁用了
本来默认没有dos模式的CentOS7在使用-c=dos后dos模式被开启了
-u 切换显示的单位(扇区/柱面)(centos6)
-u=cylinders -u=sectors 切换显示的单位(扇区/柱面)(centos7)
·fdisk /dev/sdX 进行分区
子命令:
m 帮助
n 建立分区
d 删除分区
p 显示分区信息
t 转换分区类型
a 将指定分区设置/取消活动分区
L 查看分区类型
o 重建分区表
v 验证分区表,显示剩余没有被分区划分的扇区数量
g 创建GPT格式的分区(centos7)
q 退出不保存
w 退出并保存,不保存,所有的修改都不生效
(3)使用fdisk进行MBR格式分区
·下面我们来试试分区(此分区默认为MBR格式):
然后我们分了两个扩展分区
使用p查看分区情况
最后输入w保存分区
查看一下分区,这样就已经分好了。
·除了系统盘之外的盘就可以按照上面的方式成功分区了,但是当我们给系统盘(sda)分区的时候w保存之后会出现下面的话,说让你重启才能生效。
查看内核是否已经识别新的分区:
cat /proc/partations
通知内核重新读取硬盘分区表:
Centos6新增分区用
partx -a /dev/DEVICE
kpartx -a /dev/DEVICE -f:force
删除分区用 partx -d --nr M-N /dev/DEVICE
CentOS 5,7: 新增或删除均使用partprobe[/dev/DEVICE]
6中我们在系统盘中新增了几个分区,但是保存之后并没有显示,于是我们使用partx -a /dev/sda 就有新增分区了。
同理CentOs7或者5里面使用partprobe /dev/sda 就可以了。
(4)使用fdisk进行GPT格式分区
在CentOS7中
与MBR不同的是,GTP显示的是分区的编号(共128个分区)
保存并退出。
sdb分区成功。
使用hexdump -C -n 512 -v /dev/sdb查看分区表
跟我们之前讲过的一样,只有最后两位是55aa,模拟出一个MBR,表示这是一个分过区的硬盘。
·fdisk也可以使用echo导入fdisk进行非交互式分区,命令如下:
echo -e "n\np\n1\n\n+1G\nw\n" |fdisk /dev/sdb
代表给第一个分区分1G的大小。
(5)parted
我们一般不推荐使用fdisk来进行GTP分区,可以使用parted更方便的分区。
parted的操作都是实时生效的,小心使用
用法:parted [选项]... [设备 [命令 [参数]...]...]
parted /dev/sdb mklabel gpt|msdos
parted /dev/sdb print
parted /dev/sdb mkpart primary 1 200 (默认M)
parted /dev/sdb rm 1
parted -l
输入过后是一个交互式界面,等待你输入
可以输入help查看一下帮助文档,这个帮助文档只是一个大目录,如果想看某个具体的内容,继续使用help。
如果想看mklabel的帮助,就输入help mklabel
根据帮助文档可以知道想要使用GPT格式分区,就输入mklabel gpt
如图,变成了GPT格式了。
看到新建分区命令。
删除命令为rm,如图,删除成功。
一般我们用fdisk分区MSDOS格式,我们现在用parted来分gpt格式。
然后我们创建分区(在这里不会问你是主分区扩展分区,因为gpt格式没有主分区扩展分区一说)
如图,创建成功
(6)gdisk
gdisk是类fdisk的GPT分区工具,与fdisk类似,只能分GPT格式。
输入?查看帮助文档
如图,创建成功
查询帮助文档,新建命令为n
让我们新建一个
输入y确认保存。分区完成。
4.文件系统
文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统。
从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压缩,加密等。
(1)文件系统类型
查看支持的文件系统:在/lib/modules/`uname -r`/kernel/fs 目录下
Linux文件系统:ext2(Extended file system), ext3, ext4, xfs(SGI), btrfs(Oracle), reiserfs,jfs(AIX), swap
光盘:iso9660
Windows:FAT32,exFAT,NTFS
Unix: FFS(fast),UFS(unix),JFS2
网络文件系统:NFS,CIFS
集群文件系统:GFS2,OCFS2(oracle)
分布式文件系统:fastdfs,ceph, moosefs, mogilefs, glusterfs, Lustre
RAW:未经处理或者未经格式化产生的文件系统
(2)文件系统分类
根据其是否支持"journal"功能:
日志型文件系统: ext3,ext4,xfs, ...
非日志型文件系统: ext2,vfat
文件系统的组成部分:
内核中的模块:ext4,xfs,vfat
用户空间的管理工具:mkfs.ext4,mkfs.xfs,mkfs.vfat
Linux的虚拟文件系统:VFS
查看当前支持的文件系统:cat /proc/filesystems
(3)创建文件系统(格式化)
每种操作系统所设置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此就需要将分区格式化,创建文件系统,以成为操作系统能够利用的文件系统格式。
linux的文件格式为Ext2/Ext3,Ext4。windows 操作系统为vfat或者NTFS。
·mkfs命令:(有两种方法)
mkfs.FS_TYPE /dev/DEVICE
支持格式:ext4 xfs btrfs vfat
mkfs -t FS_TYPE /dev/DEVICE
-L 'LABEL': 设定卷标
方法一:
方法二:
再使用blkid查看,果然变成ext3类型
(4)创建ext文件系统
mkfs可以创建多种系统类型,而使用mke2fs专门用于ext系列文件系统管理。只能创建ext文件系统。
mke2fs:ext系列文件系统专用管理工具
默认创建ext2类型
-t {ext2|ext3|ext4}
-b {1024|2048|4096} block
-L 'LABEL' 设置卷标
-j: 相当于 -text3 创建一个ext3类型
mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3
-i #: 为数据空间中每多少个字节创建一个inode;此大小不应该小于block的大小
-N #:指定分区中创建多少个inode
-I 一个inode记录占用的磁盘空间大小,128---4096
-m #: 默认5%,为管理人员预留空间占总空间的百分比
-O FEATURE[,...]:启用指定特性
-O ^FEATURE:关闭指定特性
inode:记录文件属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;
block:实际记录文件的内容,若文件太大时会占用多个block ;
super block:记录文件系统的整体信息,包括inode/block 的总量、使用量、剩余量,以及文件系统的格式与相关信息等。
每个inode与block都有编号,而每个文件系统都会占用一个inode,inode中有文件数据放置的block号码。我们可以找到文件的inode,然后找出文件所放置数据的block号码,之后读出数据。这种数据访问方式成为索引式文件系统。这种文件系统一般不太需要经常进行磁盘碎片整理。
(5)查看与重置文件系统信息
tune2fs:重新设定ext系列文件系统可调整参数的值
-l:查看指定文件系统超级块信息;super block
(这里面记录文件系统的整体情况。比如文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等。还有一个validbit数值,若此文件系统已经被挂载,validbit的值为0,若未被挂载,则validbit值为1。)
-L 'LABEL':修改卷标
-m #:修预留给管理员的空间百分比
-j: 将ext2升级为ext3
-O: 文件系统属性启用或禁用, –O^has_journal
-o: 调整文件系统的默认挂载选项,–o ^acl
-U UUID: 修改UUID号
dumpe2fs:
-h:查看超级块信息,不显示分组信息 与tune2fs -l一致
使用tune2fs -l /dev/sdx 查看文件系统信息
其中第一行表示卷标
我们刚才说过-L'LABEL'可以设定卷标(卷标其实就是一个磁盘名称)
果然修改成功
不仅可以使用tune2fs查看信息,也可以使用tune2fs -L修改卷标。
如图,修改成功。
设置了卷标之后,我们就可以使用卷标进行挂载了
在mount后面写上LABEL=”xxx”即可挂载成功。(只可以使用卷标挂载,不能卸载)
当然,也可以使用UUID挂载。
在centos5 系统中,安装时所创建的文件系统会自动将挂载点路径命名为卷标名。因为开机自动读取一个/etc/fstab文件
如图,里面放了开机自动挂载的信息并定义了卷标号。
(6)文件系统标签
指向设备的另一种方法,与设备无关
blkid:块设备属性信息查看(默认不显示光盘,但可以指定/dev/sr0查看)
blkid [OPTION]... [DEVICE]
-U UUID: 根据指定的UUID来查找对应的设备
我们新建一个分区
但是使用blkid没有查到sdb3,因为它还没有格式化,还不是块设备。
查到了sdb3
e2label:管理ext系列文件系统的LABEL
e2label DEVICE 查询卷标
e2label DEVICE[LABEL] 设置卷标
findfs:查找分区
findfs [options] LABEL=
5.超级块
启动Unix操作系统后,发现某个文件系统无法使用,很有可能就是超级块出现了问题。主要是因为在超级块中保存了全局文件信息,如硬盘已用空间、数据块可用空间、inode结点信息等等。
使用dumpe2fs /dev/sda1查看超级块信息和block分组信息
我们来看分组信息:
一共从0-7有8块
第一组中,整个分区第一个块放超级块信息
group1,3,5,7奇数的块都存放着备份的超级块
6.文件系统检测和修复
常发生于死机或者非正常关机之后。此时使用的就是备份的超级块。
挂载为文件系统标记为“no clean”
注意:一定不要在挂载状态下修复
fsck: File System Check
fsck.FS_TYPE
fsck -t FS_TYPE
-p: 自动修复错误
-r: 交互式修复错误
FS_TYPE一定要与分区上已经文件类型相同
e2fsck:ext系列文件专用的检测修复工具
-y:自动回答为yes
-f:强制修复(当破坏力度比较小时,可能会检测不到,不给修复,使用-f可以强制修复)
也不能查看sda10的状态
能卸载,但是卸载了之后就再也挂不上了
我们使用e2fsck来修复一下
最后修复完成。
df也可以查看到了
7、mount挂载
(1)基础
挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为
卸载:为解除此关联关系的过程
把设备关联挂载点:mount Point
mount
卸载时:可使用设备,也可以使用挂载点
umount
挂载点下原有文件在挂载完成后会被临时隐藏,因此挂载点目录一般为空
(2)挂载方法
挂载方法:mount DEVICE MOUNT_POINT
通过查看/etc/mtab文件显示当前已挂载的所有设备
mount [-fnrsvw] [-t vfstype] [-o options] device dir
device:指明要挂载的设备;
(1) 设备文件:例如/dev/sda5
(2) 卷标:-L 'LABEL', 例如 -L 'MYDATA'
(3) UUID, -U 'UUID':例如 -U '0c50523c-43f1-45e7-85c0-a126711d406e'
(4) 伪文件系统名称:proc, sysfs, devtmpfs, configfs
dir:挂载点
事先存在;建议使用空目录
进程正在使用中的设备无法被卸载
(3)mount常用命令选项
-t 指定要挂载的设备上的文件系统类型(其实正常不需要指定会自动识别,挂载的时候一般不用-t)
如图,只读挂载后不能进行文件下的写操作
-w 读写挂载
--remount,ro|rw 也会更新/etc/fstab中的选项,如果与指定的冲突,则后指定的优先。
-n隐藏挂载信息不显示,不更新/etc/mtab,但在/proc/mounts可以查到
-a读取/etc/fstab,自动挂载其中没有挂载的设备
/etc/fstab是开机之后自动读取的文件,因为开机的时候会自动执行命令mount -a,因此每次开机有些目录已经自动挂载了。
(如图,如果/etc/fstab已经配置好了一个挂载的选项,则使用mount挂载的时候不需要指定两个参数了
使用mount /dev/sda10 或者/mount /app/sda10 都可以挂载成功)
注:如果输入mount不指定选项,则会去读文件中指定的选项,如果输入的选项与文件中的选项冲突,以输入的为准。如果不冲突,则将手动输入的和文件中的选项结合。
-L 'LABEL' 以卷标指定挂载设备
-U 'UUID' 以UUID指定要挂载的设备
-B --bind 目录挂目录,绑定一个目录到另一个目录上
查看内核追踪到的已挂载的所有设备:
cat /proc/mounts
-o options:(挂载文件系统的选项,决定挂载的功能),多个选项使用逗号分隔
sync,async 同步,异步(defaults)
atime(defaults),noatime 是否在读访问时更新atime
diratime(defaults),nodiratime 目录的访问时间戳
auto(defaults)/noauto 写在/etc/fstab当中的分区,表示是否在mount -a时被挂载
exec(defatuls)/noexec 在该分区所挂载的目录中的脚本是否可以执行。
dev(defaults)/nodev 是否支持在此文件系统上使用设备文件
suid(defaults)/nosuid 是否支持suid和sgid权限
remount:重新挂载
ro:只读
rw:读写(defaults)
user/nouser(defaults):是否允许普通用户挂载此设备,默认管理员才能挂载
acl:启用此文件系统上的acl功能
Defaults 默认,见以上中的(defaults)
如图,选项也可以直接写到/etc/fstab中进行配置
(4)卸载命令
findmnt [MOUNT_POINT] 查看挂载情况
lsof MOUNT_POINT 查看正在访问指定文件系统的进程(查到后可以使用kill杀掉)
fuser -v MOUNT_POINT 查看所有在正访问指定的文件系统的进程
fuser -km MOUNT_POINT 终止所有在正访问指定的文件系统的进程
卸载:
umount DEVICE
umount MOUNT_POINT
(5)文件挂载配置文件
/etc/fstab每行定义一个要挂载的文件系统
要挂载的设备或伪文件系统:
设备文件
LABEL:LABEL=""
UUID:UUID=""
伪文件系统名称:proc, sysfs
挂载点
文件系统类型
挂载选项:defaults(如果没有其他选项必须写defaults,因为要占位。如果有其他选项的话,可以不写defaults也是默认值。)
转储频率:0:不做备份 1:每天转储 2:每隔一天转储
自检次序: 0:不自检 1:首先自检(一般只有根文件系统才用1) 2:其次自检 (数字越小越先检测)
网络地址挂载:
172.17.253.164:/common /mnt/nfs nfs defaults 0 0
在服务器配置/etc/export 添加可以共享的文件夹和允许的客户端地址
如图就是共享的文件夹为/common 客户端地址任意
再使用以下命令添加到/etc/fsta文件中挂载:
//172.17.X.X/shares /mnt/share cifs defaults,username=test,password=test 0 0
8、处理交换文件和分区
(1)基本设置
创建交换分区或者文件,并将类型改为swap(记得要更新分区表)
使用mkswap写入特殊签名(格式化)。也可以对文件做。
可以再加个卷标
在/etc/fstab文件中添加适当的条目使其开机自动激活(第一列也可以使用分区名和UUID)
激活成功
(2)手动挂载交换分区
启用:swapon
swapon[OPTION]... [DEVICE]
-a 激活所有的交换分区;
-s 查看优先级(默认随机分配的一般都是负值)
-p PRIORITY:指定优先级(可以指定范围是0-32767)
也可以写到/etc/fstab文件中:pri=value
禁用:swapoff [OPTION]... [DEVICE]
使用free查看内存信息使用状态,显示都为0
9、移动介质
(1)U盘
右键这个图标
点击第一项
点击确定
过一会,桌面上就有U盘了
此时不能直接挂载,需要安装包
在百度上搜索ntfs3q rpm
分别下载el6和el7
(2)光盘
在图形环境下自动启动挂载/run/media/
否则就必须被手工挂载:mount /dev/cdrom /mnt/
eject命令 卸载或弹出磁盘
创建ISO文件
cp /dev/cdrom/root/centos7.iso 将设备做成ISO文件
mkisofs -r -o/root/etc.iso /etc 将目录/etc做成ISO文件
挂载ISO文件
mount -o loop/root/centos69_1.iso /mnt/centos69 (对于光驱设备要加选项-o loop)
写到/etc/fstab文件中:
/root/centos69_1.iso /mnt/centos69 iso9660 defaults,loop 0 0
刻录光盘
wodim –v –eject centos.iso
10、常见工具
(1)内存空间使用状态:
free [OPTION]
-m 以MB为单位
-g 以GB为单位
(2)文件系统空间占用等信息的查看工具:
df [OPTION]... [FILE]...
-h 以人类阅读方式(就是单位显示的便于阅读)
-H 以人类阅读方式 以1000为单位(计算结果大小会与1024有不同)
-T 文件系统类型
-i 显示inodes的使用信息
-a 显示所有的挂载信息,包含bind
(3)查看某目录总体空间占用状态:
du [OPTION]... DIR
-h 以人类阅读方式
-s 显示总和
如果目录下有目录会被列出,如果没有的话只显示总和。
11、工具dd
(1)用法
dd命令:convert and copy a file
用法:
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
bs=#:block size, 复制单元大小
count=#:复制多少个bs
of=file 写到所命名的文件而不是到标准输出
if=file 从所命名文件读取而不是从标准输入
bs=size 指定块大小(既是是ibs也是obs)
ibs=size 一次读size个byte
obs=size 一次写size个byte
cbs=size 一次转化size个byte
skip=blocks 从开头忽略blocks个ibs大小的块
seek=blocks 从开头忽略blocks个obs大小的块
count=n 只拷贝n个记录
备份MBR:
dd if=/dev/sdaof=/tmp/mbr.bak bs=512 count=1
破坏MBR中的bootloader:
dd if=/dev/zeroof=/dev/sda bs=64 count=1
seek=446
(2)示例
有一个大与2K的二进制文件fileA。现在想从第64个字节位置开始读取,需要读取的大小是128Byts。又有fileB, 想把上面读取到的128Bytes写到第32个字节开始的位置,替换128Bytes,实现如下:
#dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc
·备份:
dd if=/dev/sdx of=/dev/sdy
将本地的/dev/sdx整盘备份到/dev/sdy
dd if=/dev/sdx of=/path/to/p_w_picpath
将/dev/sdx全盘数据备份到指定路径的p_w_picpath文件
dd if=/dev/sdx | gzip >/path/to/p_w_picpath.gz
备份/dev/sdx全盘数据,并利用gzip压缩,保存到指定路径
·恢复:
dd if=/path/to/p_w_picpath of=/dev/sdx
将备份文件恢复到指定盘
gzip -dc /path/to/p_w_picpath.gz | dd of=/dev/sdx
将压缩的备份文件恢复到指定盘
·拷贝内存资料到硬盘
dd if=/dev/mem of=/root/mem.bin bs=1024
将内存里的数据拷贝到root目录下的mem.bin文件
·从光盘拷贝iso镜像
dd if=/dev/cdrom of=/root/cd.iso
拷贝光盘数据到root文件夹下,并保存为cd.iso文件
·销毁磁盘数据
dd if=/dev/urandom of=/dev/sda1
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据,执行此操作以后,/dev/sda1将无法挂载,创建和拷贝操作无法执行
(3)得到最恰当的block size
dd if=/dev/zerobs=1024 count=1000000 of=/root/1Gb.file
dd if=/dev/zerobs=2048 count=500000 of=/root/1Gb.file
dd if=/dev/zerobs=4096 count=250000 of=/root/1Gb.file
通过比较dd指令输出中所显示的命令执行时间,即可确定系统最佳的block size大小
测试硬盘写速度:
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
测试硬盘读速度:
dd if=/root/1Gb.file bs=64k | dd of=/dev/null
(4)修复硬盘
dd if=/dev/sda of=/dev/sda
当硬盘较长时间(比如1,2年)放置不使用后,磁盘上会产生消磁点。当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生,且这个过程是安全高效的。