文件系统特性
- 在Linux中使用一个磁盘的步骤:首先需要将磁盘分区,然后格式化需要使用的分区(即将其变为某个文件系统,创建相应的inode和block),在挂载到目录树,就可以使用了。
- 磁盘在格式化时就创建好了固定的inode和block数量,除非重新格式化,否则是不会变化的。还会创建一个超级区块superblock(1024bytes)会记录整个文件系统的整体信息,包括inode和block的数量,使用量,剩余量,文件系统的挂载时间等。
- inode存放的是文件的权限和拥有者,修改时间,inode号码等等这些文件属性,一个文件占用一个inode。而block存放的是文件的具体数据,由于一个block的空间有限,所以一个inode可以对应多个block
- inode除了记录文件一些权限等基本属性外,还具有:
- 每个inode大小均固定为128bytes (新的ext4与xfs可设定为256bytes)
- 每个文件只占有一个inode,所以系统的最大文件数与inode有关
- 系统读取文件是需要先找到inode,并分析inode所记录的权限与用户是否符合,若符合才能够开始实际读取block的内容
读取/etc/passwd的流程:
- / 的 inode:
透过挂载点的信息找到 inode 号码为 128 的根目录 inode,且 inode 规范的权限让我们可以读取该 block 的内容(有 r 与 x) ; - / 的 block:
经过上个步骤取得 block 的号码,并找到该内容有 etc/ 目录的 inode 号码 (33595521); - etc/ 的 inode:
- 读取 33595521 号 inode 得知 dmtsai 具有 r 与 x 的权限,因此可以读取 etc/ 的 block 内容;
etc/ 的 block:
经过上个步骤取得 block 号码,并找到该内容有 passwd 文件的 inode 号码 (36628004);
- passwd 的 inode:
读取 36628004 号 inode 得知 dmtsai 具有 r 的权限,因此可以读取 passwd 的 block 内容; - passwd 的 block:
- 最后将该 block 内容的数据读出来。
相关命令
- dumpe2fs [-bh] 装置文件名
- -h : (ext家族)仅列出superblock的数据,不会列出其他区段
xfs_info 挂载点|装置文件名 : 观察xfs文件系统的相关信息
查看当前系统支持的文件系统有哪些:ls -l /lib/modules/$(uname -r)/kernel/fs
查看已加载到内存中支持的文件系统: cat /proc/filesystems
df [-hiT] 目录或文件名
-h : 以人们交易容易阅读的G,M,K显示
-i : 不用磁盘容量,而已inode的数量来显示
-T : 连同文件系统的名称(如xfs)也列出
查看分区:
blkid : 列出目前系统有被格式化的装置
lsblk [-dfimpt] [device]
-d :仅列出磁盘本身,并不会列出该磁盘的分区数据
-f :同时列出该磁盘内的文件系统名称
-i :使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用)
-m :同时输出该装置在 /dev 底下的权限数据 (rwx 的数据)
-p :列出该装置的完整文件名!而不是仅列出最后的名字而已。
-t :列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等
parted device_name print : 列出磁盘的分区表类型与分区信息
建立分区:
gdisk / fdisk 装置名称:进入和可建立分区,删除分区等一些操作。MBR 分区表请使用 fdisk 分区, GPT 分区表请
使用 gdisk 分区
partprobe -s : 更新Linux核心的分区表信息,在设置好分区后使用,是设置的分区立即生效
格式化分区(建立文件系统:
mkfs.xfs [-b bsize] [-d parms] [-i parms] [-l parms] [-L label] [-f] [-r parms] 装置名称 ------> 建立xfs文件系统
关于单位:底下只要谈到『数值』时,没有加单位则为 bytes 值,可以用 k,m,g,t,p (小写)等来解释,比较特殊的是 s 这个单位,它指的是 sector 的『个数』喔!
-b :后面接的是 block 容量,可由 512 到 64k,不过最大容量限制为 Linux 的 4k 喔!
-d :后面接的是重要的 data section 的相关参数值,主要的值有:
agcount=数值 :设定需要几个储存群组的意思(AG),通常与 CPU 有关
agsize=数值 :每个 AG 设定为多少容量的意思,通常 agcount/agsize 只选一个设定即可 file :指的是『格式化的装置是个文件而不是个装置』的意思!(例如虚拟磁盘)
size=数值 :data section 的容量,亦即你可以不将全部的装置容量用完的意思
su=数值 :当有 RAID 时,那个 stripe 数值的意思,与底下的 sw 搭配使用
sw=数值 :当有 RAID 时,用于储存数据的磁盘数量(须扣除备份碟与备用碟)
sunit=数值 :与 su 相当,不过单位使用的是『几个 sector(512bytes 大小)』的意思
swidth=数值 :就是 su*sw 的数值,但是以『几个 sector(512bytes 大小)』来设定
-i :与 inode 有较相关的设定,主要的设定值有:
-f :如果装置内已经有文件系统,则需要使用这个 -f 来强制格式化才行!
size=数值 :最小是 256bytes 最大是 2k,一般保留 256 就足够使用了!
internal=[0|1]:log 装置是否为内建?预设为 1 内建,如果要用外部装置,使用底下设定
logdev=device :log 装置为后面接的那个装置上头的意思,需设定 internal=0 才可!
size=数值 :指定这块登录区的容量,通常最小得要有 512 个 block,大约 2M 以上才行!
-L :后面接这个文件系统的标头名称 Label name 的意思!
-r :指定 realtime section 的相关设定值,常见的有:
extsize=数值 :就是那个重要的 extent 数值,一般不须设定,但有 RAID 时,最好设定与 swidth 的数值相同较佳!最小为 4K 最大为 1G 。
mkfs.ext4 [-b size] [-L label] 装置名称 ------> 建立ext4文件系统
-b : 设定block大小
-L :后面接这个装置的标头名称
mkfs 是一个综合的指令,当我们使用 mkfs -t xfs 时,它就会跑去找 mkfs.xfs 相关的参数给我们使用!mkfs[tab][tab] 会显示出该系统支持的文件系统
文件系统的检验/修复
xfs_repair [-fnd] 装置名称
-f :后面的装置其实是个文件而不是实体装置-n :单纯检查并不修改文件系统的任何数据 (检查而已)
-n :单纯检查并不修改文件系统的任何数据 (检查而已)
-d :通常用在单人维护模式底下,针对根目录 (/) 进行检查与修复的动作!很危险!不要随便使用
fsck.ext4 [-pf] [-b superblock] 装置名称
-p :当文件系统在修复时,若有需要回复 y 的动作时,自动回复 y 来继续进行修复动作。
-f :强制检查!一般来说,如果 fsck 没有发现任何 unclean 的旗标,不会主动进入细部检查的,如果您想要强制 fsck 进入细部检查,就得加上 -f 旗标啰!
-D :针对文件系统下的目录进行优化配置。
-b :后面接 superblock 的位置!一般来说这个选项用不到。但是如果你的 superblock 因故损毁时,透过这个参数即可利用文件系统内备份的 superblock 来尝试救援。一般来说,superblock 备份在:1K block 放在 8193, 2K block 放在 16384, 4K block 放在 32768
文件系统的挂载与卸除
mount -a
mount -l
mount [-t 文件系统] LABEL=’’ 挂载点
mount [-t 文件系统] UUID=’’ 挂载点
mount [-t 文件系统] 装置文件名 挂载点
-a :依照配置文件 /etc/fstab 的数据将所有未挂载的磁盘都挂载上来
-l :单纯的输入 mount 会显示目前挂载的信息。加上 -l 可增列 Label 名称!
-t :可以加上文件系统种类来指定欲挂载的类型。常见的 Linux 支持类型有:xfs, ext3, ext4,reiserfs, vfat, iso9660(光盘格式), nfs, cifs, smbfs (后三种为网络文件系统类型)
-n :在默认的情况下,系统会将实际挂载的情况实时写入 /etc/mtab 中,以利其他程序的运作。但在某些情况下(例如单人维护模式)为了避免问题会刻意不写入。此时就得要使用 -n 选项。
-o :后面可以接一些挂载时额外加上的参数!比方说账号、密码、读写权限等:async, sync: 此文件系统是否使用同步写入 (sync) 或异步 (async) 的内存机制,请参考文件系统运作方式。预设为 async。
atime,noatime: 是否修订文件的读取时间(atime)。为了效能,某些时刻可使用 noatime
ro, rw: 挂载文件系统成为只读(ro) 或可擦写(rw)
auto, noauto: 允许此 filesystem 被以 mount -a 自动挂载(auto)
dev, nodev: 是否允许此 filesystem 上,可建立装置文件? dev 为可允许
suid, nosuid: 是否允许此 filesystem 含有 suid/sgid 的文件格式?
exec, noexec: 是否允许此 filesystem 上拥有可执行 binary 文件?
user, nouser: 是否允许此 filesystem 让任何使用者执行 mount ?一般来说,mount 仅有 root 可以进行,但下达 user 参数,则可让 一般 user 也能够对此 partition 进行 mount 。
defaults: 默认值为:rw, suid, dev, exec, auto, nouser, and async remount: 重新挂载,这在系统出错,或重新更新参数时,很有用!
umount [-fn] 装置文件名或挂载点:
-f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
-l :立刻卸除文件系统,比 -f 还强!
-n :不更新 /etc/mtab 情况下卸除。
设定开机挂载
在文件/etc/fstab里面添加如下规则的开机挂载即可:
[装置/UUID 等] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]
最后三个字段设为defaults 0 0就OK了
文件系统的一些属性修改:
xfs_admin [-lu] [-L label] [-U uuid] 装置文件名
-l :列出这个装置的 label name
-u :列出这个装置的 UUID
-L :设定这个装置的 Label name
-U : 设定这个装置的UUID
tune2fs [-l] [-L Label] [-U uuid] 装置文件名
-l :类似 dumpe2fs -h 的功能~将 superblock 内的数据读出来~
-L :修改 LABEL name
-U :修改 UUID 啰!
制作loop装置文件
该功能是为了将以前的分区不合理的情况下也能来分区,如:买的服务器默认的只有一个根目录的空间,没有其他分区
建立大型文件:dd if=/dev/zero of=/srv/loopdev bs=1M count=512
if指定输入输入文件,/dev/zero为一个生成空内容的装置
of指定输出文件
bs为块大小
count为块的个数,所以生成的文件大小就为bs乘以count
格式化:mkfs.xfs -f /srv/loopdev
挂载:如:mount -o loop UUID=“7dd97bd2-4446-48fd-9d23-a8b03ffdd5ee” /mnt,一定要加上-o loop,在设置开机挂载是也需要在文件系统参数这个字段加上loop,如:/srv/loopdev /data/file xfs defaults**,loop** 0 0