第十四章、磁盘及文件系统管理详解
08_03_磁盘及文件系统管理详解之一
磁盘管理:
机械式硬盘:
U盘、光盘、软盘、硬件、磁带
此处查看PPT: Linux入门.ppt (search: 文件系统)
补充磁盘分区、文件系统、inode,VFS等相关知识后继续。
分区以柱面为单位进行划分。
inode: index node, 保存了文件的信息,大小,属主,属组,时间等。
inode位图,块位图
1. ln [-s -v] SRC DEST
硬链接:
1、只能对文件创建,不能应用于目录;
2、不能跨文件系统;
3、创建硬链接会增加文件被链接的次数;
符号链接:
1、可应用于目录;
2、可以跨文件系统;
3、不会增加被链接文件的链接次数;
4、其大小为指定的路径所包含的字符个数;
2. du: 显示路径下所有目录占用磁盘大小
-s: 路径占用磁盘大小
-h: human readable
3. df: 显示整个磁盘分区使用情况
-i: 显示inode信息替代块信息
-P: posix输出格式(文件名太长不换行)
08_04_磁盘及文件系统管理详解之二
设备文件:
b: 按块为单位,随机访问的设备;如硬盘
c:按字符为单位,线性设备;如键盘
ls -l /dev
主设备号(major number)
标识设备类型
次设备号(minor number)
标识同一种类型中不同设备
设备文件作为设备的访问入口。
tty 命令可以查看对应设备文件
[root@CentOS tmp]# tty
/dev/pts/2
echo "hello" >> /dev/pts/1
mknod
mknod [OPTION]... NAME TYPE [MAJOR MINOR]
-m MODE
硬盘设备的设备文件名:
IDE, ATA:hd
SATA:sd
SCSI: sd
USB: sd
a,b,c,...来区别同一种类型下的不同设备
IDE:
第一个IDE口:主、从
/dev/hda, /dev/hdb
第二个IDE口:主、从
/dev/hdc, /dev/hdd
sda, sdb, sdc, ...
hda分区:
hda1: 第一个主分区
hda2:
hda3:
hda4:
hda5: 第一个逻辑分区
Linux支持的文件系统
传统:ext2, ext3, ext4, reiserfs, xfs, jfs
光盘:iso9660
集群文件系统:GFS2, OCFS2
网络文件系统: NFS, CIFS
低级格式化:将空白的磁盘划分出柱面和磁道,再将磁道划分为若干个扇区等
高级格式化:创建文件系统
VFS:virtual file system
一个分区就是一个独立的文件系统,可以单独格式化
查看当前系统识别了几块硬盘:
fdisk -l [/dev/to/some_device_file]
管理磁盘分区:
fdisk /device/path
p: 显示当前硬件的分区,包括没保存的改动
n: 创建新分区
e: 扩展分区
p: 主分区
l: 逻辑分区
d: 删除一个分区
w: 保存退出
q: 不保存退出
t: 修改分区类型
L:
l: 显示所支持的所有类型
partprobe: 让内核重读分区表,cat /proc/partations 中查看分区表,
partprobe [/dev/sda/]
partx: Redhat6.0中类似partprobe的命令
09_01_磁盘及文件系统管理详解之三
查看Linux入门.ppt(search: 超级块),补充块组、超级块等相关知识。
超级块(Super Block)
描述整个分区的文件系统信息,例如块大小、文件系统版本号、上次mount的时间等等
超级块在每个块组的开头都有一份拷贝
块组描述符表(GDT,Group Descriptor Table)
由很多块组描述符组成,整个分区分成多少个块组就对应有多少个块组描述符
每个块组描述符(Group Descriptor)存储一个块组的描述信息,例如在这个块组中从哪里开始是inode表,从哪里开始是数据块,空闲的inode和数据块还有多少个等等
和超级块类似,块组描述符表在每个块组的开头也都有一份拷贝,这些信息是非常重要的,一旦超级块意外损坏就会丢失整个分区的数据,一旦块组描述符意外损坏就会丢失整个块组的数据,因此它们都有多份拷贝
块位图(Block Bitmap)
块位图就是用来描述整个块组中哪些块已用哪些块空闲的,它本身占一个块,其中的每个bit代表本块组中的一个块,这个bit为1表示该块已用,这个bit为0表示该块空闲可用
与此相联系的另一个问题是:在格式化一个分区时究竟会划出多少个块组呢?主要的限制在于块位图本身必须只占一个块
inode位图(inode Bitmap)
和块位图类似,本身占一个块,其中每个bit表示一个inode是否空闲可用
inode表(inode Table)
一个文件除了数据需要存储之外,一些描述信息也需要存储,例如文件类型(常规、目录、符号链接等),权限,文件大小,创建/修改/访问时间等,也就是ls -l命令看到的那些信息,这些信息存在inode中而不是数据块中
每个文件都有一个inode,一个块组中的所有inode组成了inode表
inode表占多少个块在格式化时就要决定并写入块组描述符中
mke2fs格式化工具的默认策略是一个块组有多少个8KB就分配多少个inode
数据块(Data Block)
对于常规文件,文件的数据存储在数据块中
对于目录,该目录下的所有文件名和目录名存储在数据块中,文件名保存在它所在目录的数据块中
除文件名之外,ls -l命令看到的其它信息都保存在该文件的inode中
目录也是一种文件,是一种特殊类型的文件
对于符号链接,如果目标路径名较短则直接保存在inode中以便更快地查找,如果目标路径名较长则分配一个数据块来保存
设备文件、FIFO和socket等特殊文件没有数据块,设备文件的主设备号和次设备号保存在inode中
inode table格式:
ext3比ext2多一个日志区,存入元数据区的inode,先放入日志区,文件写完成后移动到元数据区
09_02_磁盘及文件系统管理详解之四
文件系统管理
格式化:重新创建文件系统会损坏原有文件
创建分区
1. fdisk /dev/sda
2. n -> e -> 4 -> <Enter> -> <Enter> 创建一个扩展分区,使用MBR第四个位置,从开头到结尾(使用所有剩余的空间)
3. n -> +5G 创建一个5G的逻辑分区
4. w 保存退出
5. partprobe /dev/sda 让内核识别新建分区,cat /proc/partitions
mkfs: make file system,创建文件系统
-t FSTYPE:指定文件系统类型
cat /proc/filesystems : 查看当前内核所支持文件系统类型
文件系统类型:
ext2
ext3:比ext2多一个journal区
vfat: fat32
mkfs其实会调用其他的程序
mkfs -t ext2 = mkfs.ext2
mkfs -t ext3 = mkfs.ext3
专门管理ext系列文件系统:
1. mke2fs
-j: 创建ext3类型文件系统
-b BLOCK_SIZE: 指定块大小,默认为4096;可用取值为1024、2048或4096;
-L LABEL:指定分区卷标;
-m #: 指定预留给超级用户的块数百分比
-i #: 用于指定为多少字节的空间创建一个inode,默认为8192;这里给出的数值应该为块大小的2^n倍;
-N #: 指定inode个数;
-F: 强制创建文件系统;
-E: 用户指定额外文件系统属性;
2. blkid: 查询或查看磁盘设备的相关属性
UUID:通用唯一识别码 (Universally Unique Identifier)
TYPE:文件系统类型
LABEL: 卷标
3. e2label: 用于查看或定义卷标
e2label 设备文件卷标: 设定卷标
4. tune2fs: 调整文件系统的相关属性
-j: 不损害原有数据,将ext2升级为ext3;
-L LABEL: 设定或修改卷标;
-m #: 调整预留百分比;
-r #: 指定预留块数;
-o: 设定默认挂载选项;
acl
-c #:指定挂载次数达到#次之后进行自检,0或-1表关闭此功能;
-i #: 每挂载使用多少天后进行自检;0或-1表示关闭此功能;
-l: 显示超级块中的信息;
5. dumpe2fs: 显示文件属性信息
-h: 只显示超级块中的信息
6. fsck: 检查并修复Linux文件系统
-t FSTYPE: 指定文件系统类型
-a: 自动修复
7. e2fsck: 专用于修复ext2/ext3文件系统
-f: 强制检查;
-p: 自动修复;
一个文件系统想要使用必须挂载到根文件系统
挂载:将新的文件系统关联至当前根文件系统
卸载:将某文件系统与当前根文件系统的关联关系预以移除;
8. mount:挂载
mount 设备 挂载点
设备:
设备文件:/dev/sda5
卷标:LABEL=“”
UUID: UUID=“”
挂载点:目录
要求:
1、此目录没有被其它进程使用;
2、目录得事先存在;
3、目录中的原有的文件将会暂时隐藏;
新挂载的文件系统下会出现
新建的文件系统: lost+found 目录
mount: 显示当前系统已经挂载的设备及挂载点
mount [options] [-o options] DEVICE MOUNT_POINT
-a: 表示挂载/etc/fstab文件中定义的所有文件系统
-n: 默认情况下,mount命令每挂载一个设备,都会把挂载的设备信息保存至/etc/mtab文件;使用-n选项意味着挂载设备时,不把信息写入此文件;
-t FSTYPE: 指定正在挂载设备上的文件系统的类型;不使用此选项时,mount会调用blkid命令获取对应文件系统的类型;
-r: 只读挂载,挂载光盘时常用此选项
-w: 读写挂载
-o: 指定额外的挂载选项,也即指定文件系统启用的属性;
remount: 重新挂载当前文件系统
ro: 挂载为只读
rw: 读写挂载
e.g: mount -o remount,ro /dev/sda5
挂载完成后,要通过挂载点访问对应文件系统上的文件;
9. umount: 卸载某文件系统
umount 设备
umount 挂载点
-l: 强制卸载
卸载注意事项:
挂载的设备没有进程使用;
练习:
1、创建一个2G的分区,文件系统为ext2,卷标为DATA,块大小为1024,预留管理空间为磁盘分区的8%;挂载至/backup目录,要求使用卷标进行挂载,且在挂载时启动此文件系统上的acl功能;
# mke2fs -L DATA -b 1024 -m 8 /dev/sda7
# mount -o acl LABEL=DATA /backup
或分两步:
# tune2fs -o acl /dev/sda7
# mount LABEL=DATA /backup
2、将此文件系统的超级块中的信息中包含了block和inode的行保存至/tmp/partition.txt中;
# tune2fs -l | egrep -i "block|inode" >> /tmp/partition.txt
# dumpe2fs -h | egrep -i "block|inode" >> /tmp/partition.txt
3、复制/etc目录中的所有文件至此文件系统;而后调整此文件系统类型为ext3,要求不能损坏已经复制而来的文件;
# cp -r /etc/* /backup
# tune2fs -j /dev/sda7
4、调整其预留百分比为3%;
# tune2fs -m 3 -L DATA /dev/sda7
5、以重新挂载的方式挂载此文件系统为不更新访问时间戳,并验正其效果;
# stat /backup/inittab
# cat /backup/inittab
# stat
# mount -o remount,noatime /backup
# cat
# stat
6、对此文件系统强行做一次检测;
e2fsck -f /dev/sda7
7、删除复制而来的所有文件,并将此文件系统重新挂载为同步(sync);而后再次复制/etc目录中的所有文件至此挂载点,体验其性能变化;
# rm -rf /backup/*
# mount -o remount,sync /backup
# cp -r /etc/* /backup
09_03_磁盘及文件系统管理详解之五
swap分区: 类似windows的虚拟内存
page out = swap in
page in = swap out
free: 查看当前系统上物理内存和交换分区的使用情况
-m: MB为单位显示
# free -m
total used free shared buffers cached
Mem: 490 394 95 0 142 101
-/+ buffers/cache: 149 340
Swap: 1023 0 1023
-/+ buffers/cache: 149(减去buffers+cached) 340(加上buffers+cached)
buffer: 存放元数据
cache: 存放数据
创建交换分区: mkswap, swapon
1. fdisk /dev/sda
2. n -> <Enter> -> +1G 创建一个新分区,大小1G
3. t -> 8 -> L -> 82 调整分区类型为82(Linux swap),L查看可用分区类型
4. w
5. mkswap /dev/sda8 创建交换分区文件系统
-L LABEL
6. swapon /dev/sda8 启用交换分区
-a:启用所有的定义在/etc/fstab文件中的交换设备
swapoff /dev/sda8 关闭交换分区
回环设备:使用软件来模拟实现硬件
loopback, 使用软件来模拟实现硬件
如果磁盘已经没有空间可以创建新的分区,可以创建一个镜像文件,当作一块硬盘来用。
dd命令:
if=数据来源
of=数据存储目标
bs=# :block size,以多大为单位,如1M
count=#:计数
seek=#: 创建数据文件时,跳过的空间大小;
dd if=/dev/zero of=/root/tmp seek=1023 bs=1M count=1
表示跳过1023个bs,复制1个bs,ls查看文件大小为1G,du -sh 查看文件实际只有1M
dd不以文件为单位,而直接复制文件流,可以实现只复制一部分文件。
e.g:
dd if=/dev/sda of=/mnt/usb/mbr.backup bs=512 count=1 备份磁盘MBR
dd if=/mnt/usb/mbr.backup of=/dev/sda bs=512 count=1 恢复MBR
使用文件创建swap分区:
1. dd if=/dev/zero of=/var/swapfile bs=1M count=1024 创建一个1G的文件
2. mkswap /var/swapfile
3. swapon /var/swapfile
cat /dev/cdrom > /root/rhel5.iso 把光盘制作成ISO镜像
/dev/null :数据黑洞,吞噬一切数据
/dev/zero:数据泡泡,产生无限0
mount命令,可以挂载iso镜像;
mount DEVICE MOUNT_POINT
-o loop: 挂载本地回环设备
文件系统的配置文件/etc/fstab
OS在初始时,会自动挂载此文件中定义的每个文件系统
如果只是使用命令:mount /dev/sda5 /mnt/test,重启后挂载的文件就不存在了
/etc/fstab 格式:
要挂载的设备 挂载点 文件系统类型 挂载选项 转储频率(每多少天做一次完全备份) 文件系统检测次序(只有根可以为1)
/dev/sda5 /mnt/test ext3 defaults 0 0
mount -a:挂载/etc/fstab文件中定义的所有文件系统
fuser: 查看正在使用文件或套接字文件的进程
-v: 查看某文件上正在运行的进程
-k: kill
-m: mount
fuser -km MOUNT_POINT:终止正在访问此挂载点的所有进程
练习:
1、创建一个5G的分区,文件系统为ext3,卷标为MYDATA,块大小为1024,预留管理空间为磁盘分区的3%,要求开机后可以自动挂载至/data目录,并且自动挂载的设备要使用卷标进行引用;
# fdisk /dev/sdb
n -> p -> <Enter> -> +5G -> w
# mke2fs -j -L MYDATA -b 1024 -m 3
# mkdir /data
# vi /etc/fstab加一行
LABEL='MYDATA' /data ext3 default 0 0
2、创建一个本地回环文件/var/swaptemp/swapfile来用于swap,要求大小为512MB,卷标为SWAP-FILE,且开机自动启用此交换设备;
# mkdir /var/swaptemp
# dd if=/dev/zero of=/var/swaptemp/swapfile bs=1M count=512
# mkswap -L SWAP-FILE /var/swaptemp/swapfile
# vi /etc/fstab
/var/swaptemp/swapfile swap swap defaults 0 0
3、上述第一问,如何让其自动挂载的同时启用ACL功能;
#vi /etc/fstab
LABEL='MYDATA' /data ext3 defaults,acl 0 0