物理信息
磁盘的组成 : 盘片, 机械手臂及磁头 , 主轴马达(转动盘片)
磁道 : 当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道 . ( 1个盘片 )
扇区 : 磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区,每个扇区可以存放512个字节的信息,磁盘驱动器在向磁盘读取和写入数据时,要以扇区为单位
磁柱( 柱面 ) : 硬盘通常由重叠的一组盘片构成,每个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。磁盘的柱面数与一个盘面上的磁道数是相等的。由于每个盘面都有自己的磁头,因此,盘面数等于总的磁头数。所谓硬盘的CHS,即Cylinder(柱面)、Head(磁头)、 Sector(扇区),只要知道了硬盘的CHS的数目,即可确定硬盘的容量,硬盘的容量=柱面数×磁头数×扇区数×512B。 ( 扇区数是一个磁道上含有的扇区数, 扇区数*512b = 1个磁道的存储容量, 1个磁道的存储容量 * 柱面数 = 一个磁盘的容量 ( 一个柱面数就等于一个盘面上的磁道数量 ) , 一个磁盘容量 * 磁头数 = 总容量, 因为 磁头数就等于盘片数 ). 磁柱是分割槽的最小单位 .
第一个重要扇区 : 主要开机区 ( MBR , master boot record ) 分割表 ( partition table ) , MBR : 446 Bytes, partition table 64Bytes.
格式化与文件系统 file system ( linux 采用索引式文件系统 )
磁盘分区完毕后, 要格式化, 那么为什么要格式化呢 ? 因为每种操作系统所设定的文件属性/权限并不相同, 为了存放这些档案的所需数据, 因此需要进行格式化, 以便成为操作系统能够利用的文件系统格式 ( file system ).
linux 文件系统存放 : 权限属性等存放在 inode中 , 实际数据存储在 data block中 , 还有一个超级区块 ( super block ) 会记录整个文件系统的整体信息, 包括 inode与block总量等.
每个 inode , block 都有编号 , supperblock 记录了 file system的整体信息, 包括 inode/block 总数量, 使用量, 剩余量, 以及文件系统格式及相关信息.
inode : 记录档案的属性, 一个档案占用一个 inode, 同时记录此档案的数据所在的 block 号码.
block : 实际存储档案内容, 如果档案太大会占用多个 block .
文件系统一开始就将inode与block规划好了,除非重新格式化(或利用resize2fs等指令变更文件系统大小),否则inode与block固定后就不会再变动 .
磁盘分区
实际上, 磁盘分区就是指定分割槽的启始与结束磁柱.
block 通常由若干的扇区( sector ) 组成 , 所以它通常为 sector的整数倍 ( n * 512Bytes , sector的2次方倍数 ), 例如 4K .
inode , 每个文件都会占用一个 inode, 当 linux 系统要查找某个文件时, 会先搜索 inode, 找到文件属性及data的存放地址, 如果权限可以, 在查找 data block 从而取出数据.
inode 数量在一开始已经被设定好, 其设定方式通常是 " 硬盘大小 / 一个容量 " , 这个容量比 block 大一些较好, 例如刚才将 block 设定为 4K, 那么这个容量可以设定8K
左右, 所以, 一块1GB的硬盘如果以8K大小划分inode数, 则会有 131072个 inode, 一个inode的大小均为 128 Bytes, 这样, 我们就可以清楚的知道, 一个分区被格式化为
一个文件系统之后, 基本上它一定会有 inode 与 data block 两个大块 .
文件的存储 : 文件名存储在目录项中( dentry ) , 文件属性存储在inode中, 文件内容存储在 data block中 .
存储每个 block 号码需要4 bytes.
block数量越大, inode数量越少, 适合存储大文件的文件系统, block数量越小, inode越多, 适合存储文件多而小的文件系统. ( ^_^ 如果block小, 不会浪费存储空间, 但是如果文件
较大时, 就会占用多个 data block , 这样就有可能造成多次存取操作(硬盘操作), 浪费时间, 而如果block大时, 文件小时, 就很可能出现浪费空间的现象, 纠结... )
block 选择 sector的2次方倍 ? ( 先记住吧, block 512B , 1K , 2k , 4K )
存储方式 ( 索引与链式 )
索引存储方式是指 inode 一次性能将所有的data block 找到 , linux 使用此种方式 ( 一般相关的 data block 都会存储的比较近 )
链式( 顺序 ) 是指要先找到第一个 data block , 然后再找 第二个 data block 依此类推, 当data block 比较疏散的时候, 这种方式很慢.
碎片整理 : windows FAT文件系统属于链式文件结构, 需要碎片整理( 将疏散的data block 放到一起 )
inode中的内容 : 存取模式 ( read/write/execute ) , 拥有者与群组 ( owner/group ) , 档案容量 , 建立以及状态时间( ctime ,atime, mtime ) 特殊属性 (SetUID 等 ) pointer( block )
inode中记录 block 的指针 ( pointer ) : 比如一个400M的档案, 假设data block 为 4K , 则共需要10万个 block, 那么就有10万个block的地址, 1个data block地址需要4byte的存储
空间, 所以 inode记录block区域( 4bytes) 分为 12个直接, 1个间接, 1个双间接, 1个三间接. 间接是只将1个data block来当作记录block号码的记录区.
1个block号码需要4bytes的存储空间 . ( 一次能够存取一个 data block )
inode与存储容量关系 : ( 以 data block 为1K为例 )
12个直接 : 12 * 1K = 12K
1个间接: 1K容量 / 4byte( 存储1个data block的容量 ) = 256 ( 共能存储256个data block地址 ) * 1k ( 1个 data block的存储容量 ) = 256K
1 个双间接 : 256 * 256 * 1k = 65536 K
1 个三间接 : 256 * 256 * 256 * 1k = 256的3次方K
所以总容量 : 12 + 256 + 256*256 + 256*256+256 = 16GB ( 所以一个档案的最大存储容量为 16GB ( data block = 1k ) )
data block 会分成若干个组 data block group, 每个group中有可能也存在super block , 这些super block 是整个文件系统(唯一)的super block的一个备份.这样可以进行
superblock的救援.
datablock size 为 4M 的系统,最大支持单个文件是 2TB(2048G), 我们系统的硬盘整个才 500G
查看 superblock 信息 命令 dumpe2fs[-bh] 装置文件名
-b : 列出保留为坏轨的部分( 一般用不到 )
-h : 列出 superblock 信息 例如 dumpe2fs -h /dev/sda1 ( 一般都是要加上 -h 的,只显示 superblock 的信息 )
df [-ahikHTm] [目录或文件名] ( 列出文件系统磁盘使用量)
-a : 列出所有文件系统,包括 /proc
-k : 以KBytes 单位显示文件系统
-m : 以 MBytes 单位显示文件系统
-h : 以人们较轻易阅读的 GBytes,MBytes,KBytes等格式显示 ( 常用 )
-T : 连同 名称一起显示
-i : 不用磁盘容量,而已 inode 数量显示 ( 常用 )
df -ih
du 评估文件系统的磁盘使用量 ( 常用在推估目录所占容量 )
du [-ahskm] 档案或目录
-h : 以人们方便读的容量格式显示
-s : 列出总量而已,而不列出每个个别目录的占用容量
如果删除某些档案时, 那些被占用的block号码要释放出来, 此时在 block bitmap 当中对应该block号码的标志要修改为 “未使用中” , 这就是bitmap的功能.
inode bitmap ( inode对照表 ) 这个其实也block bitmap 是类似功能, 记录未使用的 inode 号码 .
block bitmap ( 记录block是否被使用) inode bitmap( 记录 inode是否被使用 )
目录的存储( 非档案的存储 )
当我们建立一个目录时, linux文件系统会分配一个inode与至少一个block给该目录, 其中, inode记录属性权限等等,并记录block号码;而block则记录在这个目录下的文件名
与该文件占用的 inode号码。( 这就是为什么前面说, 给档案 新增/删除/更名 与目录的W权限有关, 因为要做如上操作时, 实际上是读取目录的inode与block , 而与档案自身的
inode 没有关系 .
由于目录树是由根目录开始读起, 因此系统透过挂载信息可以找到挂载点的 inode 号码( 通常 file system的最顶层 inode号码会由 2号开始 ) , 此时就能够得到根目录的inode
的内容, 并依据该 inode 读取根目录的 block 内的文件名数据, 再一层一层的往下读到正确的档案 .
所以档案的读取顺序为 : 目录 -> 文件名 -> inode -> datablock . ( 其中第一个目录是从根目录开始, 逐层开始查看找到的 )
新增档案步骤
1.确认新增档案的目录是否有W,X权限. 有才可以新增。
2.根据 inode bitmap 找到空闲 inode , 写入权限到 inode中
3.根据 block bitmap找到空闲 block , 写入数据, 并更新 inode中的block指针.
4.将刚刚写入 inode和block中的数据同步更新 inode bitmap 与 block bitmap , 并更新 superblock内容 .
ext2 -> ext3 ( ext2 向 ext3 文件系统过度的重要原因 , 即 ext3的好处 ) ( 可利用性, 数据完整性, 速度及易于转换, 可利用性 )
如上的步骤,有可能存在不一致的时候,如上同步的时候如果突然死机,导致不同步,就会出现磁盘问题,解决的办法 如下:
在写入一个档案时,先将要写入的内容,写入日志文件,然后再实际写入,当完成更新后,在日志记录中完成该档案的记录。
异步存取的好处 : 因为内存的速度远大于磁盘, 所以在内存中将档案进行修改,速度很快.
挂载 : 将磁盘与文件系统结合
挂载点为目录,该目录成为进入文件系统的入口(磁盘)
如果将磁盘分为 3个区,并挂载到3个目录上,那么这3个目录就是最顶层的目录。( 最顶层的目录 inode 号都为 2 )
注意是将磁盘的分区挂载到目录, 而不是将整个磁盘挂载.
链接( 实体链接与符号链接)
hardlink ( 实体链接 ) : 透过文件系统的 inode 链接来产生新档名, 而不是新档案 . ( 多个档名对应到一个 inode 中 )
ln Makefile ../asdf ( 建立一个 asdf ,这个 asdf 是新的档名,但是它跟 Makefile 是同一个 inode.
hardlink 好处 : 安全, 如果你不小心删除了1个档名,其实该档案的 inode与 block还是存在的,此时你可以通过另一个档名来读取档案。
hardlink 限制 : 不能跨 Filesystem , 不能 link 目录 ( 不能LINK目录原因是, 目录下的每个子目录都有父目录的档名 ../ , 所以在link父目录的同时, 必须link每个子目录,这样很麻烦, 所以不能link 目录 ) , 直观理解是,如果允许硬链接指向目录,假设目录.../d1/...与.../d2/...互为硬链接,那么在d1下必然包含目录项“..”,试问这个“..”应该指向d1还是d2 .
symbolic link 符号连接 : 即 windows 中的快捷方式 . 实际上就是建立一个独立的档案, 这个档案让数据的读取指向他link的那个档案的档名。从ls命令中也可以看出, 因为有个 -> 箭头符号. ( 这两个档名使用的是不同的 inode号码 ) , 注意此处指向的是那个真正的档名, 而这个真正的档名如果被删除了, 那么这个"快捷方式"也就不好使了.
ln -s Makefile ../asdf ( 建立一个符号连接, asdf 是 Makefile 的快捷方式 )
ln [-sf] 来源文件 目标文件
-s : 符号连接
-f : 如果目标文件存在时,就主动的将目标文件直接移除后再建立
其中,符号链接一定要注意,要给出完成路径,否则,会失效。 ln -s /tmp/c_practice/Makefile /tmp/asdf 没问题, 而如果是 ln -s Makefile /tmp/asdf 就废了。
关于目录的 link 数量
目录的链接数量, 就是实体链接能够链接到这个目录的档名的个数,数量为子目录个数+2(./ 和本身的文档名) . ( 不包括快捷方式的链接, 因为快捷方式的链接实际是在别的目录下的 ) , 因为当新增加一个子目录时,子目录中就自动有两个目录 ./ ../ 即本目录和父目录, 这就相当于为父目录和子目录分别又做了两个实体链接( 即分别增加了一个别名 ), 所以父目录的链接数 + 1, 同时本目录的链接数为2 , 因为除了本目录名外, 还有一个 ./ 。
随意创建一个目录: 它的实体连接就是 2 , 因为 目录名本身是个实体连接, 而且在目录里边还有一个 ./ 也链接这个目录, 同时 上层目录的实体连接 + 1, 因为在新创建的目录内还有一个 ../ 连接着上层目录.
先分区 后格式化 再检查 然后挂载
磁盘分区 fdisk
fdisk [-l] 装置名称
fdisk -l 列出磁盘信息 ( 全部 )
fdisk 分区 ( 不需要记住此指令,根据 help 就可以了 )
格式化 mkfs ( make filesystem ) ( 这个基本上属于傻瓜自动型 )
mkfs [-t 文件系统格式] 装置名
-t : ext3, ext2, vfat 等等
mkfs -t ext3 /dev/sda1
mke2fs 高端型
mke2fs [-bicLj] 装置
-b : 指定每个 block 大小 ( 1024,,2048,4096 )
-i : 多少容量给 inode
-c : 检查磁盘错误
-L : 后面接 label
-j : 本来 mke2fs 是 EXT2 , 加上 -j 后,会主动加入 Journal 成为 EXT3
注意 : 如果没有特殊要求的话, mkfs -t ext3 就OK了
磁盘检查
fsck
这是用来检查与修正文件系统错误的指令,注意:通常只有身为 root 且你的文件系统有问题的时候才使用这个指令,否则在正常状态下使用此指令,可能会造成系统的危害
执行 fsck时,被检查的 partition 务必不可挂载到系统上
挂载与卸除
mount 装置名 挂载点
mount /dev/sda2 /mnt/hdc1
mount /dev/hdd /media/cdrom ( 挂载光驱 )
如果是挂载移动硬盘等等 首先 fdisk -l 查看移动硬盘情况
重新挂载
mount -o remount, rw, auto / ( 重新挂载根目录 )
mount [-t vfstype] [-o options] device dir
1. -t vfstype, 指定文件系统的类型, 通常不必指定
2. -o options 主要用来描述设备或档案的挂接方式. 常用的参数有 :
loop: 用来吧一个文件当成硬盘分区挂接上系统
ro: 采用只读方式挂接设备
rw: 采用读写方式挂接设备
iocharset: 指定访问文件系统所用字符集
卸除
umount [-fn] 装置文件名或挂载点
-f : 强制卸载 ,
-n : 不更新 /etc/mtab情况卸载
umount /dev/sda2 ( 用装置名 )
umount /media/cdrom ( 用挂载点来卸载 )
umount /mnt/flash ( 用挂载点比较方便记忆 )
umount /dev/fd0 ( 用装置文件名比较方便记忆 )
设置开机挂载内容 /etc/fstab 和 /etc/mtab
第一栏 : 磁盘装置文件名 或该装置的 label - 例如 LABEL = /
第二栏 : 挂载点 - 例如 /
第三栏 : 磁盘分区槽的文件系统 - 例如 EXT3
第四栏 : 文件系统参数 - 例如 default
第五栏 : 能否被 dump 备份指令作用 - 例如 1
第六栏 : 是否以 fsck 检验扇区 - 例如 1
dd 建立大型档案 ( 建立后,大型档可以独立挂载到别的地方, 类似光驱被挂载 )
dd if=/dev/zero of=/home/loopdev bs=1M count=512
if 表示 input file, 输入档案
of 表示 output file 将输入档案内容写入后面的档案中
bs 每个 block 的大小
count 总共有多少个 bolck
所以上例,是创建了一个 512M 的单个档案
创建完后,格式化 mkfs -t ext3 /home/loopdev ( 就好比windows 一样,随便一个东西也可以格式化 )
挂载 mount -o loop/home/loopdev /media/cdrom/ ( df 可以查看到挂载内容 )
创建swap , 首先在硬盘中分出一区,做为 swap, 比如 hdc7
mkswap /dev/hdc7 就可以了
1. 首先进行分割 fdisk /dev/hdc
2. 创建SWAP mkswap /dev/hdc7 ( 其中 hdc7 是之前分割出来的磁盘一个区 )
3. 开始观察加载 free
查看 全部 swap 情况
swapon -s