文章目录
管理员需知:
文件系统多大,超级块和GDT位置,备份是否足够,分了多少磁盘块,是否产生磁盘碎片,是否需要修复。
inode数,块数,片(fragment)数,
12.磁盘及文件系统
磁盘属于io设备
扇区大小一般512B
一个文件可能存储于多个盘面(柱面cylinder)
硬盘设备的设备文件名
- IDE,ATA:hd
- SATA:sd
- SCSI:sd
- USB:sd
次设备号一般用a、b、c…
IDE一般两个口
第一个口:主(/dev/hda),从(/dev/hdb)。
第二个口:主(/dev/hdc),从(/dev/hdd)。
12.1 格式化
- 低级格式化:划分磁道
- 高级格式化:分区partition,创建独立的文件系统
磁盘分区也是按柱面进行的,磁针读写方便。
磁盘性能指标:平均寻道时间,转速等
笔记本:5400转/min(rpm)
台式:7200转/min转得快,发热也大,盘芯是真空的,不能有灰尘。
外道效率高,频繁访问的数据应放在外道,比如C盘。
分区有两阶段:
- 存储元数据(meta data)
- 存储数据块(block)
硬盘分区三主一扩展,扩展分区之下还有逻辑分区,它们也有编号。
- hda1-4:主分区,扩展分区(1-4不确定)
- hda5开始为逻辑分区
块、位图、inode
块位图bitmap,可加速查找空闲块。0位表示空闲。
inode位图和块位图:
每个文件都需要条目(inode,即index node索引节点),它存储了ls -l等属性,不存储文件名,而且也需要位图。它要指向文件块,分为直接和间接指向,数量和文件大小有关,fat32规定文件最大4G.
目录也是文件,实际是路径映射表,也需要磁盘块(dentry,目录项)。
每一行格式为:inode,record_len,name_len,file_type,name
eg.
21-12-1-2-.\0\0\0
22-12-2-2-…\0\0
34-12-4-2-sbin
一个块属于一个文件,可有不同路径(inode)。
常用块大小:1k,2k,4k
页大小通常4k
为了位图尽可能小,先将块划分块组。
一个分区有多大取决于inode位图和块位图大小。
磁盘空间结构
boot block – block group 0 – block group1 --…-- block group n每个块组(block group)结构如下
super block – GDT – Block Bitmap – Inode Bitmap – Inode Table – Data Blocks
- 超级块(super block):记录分区全局信息,如创建了多少块组,每组多少块,块大小,空闲/引用磁盘块,空闲/引用inode。 它有多个备份,但也不是每个块组都有,默认块组0的超级块为主超级块,其余为备份块。一个损坏后找下一个,或者手动命令修复。
- 块组描述符(GDT):记录块组的名称,起始块,结束块。
一般有5%的块预留给超级用户,以备分区满后管理员修复工作还有多余空间可用。
硬盘相关命令
du #显示指定的目录或文件所占用的磁盘空间。
-s # 整个目录大小
-h --human-readable
df #显示目前在Linux系统上的文件系统的磁盘使用情况统计
-P #posix显示
-i #显示inode信息
mknod #创建设备文件
#设备文件主要目的是作为设备的访问入口,要确保设备号和设备关联,并被内核识别。
#识别后,发往设备文件的内容都会发往设备。
mknod [OPTION]... NAME TYPE [MAJOR MINOR]
mknod -m 640 mydev1 c 666 1
fdisk -l
# 查看识别了几块硬盘
# start和end是指柱面(cylinder)
fdisk -l /dev/sda
创建分区
有剩余柱面和分区编号就可以创建分区
若已经有3个主分区,则只能创建扩展分区,否则剩余空间必须给第4个主分区。
fdisk /dev/sda #打开交互界面
p #print the partition table
n #add a new partition
d #delete a partition
w #write table to disk and exit
q #quit without saving changes
t #change a partition type
# n之后指定结束柱面时可以+10G指定大小,但因为以柱面为单位,所以有误差。
# 扩展分区只是指针,不能直接使用,还需要再次n,创建逻辑分区。
# 创建完分区后,执行partprobe命令(redhat6还有partx命令)
parprobe [/dev/sda]
# inform the OS of partition table changes.
filesystem label(卷标):分区的名字。重新开机后不怕分区次序打乱。
12.3 MBR
MBR(master/main boot record)
:位于0盘面0磁道0扇区的512Bytes,不属于任何系统,是全局的。
它划分为三部分:
- 446Bytes:BootLoader
- 64Bytes:3个主分区*16 Bytes + 1个扩展分区
- Magic Number:2 Bytes,标记MBR是否有效
如果执行
echo "hello" >> /dev/sda
则开头的mbr会被覆盖
12.4 文件
在Linux中表示一个文件的方式是通过两个部分来分别表示的:用户数据(user data)与元数据(meta data)。什么是用户数据呢?用户数据就是记录真实文件内容的数据,这些数据是存放在一个个大小相等的文件数据块中(data block)。
元数据呢?其实就是这个文件的附加信息属性,例如:创建时间,文件大小等等这类信息。我们用索引号(inode)来表示每一个不同文件的元数据(当然inode也是元数据的一部分)。在Linux中,inode才是表示文件的唯一标识,而不是文件名。下图展示了怎样通过文件名来找到文件内容的。注意:元数据中并不包含文件名。文件名只是为了方便用户识别和记忆罢了。
可以使用stat
和ls -i
命令可以查看
创建文件(如/tmp/text)的过程:
- 扫描inode位图找一空闲inode及对应块,建立条目[inode,text]
- 再扫描块位图,分配数据块。
删除文件过程:
- 删除条目
- inode位图和块位图标记为0。
所以数据可以恢复。文件粉碎机原理是覆盖数据块。
复制文件慢;剪切数据只需要转移目录项,更快,前提是同一分区,因为路径不能跨分区引用;跨分区剪切则是在目标区新建,原分区删除。
链接文件
硬链接即多个路径指向同一inode
- 只针对文件,目录不能创建,避免死循环。
- 不能对不存在的文件创建硬链接
- 不能跨文件系统,因为在各自文件系统下inode是唯一的,当跨文件系统就会出现inode重复的情况发生
- 目录默认有2个硬链接,因为路径下有个.目录
- 如果删除了一个硬链接文件,并不会影响其他的同inode文件(inode中存在链接计数器,删除一个硬链接相当于计数器减一,反之加一。直到为0,删除inode)
软链接即路径指向另一路径(字符串,大小为字符个数)
- 软连接有自己的文件属性
- 可以对不存在的文件创建
- 可用于目录
- 可跨文件系统
- 不会增加被链接文件的链接次数
- 大小为字符个数
ls -l
第二个字段为硬链接次数,等于0时才真正无法访问
ls -i
显示inode号
ln src dest命令,创建硬链接
ln -s src dest命令,创建软链接
12.5 文件系统
文件系统属于内核功能;管理程序属于用户进程。
fs列举:
fat32(vfat),ntfs,iso9660,cifs,ext2/3/4,xfs,reiserfs,jfs
nfs,ocfs2,gfs,swap
cat /proc/filesystems显示系统支持的fs
(/proc有很多内核相关信息)
学会内核管理后可以自己添加
vfs
不同文件系统的内核接口是不同的,一般各种文件系统上再加一层软件提供同一接口用于system call
,开发程序就不需要考虑兼容性了。
中间这一层就是virtual filesystem(vfs)
,它让linux支持多种fs(沙漏模型)。
关键词:
ring0-3,用户空间,用户模式,内核空间,内核模式。
大多数进程运行在用户空间,没有特权。
ext系统
ext3又称为日志文件系统(journal file system)
日志是磁盘空间的第三个独立区域(另外两个是数据区和元数据区)。
存储文件步骤
- 先把inode存到日志区(而不是元数据区),然后存数据;
- 这时如果损坏(断点),只需检查日志区有哪些文件需要修复;
- 存完后,将inode从日志区移回元数据区。
相对ext2加快了数据修复速度。缺点是多一次io操作。
mount
挂载:将新的文件系统关联至当前根文件系统。
卸载:将某文件系统与当前根文件系统的关联关系移除。
device可以是:
-
设备文件:/dev/sda5
-
卷标:LABEL=""
-
UUID:UUID=""
mount-point(目录)要求:
-
没有被其它进程使用
-
目录事先存在
-
目录中的文件会暂时隐藏
挂载完成后,要通过挂载点访问对应文件系统上的文件。
新建的文件系统都会有lost+found目录
# mount [device mount-point]
# 无参执行mount会显示当前已挂载设备及挂载点。
mount /dev/sda5 /mnt/test/
# 卸载
umount [ device | mount-point ]
# 卸载时,设备不能有进程使用。
mount
-a, --all
#Mount all filesystems (of the given types) mentioned in /etc/fstab
-n, --no-mtab
#Mount without writing in /etc/mtab.默认会将挂在的设备信息保存至该文件。
-t, type #不指定时会使用blkid获取类型。
-r, --read-only
# Mount the filesystem read-only.
-w, --rw, --read-write
# Mount the filesystem read/write.
-o #指定额外的挂载选项,即文件系统启用的属性。可以多选项(-o remount,ro mount-point)
async # 异步
sync # 同步
#关于异步同步
# 对于io请求,先内存操作再读写硬盘,则是异步;内存操作同时保存入硬盘,则是同步。
# 同步安全,但慢。一般都是异步。
atime/noatime #是否更新时间戳(io影响性能)
auto # Can be mounted with the -a option.
defaults # Use the default options: rw, suid, dev, exec, auto, nouser, and async.
dev # Interpret character or block special devices on the filesystem.
exec/noexec # Permit execution of binaries.
_netdev
# The filesystem resides on a device that requires network access
# (used to prevent the system from attempting to mount these filesys‐
# tems until the network has been enabled on the system).
owner
#Allow an ordinary user to mount the filesystem if that user is the
# owner of the device.
remount
ro #read-only
suid #对于外来设备一定要nosuid
若另一用户正访问设备,则无法umount,此时可以fuser -v /挂载点
查看谁正在访问。
执行fuser -km /mount-point
杀死正访问挂载点的所有进程,然后umount
创建文件系统相关命令
mkfs [options] [-t fstype] [fs-options] device [size]
mkfs -t ext2 /dev/sda5
mkfs -t ext3
# mkfs还有别名
# mkfs.ext3 mkfs.fat mkfs.ntfs mkfs.ext4
# mkfs -t ext2 相当于 mkfs.ext2
# mkfs -t fat32 相当于mkfs.vfat
#专门管理ext系列文件的命令
mke2fs
-j: journal options,直接创建ext3
-b: block-size,1024/2048/4096(默认)
-L: volume-label,指定卷标
-m N:reserved-blocks-percentage,超级用户预留百分比
-i: bytes-per-inode,给定值应为块大小的2^n倍,默认8192
-N: number-of-inodes
-F:Force mke2fs to create a filesystem
-E extended-options:Set extended options for the filesystem
e2label # Change the label on an ext2/ext3/ext4 filesystem
e2label device [ new-label ]
tune2fs [options] device # adjust tunable filesystem parameters on ext2/ext3/ext4 filesys‐tems
-j 数据无损地将ext2升级为ext3(升级可以,降级不可以)
-L volume-name
-m 同mke2fs
-r reserved-blocks-count
-o [^]mount-option[,...]:设置默认挂载选项,常用acl
-c max-mount-counts
-C mount-count:挂载多少次后自检,0或-1表示关闭该功能。
-i interval-between-checks[d|m|w]:自检间隔天/月/周数,0或-1表示关闭该功能。
-l List the contents of the filesystem superblock
-h 只显示超级块信息。
# 除了tune2fs,dumpe2fs命令也能显示文件系统信息
tune2fs -c # or -i 修改自检期限(挂载次数或天数)
# free blocks字段如果是离散的,说明出现了碎片。
blkid /dev/sda # 查看设备属性
#- locate/print block device attributes(UUID,FSTYPE,LABEL)
#UUID:统一的全局标识符,足够长的系统随机数,用于标识磁盘设备。
fsck #check and repair a Linux filesystem。即手动检查。
-t FSTYPE
-a:自动修复,检出错后不询问。
e2fsck #check a Linux ext2/ext3/ext4 file system。
-p:自动修复
-f:强制检查
12.6 swap
os通过分时(timesharing)或多路复用(multiplex)分配资源
计算机3个重要组件的虚拟方法:
CPU:time slice
io设备:多路复用
memory(内存):虚拟地址
内存:x86(32bit)引入虚拟地址,也叫线性地址。每个进程都假设自己有4G内存可用,并不真实存在。这4G分为3G内存和1G内核。大多数进程只使用这3G的一小部分。这3G是分页的,物理内存是划分页框的(大小4K),进程会由3G里的页映射到页框。
如果物理内存页框已满,则会把硬盘模拟为内存并划分页框,把物理内存的最近最少使用页面转移进来(page out,swap in),消除映射关系。再次使用硬盘里的这些页面时,则会移回物理内存(page in,swap out),重新映射。这个过程叫做换进换出,硬盘的这些空间叫做交换空间。
交换空间允许内存过载使用(overcommit)。换进换出影响效率,只用于应急,但必不可少。
交换空间是一个单独的分区,叫做swap分区。该区仍然慢的话,可以再分一个。建议分在靠外的柱面上或使用SSD(但不比内存便宜…)。
swap used为0是最好的。linux和windows不同,windows可能开始就使用虚拟内存(不叫交换空间)。
free命令
# Display amount of free and used memory in the system
可以查看物理内存和交换空间使用情况。
-m #以m为单位
# 注意used-buffer/cache和free+buffer/cache,缓冲和缓存都是为了提高os性能设置的,可以没有,即可以算入used,也可以算入free。
buffer和cache
buffer:缓冲,用于写入快,读取慢的情况。
cache:缓存,用于写入慢,读取快的情况。数据可重复使用。
空间不够用时,仍然是清理LRLU策略。
添加swap分区
# 1. 先新建分区
sudo fdisk /dev/sda
# l命令查看,类型默认为linux(83H),swap为82H。
# n新建分区
# t转换为82(重点)
parprobe /dev/sda
# 2. 然后创建swap分区
mkswap命令
mkswap /dev/sda6
-L LABEL
# 3. 挂载
#使用swapon命令,而不是使用mount命令
swapon /dev/sda6
swapoff /dev/sda6关闭
lookback
实在没有空间时,则创建一个回环设备lookback(使用软件模拟硬件)
# 1.制作镜像
cat /dev/cdrom > /test.iso
# 或者dd
dd if=/dev/zero of=/var/swapfile bs=1M count=1024
mkswap /var/swapfile
swapon /var/swapfile
free -m #查看
#mount命令可以挂载iso镜像
wget REDHAT.iso
mount REDHAT.iso /media/ #然后会显示iso不是块设备
#所以需要附加选项-o loop(本地回环设备)
mount -o loop REDHAT.iso /media/
# 创建一个回环文件/var/swapfile,大小512MB,卷标为SWAP-FILE,且开机自启动。
dd if=/dev/zero of=/var/swapfile bs=1M count=512
mkswap LABEL=SWAP-FILE /var/swapfile
vim /etc/fstab
/var/swapfile swap swap defaults 0 0
#若要启动acl功能,则这样添加
/var/swapfile swap swap defaults,acl 0 0
/etc/fstab
swapon -a启用所有/etc/fstab
中的swap设备
/etc/fstab中的fs会在os初始化时自动挂载
字段为:
设备,挂载点,fs类型,挂载选项,转储(备份)频率(0:不备份),fs检测次序(只有根为1,0为不检查)
可以发现交换分区挂载点是swap,不是任何目录。
我们自己挂载的设备关机则卸载,想开机挂载则在/etc/fstab写入以下内容:
/dev/sda6 /mnt/test ext3 defaults 0 0