当前位置: 100md首页 > 电子书籍 > 资料26 > 一些大合集 > 书屋电子书 > 05
编号:112626
《鸟哥的Linux私房菜:基础学习篇》.azw3 .txt
基本信息:
    书名: 鸟哥的Liunx私房菜.基础学习篇
    作者: 鸟哥著;王世江改编.--3版.--北京:人民邮电出版社,2010.6
    国际标准书号: mobi-asin:4d1fb0af-aa34-47ae-9473-512b2dbbfeeb
    电子版包括 .azw3 .txt等格式:
    《鸟哥的Linux私房菜:基础学习篇》第三版.azw3 文件 13207 KB,
    《鸟哥的Linux私房菜:基础学习篇》第三版.txt 文件 88.8 万字,2298 KB。
pdf部分截图:
目录:
        当我们在 Linux 下的 ext2 文件系统新建一个目录时,ext2会分配一个inode与至少一块block给该目录。其中,inode记录该目录的相关权限与属性,并可记录分配到的那块block号码;而block则是记录在这个目录下的文件名与该文件名占用的inode号码数据。也就是说目录所占用的block内容在记录如下的信息:
        如果想要实际查看 root 目录内的文件所占用的 inode 号码时,可以使用 ls-i 这个参数来处理:
        [root@www ~]# ls -li
        total 92
        654683 -rw------- 1 root root 1474 Sep 4 18:27 anaconda-ks.cfg
        648322 -rw-r--r-- 1 root root 42304 Sep 4 18:26 install.log
        648323 -rw-r--r-- 1 root root 5661 Sep 4 18:25 install.log.syslog
        由于每个人所使用的计算机并不相同,系统安装时选择的选项与分区都不一样,因此你的环境不可能与我的inode号码一模一样。上面所列出的inode仅是鸟哥的系统所显示的结果而已。而由这个目录的 block结果我们现在就能够知道,当你使用“ll/”时,出现的目录几乎都是1024的倍数,为什么呢?因为每个block的数量都是1K,2K,4K。看一下鸟哥的环境:
        [root@www ~]# ll -d / /bin /boot /proc /lost+found /sbin
        drwxr-xr-x 23 root root 4096 Sep 22 12:09 /<==一个 4K block
        drwxr-xr-x 2 root root 4096 Sep 24 00:07 /bin<==一个 4K block
        drwxr-xr-x 4 root root 1024 Sep 4 18:06 /boot<==一个 1K block
        drwx------ 2 root root 16384 Sep 5 01:49 /lost+found <==4个 4K block
        dr-xr-xr-x 96 root root 0 Sep 22 20:07 /proc<==此目录不占硬盘空间
        drwxr-xr-x 2 root root 12288 Sep 5 12:33 /sbin<==3个 4K block
        由于鸟哥的根目录/dev/hdc2使用的block大小为4K,因此每个目录几乎都是4K的倍数。其中由于/sbin的内容比较复杂因此占用了3个block,此外,鸟哥的系统中/boot为独立的分区,该分区的block为1K而已,因此该目录就仅占用1024 bytes的大小。至于奇怪的/proc我们在第6章就讲过该目录不占硬盘容量,所以当然耗用的 block就是0。
        由上面的结果我们知道目录并不只会占用一个 block 而已,也就是说:在目录下面的文件数如果太多而导致一个 block 无法容纳的下所有的文件名与 inode 对照表时, Linux 会给予该目录多一个 block 来继续记录相关的数据。
        文件
        当我们在Linux下的ext2新建一个一般文件时,ext2会分配一个inode与相对于该文件大小的block数量给该文件。例如:假设我的一个block为4KB,而我要新建一个100KB的文件,那么linux将分配一个inode与25个block来存储该文件。但同时请注意,由于inode仅有12个直接指向,因此还要多一个block来作为块号码的记录。
        目录树读取
        好了,经过上面的说明你也应该要很清楚地知道 inode 本身并不记录文件名,文件名的记录是在目录的block当中。因此在第6章文件与目录的权限说明中,我们才会提到新增/删除/重命名文件名与目录的w权限有关的特点。那么因为文件名是记录在目录的block当中,因此当我们要读取某个文件时,就务必会经过目录的inode与block,然后才能够找到那个待读取文件的inode号码,最终才会读到正确的文件的block内的数据。
        由于目录树是由根目录开始读起,因此系统通过挂载的信息可以找到挂载点的 inode 号码(通常一个文件系统的最顶层inode号码会由2号开始),此时就能够得到根目录的inode内容,并依据该inode读取根目录的block内的文件名数据,再一层一层地往下读到正确的文件名。
        举例来说,如果我想要读取/etc/passwd这个文件时,系统是如何读取的呢?
        在鸟哥的系统上面与/etc/passwd有关的目录与文件数据如上所示,该文件的读取流程为(假设读取者身份为vbird这个一般身份用户):
        1./的inode
        通过挂载点的信息找到/dev/hdc2的inode号码为2的根目录inode,且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内容的数据读出来。
        文件系统大小与磁盘读取性能
        另外,关于文件系统的使用效率上,当你的一个文件系统规划得很大时,例如100GB这么大时,由于硬盘上面的数据总是经常变动的,所以,整个文件系统上面的文件通常无法连续写在一起(block 号码不会连续的意思),而是填入式地将数据填入没有被使用的 block 当中。如果文件写入的block真的分得很散,此时就会有所谓的文件数据离散的问题发生了。
        如前所述,虽然我们的ext2在inode处已经将该文件所记录的block号码都记上了,所以数据可以一次性读取,但是如果文件真的太过离散,确实还是会发生读取效率低的问题,因为磁头还是得要在整个文件系统中来来去去地频繁读取。那么可以将整个文件系统内的数据全部复制出来,将该文件系统重新格式化,再将数据复制回去即可解决这个问题。
        此外,如果文件系统真的太大了,那么当一个文件分别记录在这个文件系统的最前面与最后面的block号码中,此时会造成硬盘的机械手臂移动幅度过大,也会造成数据读取性能低。而且磁头在搜寻整个文件系统时,也会花费比较多的时间。因此,分区的规划并不是越大越好,而是真的要针对你的主机用途来进行规划才行。