磁盘及文件系统
硬盘的物理构成:
扇区(sector)、磁道(track)、磁头、柱面(cylinder)
分区:就是记录每一个分区的起始柱面和结束柱面。分区信息存放在0柱面0磁头1扇区上:MBR 主引导记录(446字节)+DPT磁盘分区表(64字节)+结束标志(2个字节)
硬盘的主引导记录(MBR)是不属于任何一个操作系统的,它先于所有的操作系统而被调入内存,并发挥作用,然后才将控制权交给主分区(活动分区)内的
操作系统,并用主分区信息表来管理硬盘。
文件系统是操作系统用于明确存储设备(常见的是磁盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。
block :数据存储的最小单元
inode:索引节点,全局唯一编号,除了记录文件的属性外,同时还具有指针功能,指向文件内容放置的快
(里面保存的是文件的权限,所有者,所属主等基本信息)
1、文件的拥有者与用户组(owner/group)
2、文件的访问模式(read/write/excute)
3、文件的类型(type)
4、文件建立或状态改变的时间(ctime)、最近一次的读取时间(atime)、最近修改时间(mtime)
5、文件的大小
6、定义文件属性的标志(flag),如setUID...
7、文件真正内容的指针(pointer)
创建目录:分配一个inode和至少一个block
inode记录该目录的相关属性,并指向分配到的那个快;
block记录在这个目录下的相关文件(或目录)的关联性
创建文件:分配至少一个inode与相对于该文件大小的快数量
inode不记录文件名,而是记录文件的相关属性,文件名记录在目录所属的block区域
例如:读取/etc/crontab的流程如下:
1、操作系统根据根目录(/)的相关数据可获取/etc目录所在的inode,并读取/etc这个目录所有相关属性
2、根据/etc的inode的数据,可以获取/etc目录下所有文件的关联数据是放置在哪一个block中,并前往该block读取文件的关联性内容
3、由上步骤的block中,可以知道crontab文件的inode所在地,并前往该inode
4、由上步骤的inode中,可以获取crontab文件的所有属性,并前往由inode所指向的block区域,获取crontab文件内容
块组:block group 对用户是不可见的,子逻辑区域,有个超级标示区
文件系统构成:(dumpe2fs 可以查看)
superblock(超级块):记录整个文件系统相关信息
1、block与inode的总量
2、未使用和已使用的inode/block数量
3、文件系统的载入时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息
4、有效位的值,已载入为0,未载入为1
group description(组描述):记录此block由何处开始记录
block bitmap(快位图):此处记录block是否使用
inode bitmap(inode位图):此处记录inode是否使用
inode table(inode表):为每个inode的数据存放区
data block(数据块):为每个block的数据存放区
metadata bitmap (块位图)dentry 目录项
创建文件:先在目录下创建一个条目,把名字和iNode对应上,回到源数据,指定块位置
删除文件:删除条目里面的名字和iNode对应关系,将对应的iNode标记为0
通过inode号码来删除文件:find ./ -inum 400935 -exec rm -rf {} \;
extundelete: linux下高效数据恢复工具 http://extundelete.sourceforge.net/ 安装时需要的依赖包 e2fsprogs-lib e2fsprogs-devel
复制文件:不同的inode和block
剪切文件:同一个分区,inode号和磁盘块位置都没有变,只是把条目里面的名字改变了一下
链接:硬链接和软链接(符号链接),多个文件指向同一个iNode,硬链接;符号连接,指向的是源文件的路径,而不是文件块
ln (link) [-s -v] 源文件 链接
硬链接:在某个目录下的block中增加一个文件关联数据,不会用到inode与磁盘空间
只能对文件进行创建,为了避免循环引用
不能跨文件系统,可以在不同目录下
创建硬链接可以增加文件被连接的次数
符号链接:建立一个独立的文件,这个文件会让数据的读取指向它连接的文件内容
可以对目录创建
可以跨文件系统
不会增加被链接文件的链接次数
其大小为指定路径所包含的字符个数
-b 删除,覆盖以前建立的链接
-d 允许超级用户制作目录的硬链接
-f 强制执行
-i 交互模式,文件存在则提示用户是否覆盖
-n 把符号链接视为一般目录
-s 软链接(符号链接)
-v 显示详细的处理过程
du 查看文件大小 [-s -h ]
-s 只分别计算命令列中每个参数所占的总用量
-h 做单位转换
df 查看硬盘使用情况
-i 查看inode的使用情况
-P 不换行显示
-h 做单位转换
设备文件:
b:块设备文件,以块为单位,随机访问
c: 以字符为单位,是线性设备,访问时有先后顺序
例:ls -l /dev
主设备号(标示设备类型,major number)
次设备号(标示同一类型的不同设备,minor number)
创建设备文件:mknod -m name type major ninor
硬盘的设备文件名:
IDE ATA :hd
SATA SCSI USB :sd
a b c ....来区别同一种类型下的不同设备
IDE: 第一个IDE口,控制器,主 从hda hdb
第二个IDE口,主从 hdc hdd
fdisk 查看当前系统识别的硬盘和分区的情况
fdisk -l [/dev/to/smoe_device_file]
还可用来管理分区
fdisk /dev/sda
p:显示当前硬件的分区,包括没有保存的改动
n:创建一个新的分区
d:删除一个分区
w:保存并退出
q:不保存退出
t:修改分区类型(文件系统类型)
l:显示所支持的所有类型
cat /proc/partitions 查看分区
partprobe [/dev/sda] 通知操作系统分区表的变化
partx -a [/dev/sda] 告诉内核磁盘分区是否存在及其编号
cat /proc/filesystem 查看文件系统类型
高级格式化:mkfs -t ext4
mkfs -t msdos /dev/hdb3
mkfs.ext2 、mkfs.ext3 、mke2fs
-b:分区时设定每个数据区块占用空间大小,目前支持1024, 2048 以及4096 bytes每个块。
-i:设定inode大小
-N:设定inode数量,有时使用默认的inode数不够用,所以要自定设定inode数量。
-c:在格式化前先检测一下磁盘是否有问题,加上这个选项后会非常慢
-L:预设该分区的标签label
-j:建立ext3格式的分区,如果使用mkfs.ext3 就不用加这个选项了
查看磁盘超级块的信息:
tune2fs -l /dev/sda[n] 调整ext2/ext3/ext4文件系统参数
dumpe2fs -h /dev/sda[n] 显示ext2/ext3/ext4文件系统信息
二.swap
swap分区:主要是用来内存过载使用,可以和内存上暂停进程的页面保存在swap分区中,再次启用时再分配页面,pageoutswap分区:主要是用来内存过载使用,可以和内存上暂停进程的页面保存在swap分区中,再次启用时再分配页面,pageout pagein ,swap out swap in ,发现有频繁的换进和换出的时候就需要加内存。
1.虚拟内存:
虚拟地址:线性地址;
页面的换进和换出,允许了内存的过载使用
计存器1纳秒,缓存10纳秒,内存10毫秒,磁盘秒
free 查看物理内存和交换空间使用情况
-m
buffers 缓冲 cached 缓存
fdisk命令中,调整分区类型为82;
创建交换分区:
格式化:# mkswap /dev/sda8,先调整分区类型为82,fdisk,
-L LABEL
swapon /dev/sda8,启用该交换空间
-a:启用所有的定义在/etc/fstab文件中的交换设备
swapoff /dev/sda8
回环设备
loopback, 使用软件来模拟实现硬件
创建一个镜像文件,120G,当作一个硬件设备来使用
dd命令:
if=数据来源
of=数据存储目标
bs=1
count=2
seek=#: 创建数据文件时,跳过的空间大小;
dd if=/dev/sda of=/mnt/usb/mbr.backup bs=512 count=1
dd if=/mnt/usb/mbr.backup of=/dev/sda bs=512 count=1
可用来备份和恢复mbr
dd if=/dev/zero of=/var/swapfile bs=1M count=1024
seek 跳过多大的空间
mkswap 格式化为swap分区
1、通过fdisk创建swap分区或者使用dd命令创建一个虚拟内存的文件
dd if=/dev/zero of=/tmp/swap bs=1M count=1024
2、mkswap进行swap分区格式化
3、swapon 激活swap分区
swapoff 关闭swap分区
mount:挂载命令
命令格式:mount [-t vfstype] [-o options] device dir
-a 挂载fstab中提到的所有文件系统
-o remount 重新挂载已挂载的文件系统
-o loop:用来把一个文件当成硬盘分区挂接上系统
-o ro:采用只读方式挂接设备
-o rw:采用读写方式挂接设备
挂接光盘镜像文件
1、从光盘制作光盘镜像文件。将光盘放入光驱,执行下面的命令。
#cp /dev/cdrom /home/sunky/mydisk.iso 或
#dd if=/dev/cdrom of=/home/sunky/mydisk.iso
2、挂载光盘镜像文件
#mount -o loop -t iso9660 /home/sunky/mydisk.iso /mnt/vcdrom
三.自动挂载
文件系统的配置文件/etc/fstab
OS在初始时,会自动挂载此文件中定义的每个文件系统
要挂载的设备 挂载点 文件系统类型 挂载选项 转储频率(每多少天做一次完全备份) 文件系统检测次序(只有根可以为1)
/dev/sda5 /mnt/test ext4 defaults 0 0
mount -a:挂载/etc/fstab文件中定义的所有文件系统
/etc/fstab文件 实现开机自动挂载
设备 挂载点 文件系统类型 挂载参数 是否执行备份命令dump 是否启动使用fsck扫描磁盘
fuser: 验正进程正在使用的文件或套接字文件
-v: 查看某文件上正在运行的进程
-k:
-m:针对目录,也就是挂载点,一般和-k 一起使用
fuser -km MOUNT_POINT:终止正在访问此挂载点的所有进程
wodim --devices 查看设备名(没有挂载的光盘)
练习:
1、创建一个5G的分区,文件系统为ext4,卷标为MYDATA,块大小为1024,预留管理空间为磁盘分区的3%,要求开机后可以自动挂载至/data目录,并且自动挂载的设备要使用卷标进行引用;
2、创建一个本地回环文件/var/swaptemp/swapfile来用于swap,要求大小为512MB,卷标为SWAP-FILE,且开机自动启用此交换设备;
# mkdir /var/swaptemp
# dd if=/dev/zero of=/var/swaptemp/swapfile bs=1M count=512
# mkswap LABLE=SWAP-FILE /var/swaptemp/swapfile
/etc/fstab
/var/swaptemp/swapfile swap swap defaults 0 0
3、上述第一问,如何让其自动挂载的同时启用ACL功能;
/etc/fstab
LABEL='MYDATA' /data ext4 defaults,acl 0 0
Linux: 查看VFS结构图
VFS:virtual filesystem ,interface:system call
当前,除了Linux标准的文件系统Ext2/Ext3/Ext4外,还有很多种文件系统,比如reiserfs, xfs, Windows的vfat NTFS,
网络文件系统nfs 以及flash 文件系统jffs2, yaffs/yaffs2 ubifs。
linux通过叫做VFS的中间层对这些文件系统提供了完美的支持。
VFS存在的意义
1. 向上,对应用层提供一个标准的文件操作接口;
2. 对下,对文件系统提供一个标准的接口,以便其他操作系统的文件系统可以方便的移植到Linux上;
3. VFS内部则通过一系列高效的管理机制,比如inode cache, dentry cache 以及文件系统的预读等技术,
使得底层文件系统不需沉溺到复杂的内核操作,即可获得高性能;
4. 此外VFS把一些复杂的操作尽量抽象到VFS内部,使得底层文件系统实现更简单
VFS 是一种软件机制,也许称它为 Linux 的文件系统管理者更确切点,与它相关的数据结构只存在于物理内存当中。
所以在每次系统初始化期间,Linux 都首先要在内存当中构造一棵 VFS 的目录树(在 Linux 的源代码里称之为 namespace),
实际上便是在内存中建立相应的数据结构。
VFS: virtual filesystem 中间层
每个分区都是一个单独的文件系统
物理和逻辑之间的关系