现在的位置: 首页 > 综合 > 正文

鸟哥第8章笔记

2013年10月20日 ⁄ 综合 ⁄ 共 8225字 ⁄ 字号 评论关闭

一、硬盘硬件知识复习

 

上图所示为一块硬盘,最小单位为“磁区sector”,多个磁区组成圆形的“磁轨”,多个“磁轨”组成“磁柱”,其中“磁柱”是硬盘分区的基本单位。

 

第一个“磁区(512byte)”很重要,称为“Master Boot Record(MBR)”,它中记录了“Bootloader(446byte)和分区表(64byte)”,Bootloader容易理解,但分区表指的是什么呢?

分区表有 64个byte可以记录4条数据,也就是一块硬盘最多可以有四个主分区。那么逻辑分区怎么办呢?如下图

上图中 分区表中记录了一个主分区和一个扩展分区,而扩展分区“又指向一个分区(sector)”,那么逻辑分区的信息就存放在这个 sector中。

 

对于一个硬盘分区时,就是用来填充“分区表”的内容,分区表记录了分区从哪个“磁柱”开始到哪个“磁柱”结束,如上图P1: 1~100 磁柱

扩展分区: 101~400磁柱。 对于Linux来说,每个分区的开始的第一个“磁区”可以存放扩展信息。

 

Linux中硬盘的显示方式:

IDE: 硬盘号:hda,hdb,hdc,hdd,分区号:hda1,hda5,hda6,hda7,其中 hda1为主分区, hda5~7分逻辑分区

SATA/SCSI/USB:  硬盘号: sda/sdb... 分区号: sda1 sda5,sda6 ,意义同 IDE硬盘

 

 

Linux开机启动:

BIOS决定到哪个硬盘

Bootload决定加载哪个OS内核,如Windows内核或Linux内核,同时Bootloader也可以跳转到另一个Bootloader中,另一个Bootloader不是存放在MBR里,是存放在开始磁柱的第一个磁区。

那么这个带菜单的 Bootloader(开机启动程序) 就称为 Grub或者其它类似的。

二、硬盘格式化的本质含义

格式化后才能使用文件系统,格式化以一个分区为基础,经过格式化就把磁盘分为多个 block 了
格式化分区时会生成 superblock, inode , data block等,他们的作用为:
superblock:记录此 filesystem 的整体资讯,包括inode/block的总量、使用量、剩余量, 以及档案系统的格式与相关资讯等;
inode:记录档案的属性,一个档案占用一个inode,同时记录此档案的资料所在的 block 号码;
block:实际记录档案的内容,若档案太大时,会占用多个 block;block 记录实际的文档内容,大小可以为 1K 2K 4K;
            一个block只能存放一个文件,若此文件较大则要占用多个block,若较小则只占用一个,但此block剩下的空间不能再
           被使用,因此为造成一定浪费.

Ext2与Fat的block组织方式不同:

三、Linux Ext2文件系统

Ext2文件系统的分区图示如下:

下面对重要的部分进行说明:

inode table:
一个inode只有128 byte,且这个inode还要记录“档案”的属性信息,如下:
该档案的存取模式(read/write/excute);
该档案的拥有者与群组(owner/group);
该档案的容量;
该档案建立或状态改变的时间(ctime);
最近一次的读取时间(atime);
最近修改的时间(mtime);
定义档案特性的旗标(flag),如 SetUID...;
该档案真正内容的指向 (pointer);

如果一个文件非常大,占用非常多的block,那么它的inode并不能存储如此多的block号,这时怎么办呢?它使用如下方式存储:

superblock(一个分区有一个superblock):
他记录的资讯主要有:
block 与 inode 的总量;
未使用与已使用的 inode / block 数量;
block 与 inode 的大小 (block 为 1, 2, 4K,inode 为 128 bytes);
filesystem 的挂载时间、最近一次写入资料的时间、最近一次检验磁碟 (fsck) 的时间等档案系统的相关资讯;
一个 valid bit 数值,若此档案系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1.

一些需要注意的地方:

dumpe2fs 命令来查看某一个分区的 superblock及group信息,另外注意此命令可以查看某个分区的 label,
如 查看 /dev/sda5 的label,以方便在 fstab 中用到:
dumpe2fs /dev/sda5 (注意 /dev/sda5要已经挂载才行)
... //第一部分为superblock的信息
...//下面为各group的信息
dumpe2fs的命令介绍:
[root@www ~]# dumpe2fs [-bh] 装置档名
选项与参数:
-b :列出保留为坏轨的部分(一般用不到吧!?)
-h :仅列出 superblock 的资料,不会列出其他的区段内容!

四、系统中的一个目录本质上是个文件吗?

目录只占用一个 inode 节点,  且目录的 block 中记录的是“此目录下的文档名及文档名所对应的 inode 号”,目录也是占用硬盘空间的,它占用的空间可以使用

ll -d 目录名来查看,它所占用的空间都是 1024 byte 的倍数,因为 block 是1,2,4中大小的。

 

因为目录的 inode 不记录其目录下的文档名,其目录下的文档名是记录在 block中的,所以如果要修改目录下的文档名,则应该拥有对此目录的“w” 权限。

 

在鸟哥的系统上面与 /etc/passwd 有关的目录与档案资料如上表所示,该档案的读取流程为(假设读取者身份为 vbird 这个一般身份使用者):

  1. / 的 inode:
    透过挂载点的资讯找到 /dev/hdc2 的 inode 号码为 2 的根目录 inode(inode号一般是从2开始),且 inode 规范的权限让我们可以读取该 block 的内容(有 r 与 x) ;

  2. / 的 block:
    经过上个步骤取得 block 的号码,并找到该内容有 etc/ 目录的 inode 号码 (1912545);

  3. etc/ 的 inode:
    读取 1912545 号 inode 得知 vbird 具有 r 与 x 的权限,因此可以读取 etc/ 的 block 内容;

  4. etc/ 的 block:
    经过上个步骤取得 block 号码,并找到该内容有 passwd 档案的 inode 号码 (1914888);

  5. passwd 的 inode:
    读取 1914888 号 inode 得知 vbird 具有 r 的权限,因此可以读取 passwd 的 block 内容;

  6. passwd 的 block:
    最后将该 block 内容的资料读出来。

五、无分类的一些知识

1 文件系统的不一致状态

当写入数据到一个文件时,刚刚写好 inode table 和 data blocks 但没有来得及更新 inode bitmap, block bitmap, superblock 那么这些已经更改过的 block 就没有记录在 bitmap中,这时就存在不一致状态了。

为了避免这种不一致就产生了日志文件,ext3就具有这个功能,日志所做的工作是:

     1 准备写入前做记录, 2 写入中做记录, 3 写好后做记录,

这样即使写文档时出错,也能通过日志恢复,而不用全区查找,进行比对。

2 我们知道如果要对硬盘上的数据进行操作,要先读入内存, 为了使对内存的修改写到硬盘中,应该使用 sync命令。

3  如果我们要读一个文件时才从硬盘上加载,这样就会降低速度,为了提高速度 Linux 在启动时把常用的文档调入到内存,这也就是为什么 Linux的内存总是用完的原因。

4  用ls -ild / /. /.. 查看一下,会发现 inode 都是2, 同时这三个目录也在一个挂载点内,所以这三个目录指的就是同一个目录,也就是说 / 目录的上一级目录就是它本身。

5 linux支持的文件系统

  • 传统档案系统:ext2 / minix / MS-DOS / FAT (用 vfat 模组) / iso9660 (光碟)等等;
  • 日志式档案系统: ext3 / ReiserFS / Windows' NTFS / IBM's JFS / SGI's XFS
  • 网路档案系统: NFS / SMBFS

6  VFS (Vritual filesystem)

Linux上层是通过VFS访问底层的文件系统的。

六、磁碟与目录的容量
df [-ahikHTm] [目录或档名]    (注:此命令相当于Windows下的查看每个分区的剩余容量)
选项与参数:
-a  :列出所有的档案系统,包括系统特有的 /proc 等档案系统;
-k  :以 KBytes 的容量显示各档案系统;
-m  :以 MBytes 的容量显示各档案系统;
-h  :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-T  :连同该 partition 的 filesystem 名称 (例如 ext3) 也列出
下面是一个 df 后面跟一个目录的例子 (df不是用于目录的工具,它不会列出目录的容量大小)
df -h /etc
Filesystem            Size  Used Avail Use% Mounted on
/dev/hdc2             9.5G  3.7G  5.4G  41% /
# 这个范例比较有趣一点啦,在 df 后面加上目录或者是档案时, df
# 会自动的分析该目录或档案所在的 partition ,并将该 partition 的容量显示出来,
# 所以,您就可以知道某个目录底下还有多少容量可以使用了! ^_^

du [-ahskm] [档案或目录名称]   (注:此命令针对目录)
选项与参数:
-a  :列出所有的档案与目录容量,因为预设仅统计目录底下的档案量而已。
-h  :以人们较易读的容量格式 (G/M) 显示;
-s  :列出总量而已,而不列出每个各别的目录占用容量;
-S  :不包括子目录下的总计,与 -s 有点差别。
-k  :以 KBytes 列出容量显示;
-m  :以 MBytes 列出容量显示;

七、硬连接与符号连接(命令为 ln)
硬连接的实质:
一个文件应该存在某些特定的 block 中,这些block 的 id 存储在一个 inode中.
目录的block只存储目录下文件的 文件名<-->inode号 的对应关系.
有可能出现这么一种情况:
filename_1 <-->inode_1
filename_2 <-->inode_1
这样 filename_1和filename_2 就指向了同一个 inode_1,这时可以说 filename_2是filename_1的硬连接.

硬连接的限制:
不能跨 Filesystem;
不能 link 目录

符号连接的实质:
我自己建立了一个文件,这个文件的名子为: /root/fstab,这个文件的内容为:
/etc/fstab
当我打开 /root/fstab这个文件时,它会查找自己的内容,发现这个内容为 /etc/fstab,
这时它为主动去查找 /etc/fstab 这个文件 用来显示.
当我把 /root/fstab 这文件软连接删除,只不过是删除了一个文件而已,对被连接的文件没有任何影响.
(注:以上所讲是为了理解软连接,是一种模拟)

ln [-sf] 来源档 目标档
选项与参数:
-s  :如果不加任何参数就进行连结,那就是hard link,至于 -s 就是symbolic link
-f  :如果 目标档 存在时,就主动的将目标档直接移除后再建立!

或许您已经发现了,那就是,当我们以 hard link 进行‘档案的连结’时,可以发现,在 ls -l 所显示的第二栏位会增加一才对,
那么请教,如果建立目录时,他预设的 link 数量会是多少? 让我们来想一想,一个‘空目录’里面至少会存在些什么?呵呵!
就是存在 . 与 .. 这两个目录啊! 那么,当我们建立一个新目录名称为 /tmp/testing 时,基本上会有三个东西,那就是:
/tmp/testing
/tmp/testing/.
/tmp/testing/..
而其中 /tmp/testing 与 /tmp/testing/. 其实是一样的!都代表该目录啊~
而 /tmp/testing/.. 则代表 /tmp 这个目录,
所以说,当我们建立一个新的目录时, ‘新的目录的 link 数为 2 ,
而上层目录的 link 数则会增加 1.

八、磁碟的分割、格式化、检验与挂载
磁碟分割: fdisk  (相当于装系统时进行硬盘分区)
fdisk [-l] 装置名称
如 fdisk /dev/sda
fdisk -l  (这样可以把你的 U 盘列出来)
fdisk的 menu 各项的意思,在执行时查看帮助

对各分区格式化:
mkfs [-t 档案系统格式] 装置档名
选项与参数:
-t  :可以接档案系统格式,例如 ext3, ext2, vfat 等(系统有支援才会生效)
mkfs -t ext3 /dev/hdc6
一个技巧:
mkfs[tab][tab]
mkfs         mkfs.cramfs  mkfs.ext2    mkfs.ext3    mkfs.msdos   mkfs.vfat
# 按下两个[tab],会发现 mkfs 支援的档案格式如上所示!可以格式化 vfat 喔!

mkfs 对 档案系统的标头(Label)、Block的大小以及 inode 的数量 等都没有让用户指定而是采取的默认值,
如果你想指定这些细节可以使用 mke2fs 命令:
mke2fs [-b block大小] [-i block大小] [-L 标头] [-cj] 装置
选项与参数:
-b  :可以设定每个 block 的大小,目前支援 1024, 2048, 4096 bytes 三种;
-i  :多少容量给予一个 inode 呢?
-c  :检查磁碟错误,仅下达一次 -c 时,会进行快速读取测试;
      如果下达两次 -c -c 的话,会测试读写(read-write),会很慢~
-L  :后面可以接标头名称 (Label),这个 label 是有用的喔!e2label指令介绍会谈到~
-j  :本来 mke2fs 是 EXT2 ,加上 -j 后,会主动加入 journal 而成为 EXT3

磁盘检验与修复:(注意此命令只有在文件系统出现问题或对刚刚格式化好的U盘进行检查时才使用)
fsck [-t 档案系统] [-ACay] 装置名称
选项与参数:
-t  :如同 mkfs 一样,fsck 也是个综合软体而已!因此我们同样需要指定档案系统。
      不过由于现今的 Linux 太聪明了,他会自动的透过 superblock 去分辨档案系统,
      因此通常可以不需要这个选项的啰!请看后续的范例说明。
-A  :依据 /etc/fstab 的内容,将需要的装置扫瞄一次。/etc/fstab 于下一小节说明,
      通常开机过程中就会执行此一指令了。
-a  :自动修复检查到的有问题的磁区,所以你不用一直按 y 啰!
-y  :与 -a 类似,但是某些 filesystem 仅支援 -y 这个参数!
-C  :可以在检验的过程当中,使用一个长条图来显示目前的进度!

EXT2/EXT3 的额外选项功能:(e2fsck 这支指令所提供)
-f  :强制检查!一般来说,如果 fsck 没有发现任何 unclean 的旗标,不会主动进入
      细部检查的,如果您想要强制 fsck 进入细部检查,就得加上 -f 旗标啰!
-D  :针对档案系统下的目录进行最佳化配置。

[小知识]
lostt+found 该目录就是在当你使用 fsck 检查档案系统后,若出现问题时,有问题的资料会被放置到这个目录中喔!

mount指令:
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:      重新挂载,这在系统出错,或重新更新参数时,很有用!
挂载 CD 或 DVD 光碟:
[root@www ~]# mkdir /media/cdrom
[root@www ~]# mount -t iso9660 /dev/cdrom /media/cdrom
[root@www ~]# mount /dev/cdrom /media/cdrom  (不指定 iso9660也行,系统会自己测试)

使用 Label name 进行挂载的方法: (需要了解,在fstab文件中会用到)
dumpe2fs -h /dev/hdc6  (用 dumpe2fs查看 Label)
Filesystem volume name:   vbird_logical
# mount -L "vbird_logical" /mnt/hdc6  (真正的挂载)

修改磁盘分区的Label:
e2label 装置名称  新的Label名称

九、设置开机自动挂载
/etc/fstab 各列的意义
第一列:
分区名称(或者 Label名,因为每个分区都可以有一个Label名)
第二列:
挂载点
第三列:
filesystem格式如 ext2/3, vfat等
第四列:
预设参数(具体的参数可以看鸟哥教程或man)
第五列:
能否被 dump 备份指令作用,要么为0,要么为1
第六列:
是否以 fsck 检验磁区,0 是不要检验, 1 表示最早检验(一般只有根目录会设定为 1,
2 也是要检验,不过 1 会比较早被检验啦! 一般来说,根目录设定为 1 ,
其他的要检验的 filesystem 都设定为 2 就好了。

下面是一个例子:
#dev           mount point    filesystem     parameters     dupm   fsck
/dev/sda5        /mnt/d        vfat        iocharset=utf8    0      2

设定好fstab文件之后要用  mount -a 命令把 fstab 的内容挂载一下,以防有错.
如果有错,当执行 mount -a 时就能发现,这样就不会导致开机时挂载不成功的问题.

挂载下载好的 ISO 影像文件:
mount -o loop /root/centos5.2_x86_64.iso /mnt/centos_dvd  (注意只是多了个-o loop 选项)
列出挂载后的信息如下:
df
Filesystem                  1K-blocks      Used       Available Use% Mounted on
/root/centos5.2_x86_64.iso   4493152      4493152         0     100% /mnt/centos_dvd

抱歉!评论已关闭.