1. linux下的文件包括文件内容和文件属性、权限,分别存储在不同的快中,存储权限与属性放置到inode中,实际内容存放在data block块中。还有一个超级块(superblock),存放整个文件系统的整体信息,包括inode和block的总量、使用量、剩余量。
inode中存放有这个文件所放置的block块。
2. block大小与文件系统的限制
3. 每个inode块的大小为128bytes,每个文件占一个inode,文件系统能创建的文件数量与inode有关
inode记录一个block需要4byte
为了存取大文件,inode记录block的区域分成12个直接、1一个间接、一个双间接,一个三间接。
直接块直接指向block块
间接块是用一个block来记录block号
二间接第一个block仅指出记录block号的下一级block,由下一级在指向真正的数据,三间接更深一层的block指向真正数据块
4. 一般superblock的大小为1024bytes
5. 查看区段和superblock信息
[root@www ~]# dumpe2fs [-bh]装置文件名
选项与参数:
-b :列出保留为坏轨的部分(一般用不到吧!?)
-h :仅列出 superblock 的数据,不会列出其他的区段内容!
6. ext2在创建新目录时,至少分配一个inode和一个block块
inode记录属性和权限、block等信息,block记录目录下的文件名和文件占用的inode号码数据
7. ext2下新建一个一般文件时,分配一个inode和相应大小的block
8. 新增文件
- 先确定用户对于欲新增文件的目录是否具有 w 与 x 的权限,若有的话才能新增;
- 根据 inode bitmap 找到没有使用的 inode 号码,并将新文件的权限/属性写入;
- 根据 block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,且更新inode 的 block 指向数据;
- 将刚刚写入的 inode 与 block 数据同步更新 inode bitmap 与 block bitmap,并更新superblock 的内容。
一般将inode table 和 data block 称为数据存放区域,其他如superblock、block bitmap、inode bitmap等区段为metadata(中间数据),因为每次增删改都可能会影响到这三部分数据。
9.将文件系统与目录树结合的操作称为挂载。挂载点一定是目录,该目录为进入文件系统的入口。
10. 查看linux支持哪些文件系统命令
ls -1/lib/modules/$(uname -r)/kernel/fs
系统中已经加载到内存中支持的文件系统命令
cat /proc/filesystems
11 Linux VFS
linux内核通过VFS(Virtual Filesystem Switch,虚拟文件系统)的内核功能去读取文件系统,管理文件系统
12. 文件系统的简单操作
① 磁盘与目录的容量:df,du
df:列出文件系统的整体磁盘使用量;
[root@www ~]# df [-ahikHTm][目录或文件名]
选项与参数:
-a :列出所有的文件系统,包括系统特有的/proc 等文件系统;
-k :以KBytes的容量显示各文件系统;
-m :以MBytes的容量显示各文件系统;
-h :以人们较易阅读的GBytes,MBytes,KBytes等格式自行显示;
-H :以 M=1000K取代 M=1024K的进位方式;
-T :连同该 partition 的 filesystem 名称(例如 ext3)也列出;
-i :不用硬盘容量,而以 inode 的数量来显示
- 不加任何参数默认将系统内所有的文件系统(不含特殊内存的文件系统和swap)都以1KB的容量列出来,/dev/shm与内存有关的挂载
[root@www ~]# df -h /etc
FilesystemSizeUsedAvailUse%Mounted on
/dev/hdc2 9.5G3.7G5.4G41%/
# 这个范例比较有趣,在 df 后面加上目录或者是档案时, df
# 会自动的分析该目录或档案所在的 partition ,并将该 partition 的容量显示出
# 来,所以,您就可以知道某个目录底下还有多少容量可以使用。
Filesystem:代表该文件系统是在哪个 partition ,所以列出装置名称;
1k-blocks:说明底下的数字单位是 1KB ,可利用 -h 或 -m 来改变容量;
Used:顾名思义,就是使用掉的硬盘空间。
Available:也就是剩下的磁盘空间大小;
Use%:就是磁盘的使用率,如果使用率高达 90% 以上时, 最好需要注意一下了,免得容量不足造成系统问题(例如最容易被填满的 /var/spool/mail 这个放置邮件的磁盘)。
Mounted on:就是磁盘挂载的目录所在啦!
du:评估文件系统的磁盘使用量(常用于评估目录的容量)。
[root@www ~]# du [-ahskm]档案或目录名称
选项与参数:
-a :列出所有的档案与目录容量,因为默认仅统计目录底下的档案量而已。
-h :以人们较易读的容量格式(G/M)显示;
-s :列出总量而已,而不列出每个各别的目录占用容量;
-S :不包括子目录下的总计,与-s 有点差别。
-k :以KBytes列出容量显示;
-m :以MBytes列出容量显示;
13. 连接文件ln
hard link 只是在某个目录下新增一条文件名链接到某 inode 号码的关联记录而已。
ln /etc/test /root/test
# 创建root下的test,硬连接到/etc/test文件
其实我们也能够知道,事实上 hard link 应该仅能在单一文件系统中进行的,应该是不能够跨文件系统才对
hard link是有限制的:
- 不能跨Filesystem;
- 不能link目录
symbolic link(符号连接,也即快捷方式)
创建一个独立的文件,而文件会让数据的读取指向他连接的那个文件的文件名。当源文件被删除之后,symbolic link的文件会打不开。
会占用inode和block
连接文件修改了,源文件内容就跟着变了
[root@www ~]# ln [-sf]来源文件目标文件
选项与参数:
-s :如果不加任何参数就进行连结,那就是hard link,至于-s 就是symbolic link
-f :如果目标文件存在时,就主动的将目标文件直接移除后再建立!
连接文件修改了,源文件内容就跟着变了
ls -s /bin /root/bin
进入/root/bin目录下,该目录其实/bin目录,当删除/root/bin下的文件时,/bin下的文件就删除了
14.磁盘分区:fdisk;
[root@www ~]# fdisk [-l]装置名称
选项与参数:
-l :输出后面接的装置所有的 partition 内容。若仅有 fdisk -l 时,则系统将会把整个系统内能够搜寻到的装置的 partition 均列出来。
只有root权限才能使用,使用的“设备文件名”不要加数字,因为分区是针对整个硬盘设备而不是某个分区
partprobe 强制让内核重新找一次分区表
15. 磁盘格式化 mkfs
[root@www ~]# mkfs [-t 文件系统格式]装置文件名
选项与参数:
-t :可以接文件系统格式,例如 ext3, ext2, vfat 等(系统有支持才会生效)
mke2fs
[root@www ~]# mke2fs [-b block 大小][-i block 大小][-L 标头][-cj]装置
选项与参数:
-b :可以设定每个 block 的大小,目前支持1024,2048,4096 bytes 三种;
-i :多少容量给予一个 inode 呢?
-c :检查磁盘错误,仅下达一次-c 时,会进行快速读取测试;
- 如果下达两次-c -c 的话,会测试读写(read-write),会很慢
-L :后面可以接标头名称(Label),这个 label 是有用的
-j :本来 mke2fs 是 EXT2 ,加上-j 后,会主动加入 journal 而成为 EXT3。
16. 磁盘检验: fsck(检查文件系统), badblocks(检查硬盘或者软盘扇区)
[root@www ~]# fsck [-t 文件系统][-ACay]装置名称
选项与参数:
-t :如同 mkfs 一样,fsck 也是个综合软件而已!因此我们同样需要指定文件系
- 统。
不过由于现今的Linux太聪明了,他会自动的透过 superblock 去分辨文件系
- 统,因此通常可以不需要这个选项。
-A :依据/etc/fstab 的内容,将需要的装置扫瞄一次。
-a :自动修复检查到的有问题的扇区,所以你不用一直按 y 啰!
-y :与-a 类似,但是某些 filesystem 仅支持-y 这个参数!
-C :可以在检验的过程当中,使用一个直方图来显示目前的进度!
EXT2/EXT3 的额外选项功能:(e2fsck 这支指令所提供)
-f :强制检查!一般来说,如果 fsck 没有发现任何 unclean 的旗标,不会主动
进入
细部检查的,如果您想要强制 fsck 进入细部检查,就得加上-f 旗标啰!
-D :针对文件系统下的目录进行优化配置。
[root@www ~]# badblocks -[svw]装置名称
选项与参数:
-s :在屏幕上列出进度
-v :可以在屏幕上看到进度
-w :使用写入的方式来测试,建议不要使用此一参数,尤其是待检查的装置已有档案时!
17. 磁盘的挂载与卸载
进行挂载前 需要:
单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
单一目录不应该重复挂载多个文件系统;
要作为挂载点的目录,理论上应该都是空目录才是。
mount
[root@www ~]# mount -a
[root@www ~]# mount [-l]
[root@www ~]# mount [-t 文件系统][-L Label名][-o 额外选项] \
[-n]装置文件名挂载点
选项与参数:
-a :依照配置文件/etc/fstab 的数据将所有未挂载的磁盘都挂载上来
-l :单纯的输入 mount 会显示目前挂载的信息。加上-l 可增列Label名称!
-t :与 mkfs 的选项非常类似的,可以加上文件系统种类来指定欲挂载的类型。
- 常见的Linux支持类型有:ext2, ext3, vfat, reiserfs, iso9660(光盘格式),nfs, cifs, smbfs(此三种为网络文件系统类型)
-n :在默认的情况下,系统会将实际挂载的情况实时写入/etc/mtab 中,以利
- 其他程序的运作。但在某些情况下(例如单人维护模式)为了避免问题,会刻意不写入。此时就得要使用这个-n 的选项了。
-L :系统除了利用装置文件名(例如/dev/hdc6)之外,还可以利用文件系统的
- 标头名称(Label)来进行挂载。最好为你的文件系统取一个独一无二的名称吧!
-o :后面可以接一些挂载时额外加上的参数!比方说账号、密码、读写权限等:
ro, rw:挂载文件系统成为只读(ro)或可擦写(rw)
async, sync:此文件系统是否使用同步写入(sync)或异步(async)的
- 内存机制,请参考文件系统运作方式。预设 为 async。
auto, noauto:允许此 partition 被以 mount -a 自动挂载(auto)
dev, nodev:是否允许此 partition 上,可建立装置档案? dev 为可允许
suid, nosuid:是否允许此 partition 含有 suid/sgid 的文件格式?
exec, noexec:是否允许此 partition 上拥有可执行 binary 档案?
user, nouser:是否允许此 partition 让任何使用者执行 mount ?一般来说,
- mount 仅有 root 可以进行,但下达 user 参数,则可让一般 user 也能够对此 partition 进行 mount 。
defaults:默认值为:rw, suid, dev, exec,auto, nouser, and async
remount:重新挂载,这在系统出错,或重新更新参数时,很有用!
挂载目录
[root@localhost ~]# mount --bind /home /mnt/home/
通过这个 mount --bind 的功能, 可以将某个目录挂载到其他目录去,而并不是整块 filesystem ,所以从此进入 /mnt/home 就是进入
/home 的意思
umount
[root@www ~]# umount [-fn]装置文件名或挂载点
选项与参数:
-f :强制卸除!可用在类似网络文件系统(NFS)无法读取到的情况下;
-n :不更新/etc/mtab 情况下卸除。
挂载的是目录的,卸载时必须用挂载点名称卸载
使用Label name记性挂载
除了磁盘的设备文件名之外,还可以使用文件系统的标头(label)名称来挂载
dumpe2fs指令查询逻辑卷标,例
dumpe2fs -h /dev/hdc
18. 磁盘参数修改
mknod
通过文件的 major 与 minor 数值来替代设备
[root@www ~]# ll /dev/hdc*
brw-r-----1 root disk 22,0Oct2415:55/dev/hdc
brw-r-----1 root disk 22,1Oct2008:47/dev/hdc1
brw-r-----1 root disk 22,2Oct2008:47/dev/hdc2
brw-r-----1 root disk 22,3Oct2008:47/dev/hdc3
brw-r-----1 root disk 22,4Oct2416:02/dev/hdc4
brw-r-----1 root disk 22,5Oct2016:46/dev/hdc5
brw-r-----1 root disk 22,6Oct2501:33/dev/hdc6
22 列代表主设备代码(Major),0~6代表次设备代码
[root@www ~]# mknod 装置文件名[bcp][Major][Minor]
选项与参数:
装置种类:
b :设定装置名称成为一个外部存储设备文件,例如硬盘等;
c :设定装置名称成为一个外部输入设备文件,例如鼠标/键盘等;
p :设定装置名称成为一个 FIFO 文件;
Major:主要装置代码;
Minor:次要装置代码;
e2label 修改卷标
CentOS 的配置文件,也就是那个 /etc/fstab 文件的设置都默认使用 Label name,优缺点:
优点:不论磁盘文件名怎么变,不论你将硬盘插在那个 IDE / SATA 接口,由于系统是通过Label ,所以,磁盘插在哪个接口将不会有影响;
缺点:如果插了两个硬盘,刚好两个硬盘的 Label 有重复的, 系统可能会无法判断那个磁盘分区槽才是正确的!
[root@www ~]# e2label 装置名称新的Label名称
tune2fs
[root@www ~]# tune2fs [-jlL]装置代号
选项与参数:
-l :类似 dumpe2fs -h 的功能,将 superblock 内的数据读出来
-j :将 ext2 的 filesystem 转换为 ext3 的文件系统;
-L :类似 e2label 的功能,可以修改 filesystem 的Label
hdparm
对IDE硬盘可以设置一些高级参数,对SATA硬盘没有太大作用,
[root@www ~]# hdparm [-icdmXTt]装置名称
选项与参数:
-i :将核心侦测到的硬盘参数显示出来!
-c :设定32-bit (32位)存取模式。这个32位存取模式指的是在硬盘在与
PCI 接口之间传输的模式,而硬盘本身是依旧以16位模式运行。
- 预设的情况下,这个设定值都会被打开,建议直接使用 c1 即可。
-d :设定是否启用 dma 模式,-d1 为启动,-d0 为取消;
-m :设定同步读取多个 sector 的模式。一般来说,设定此模式,可降低系统因
- 为读取磁盘而损耗的效能, WD 的硬盘则不怎么建议设定此值
- 一般来说,设定为16/32是优化,不过,WD 硬盘建议值则是4/8。这个值的最大值,可以利用 hdparm -i /dev/hda 输出的MaxMultSect来设定。一般如果不晓得,设定16是合理的。
-X :设定UtraDMA的模式,一般来说, UDMA 的模式值加64即为设定值。
- 并且,硬盘与主板芯片必须要同步,所以,取最小的那个。一般来说:
33MHz DMA mode 0~2(X64~X66)
66MHz DMA mode 3~4(X67~X68)
100MHz DMA mode 5(X69)
如果硬盘上面显示的是 UATA 100以上的,那么设定 X69 也不错
-T :测试缓存区 cache 的存取效能
-t :测试硬盘的实际访问性能
19. 设置开机挂载
系统挂载的一些限制:
根目录 / 是必须挂载的﹐而且一定要先于其它 mount point 被挂载进来。
其它 mount point 必须为已建立的目录﹐可任意指定﹐但一定要遵守必须的系统目录架构原则
所有 mount point 在同一时间之内﹐只能挂载一次。
所有 partition 在同一时间之内﹐只能挂载一次。
如若进行卸载﹐您必须先将工作目录移到 mount point(及其子目录) 之外。
# Device Mount point filesystem parameters dump fsck
第一列:磁盘设备文件名或设备的Label
第二列:挂载点
第三列:磁盘分区的文件系统
第四列:文件系统参数
第五列:能否被dump备份命令作用
第六列:是否以fsck检验扇区(0:不检验;1:最早检验<一般是根目录>;2:要检验)
20. 特殊设备loop挂载(镜像文件不刻录就挂载使用)
挂载光盘/DVD镜像文件
新建大文件以制作loop设备文件:制作出一个大文件,然后将这个文件挂载。如此一来感觉上你就多了一个分区
- 创建大型文件
dd:可以创建空文件
假设建立一个空的文件在 /home/loopdev
[root@www ~]# dd if=/dev/zero of=/home/loopdev bs=1M count=512
512+0 records in<==读入512笔资料
512+0 records out <==输出512笔数据
536870912 bytes (537 MB) copied,12.3484 seconds,43.5 MB/s
# 这个指令的简单意义如下:
# if 是 input file ,输入文件。那个 /dev/zero 是会一直输出 0 的设备
# of 是 output file ,将一堆零写入到后面接的文件中(就是要创建的新文件)。
# bs 是每个 block 大小,就像文件系统那样的 block 意义;
# count 则是总共几个 bs 的意思。
dd 就好像在迭砖块一样,将 512 块,每块 1MB 的砖块堆栈成为一个大文件(/home/loopdev) !
- 格式化
mkfs
- 挂载
mount
21. 内存交换空间(swap)的构建
swap 的功能就是在应付物理内存不足的情况下所造成的内存扩展记录的功能。
一般来说,如果硬件的配备足够的话,那么 swap 应该不会被我们的系统所使用到, swap 会被利用到的时刻通常就是物理内存不足的情况了。
①使用物理分区构建swap
1) 分区:先使用 fdisk 在你的磁盘中分割出一个分区给系统作为 swap 。由于 Linux 的 fdisk 默认会将分区的 ID 配置为 Linux 的文件系统,所以还得要配置一下 system ID 。
2) 格式化:利用创建 swap 格式的『mkswap 设备文件名』就能够格式化该分区成为 swap 格式.
3) 使用:最后将该 swap 设备启动,方法为:『swapon 设备文件名』。
4) 观察:最终通过 free 这个命令来观察一下内存的用量。
例:
- 先进行分区
[root@www ~]# fdisk /dev/hdc
Command(m for help): n
First cylinder (2303-5005, default 2303):<==这里按[enter]
Using default value 2303
Last cylinder or +size or +sizeM or +sizeK (2303-5005, default 5005):+256M
Command(m for help): p
DeviceBootStartEndBlocksIdSystem
.....中间省略.....
/dev/hdc6 205323022008093+83Linux
/dev/hdc7 23032334257008+83Linux<==新增的项目
Command(m for help): t <==修改系统 ID
Partition number (1-7):7<==从上结果看到的,七号partition
Hex code (type L to list codes):82<==改成 swap 的 ID
Changed system type of partition 7 to 82(Linux swap /Solaris)
Command(m for help): p
DeviceBootStartEndBlocksIdSystem
.....中间省略.....
/dev/hdc6 205323022008093+83Linux
/dev/hdc7 23032334257008+82Linux swap /Solaris
Command(m for help): w
# 此时就将 partition table 升级了。
[root@www ~]# partprobe
# 这个很重要,不要忘记让核心升级 partition table
- 开始构建swap格式
[root@www ~]# mkswap /dev/hdc7
Setting up swapspace version 1, size =263172 kB <==非常快速!
- 开始查看与加载
[root@www ~]# free
total used free shared buffers cached
Mem:74266468459258072043820497144
-/+ buffers/cache:143628599036
Swap:1020088961019992
# 我有 742664K 的物理内存,使用 684592K 剩余 58072K ,使用掉的内存有
- 43820K / 497144K 用在缓冲/缓存的用途中。
# 至于 swap 已经存在了 1020088K
[root@www ~]# swapon /dev/hdc7
[root@www ~]# free
total used free shared buffers cached
Mem:74266468471257952043872497180
-/+ buffers/cache:143660599004
Swap:1277088961276992<==有添加啰!看到否?
[root@www ~]# swapon -s
FilenameTypeSizeUsedPriority
/dev/hdc5 partition 102008896-1
/dev/hdc7 partition 2570000-2
# 上面列出目前使用的 swap 设备有哪些
②使用文件构建swap
- 使用dd新增一个128M的文件在/tmp下面:
[root@www ~]# dd if=/dev/zero of=/tmp/swap bs=1M count=128
128+0 records in
128+0 records out
134217728 bytes (134 MB) copied,1.7066 seconds,78.6 MB/s
[root@www ~]# ll -h /tmp/swap
-rw-r--r--1 root root 128MOct2815:33/tmp/swap
- 使用 mkswap 将 /tmp/swap 这个文件格式化为 swap 的文件格式:
[root@www ~]# mkswap /tmp/swap
Setting up swapspace version 1, size =134213 kB
# 这个命令执行时请特别小心,因为弄错字节,将可能使文件系统挂掉
- 使用swapon来将/tmp/swap启动
root@www ~]# free
total used free shared buffers cached
Mem:742664450860291804045584261284
-/+ buffers/cache:143992598672
Swap:1277088961276992
[root@www ~]# swapon /tmp/swap
[root@www ~]# free
total used free shared buffers cached
Mem:742664450860291804045604261284
-/+ buffers/cache:143972598692
Swap:1408152961408056
[root@www ~]# swapon -s
FilenameTypeSizeUsedPriority
/dev/hdc5 partition 102008896-1
/dev/hdc7 partition 2570000-2
/tmp/swap file 1310640-3
- 使用 swapoff 关掉 swap file
[root@www ~]# swapoff /tmp/swap
[root@www ~]# swapoff /dev/hdc7
[root@www ~]# free
total used free shared buffers cached
Mem:742664450860291804045660261284
-/+ buffers/cache:143916598748
Swap:1020088961019992<==回复成最原始的样子
③swap使用上的限制
- 在核心 2.4.10 版本以后,单一 swap 量已经没有 2GB 的限制了,
- 但是,最多还是仅能创建到 32 个 swap 的数量
- 而且,由于目前 x86_64 (64位) 最大内存寻址到 64GB, 因此, swap 总量最大也是仅能达 64GB
22. 文件系统的特殊查看与操作
① boot sector 与 super block的关系
- block大小为1024bytes(1KB)时:
如果 block 大小刚好是 1024 的话,那么 boot sector 与 superblock 各会占用掉一个 block。
- block大于1024bytes(2K,4K)时:
superblock 就在第一个 block (第 0 号) 上头,但是 superblock 其实就只有 1024bytes ,为了怕浪费更多空间,因此第一个 block 内就含有 boot sector 与 superblock 两者 。以4K为例,图如下
引导装载程序安装到文件系统最前面的1024bytes内的区域,即启动扇区内。
② 利用GNU的parted进行分区
fdisk 无法支持2TB以上的分区,此时可以用parted来处理。
[root@www ~]# parted [装置][命令[参数]]选项与参数:命令功能:新增分区:mkpart [primary|logical|extended][ext3|vfat]开始结束分区表:print删除分区:rm [partition]范例一:以 parted 列出目前本机的分割表数据[root@www ~]# parted /dev/hdc printModel: IC35L040AVER07-0(ide)<==硬盘接口与型号Disk/dev/hdc:41.2GB<==磁盘文件名与容量Sector size (logical/physical):512B/512B<==每个扇区的大小PartitionTable: msdos <==分区表形式NumberStartEndSizeTypeFile system Flags132.3kB107MB107MB primary ext3 boot2107MB10.6GB10.5GB primary ext3310.6GB15.8GB5240MB primary ext3415.8GB41.2GB25.3GB extended515.8GB16.9GB1045MB logical linux-swap616.9GB18.9GB2056MB logical ext3718.9GB19.2GB263MB logical linux-swap[1][2][3][4][5][6]
来自为知笔记(Wiz)