《鸟哥Linux私房菜》学习笔记_chap10_磁盘 文件系统管理

时间:2022-07-07 05:13:53

◆1.回顾认识硬盘,以及partition(另见NG_Linux6_练习机上装Fedora.txt):
 ☞ 扇区 ( sector ) - 最小的物理组成单位,一般为512byte - 0.5KB
 ☞ 块 ( block ) - 最小储存单位,sector 的 2 的次方倍数最小的物理组成单位
                   ps:block不是越大越好,要根据实际的文件零碎情况确定
                       superblock:superblock之于partition 等同于 0磁道之于硬盘
 ☞ 磁道 ( track) - 当磁头固定不动 (假设机械手臂不动) ,硬盘盘转一圈所画出来的圆就是所谓的磁道
 ☞ 磁柱 ( cylinder ) - 所有硬盘盘上面相同半径的那一个磁道就组成磁柱

 ☞ 分区( partition,既是指动作,又是指动作的结果 )
  - 动作:以指定“起始、结束磁柱”的方式将硬盘划分为若干区域。
  - 结果:划分出来的区域就是(partition)
  ps:这些分割的信息就是记录在MBR里
 ☞ 每个partition都对应着一种文件系统
     
◆2.Linux 的 EXT2 档案系统( inode ):
 ☞ ext2 档案系统当中,我们将每个档案分为【属性】、【内容】两个部分来储存
    - 属性 -> inode(还是pointer to the block in which the file's content is recorded)
    - 内容 -> block中
    当 partition 被格式化为 ext2 的档案系统时,他一定会有 inode table 与 block area 这两个区域。

  o inode【大小 128 bytes】 中的具体内容:
    - 该档案的拥有者与群组(owner/group);
    - 该档案的存取模式(read/write/excute);
    - 该档案的类型(type);
    - 该档案的相关时间:
        ctime 建立或状态改变的时间
        atime 最近一次的读取时间
        mtime 最近修改的时间(ls预设的显示时间)
    - 该档案的容量(size);
    - 定义档案特性的旗标(flag),如 SetUID...;
    - 该档案真正内容的指向 (pointer);

  ps:可以利用 ls 的相关功能来查询到时间!而预设的显示时间是 mtime
      ls -la --time=atime PATH

◆3.Linux 系统如何读取一个档案的内容?

 ☞ 目录:
    当我们在 Linux 下的 ext2 档案系统建立一个目录时, ext2 会分配一个 inode 与至少一块 Block 给该目录。其中

,inode 记录该目录的相关属性,并指向分配到的那块 Block ;而 Block 则是记录在这个目录下的相关连的档案(或目录)

的关连性!

 ☞ 档案:
    当我们在 Linux 下的 ext2 建立一个一般档案时, ext2 会分配至少一个 inode 与相对于该档案大小的 Block 数量

给该档案。例如:假设我的一个 Block 为 4 Kbytes ,而我要建立一个 100 KBytes 的档案,那么 linux 将分配一个

inode 与 25 个 Block 来储存该档案!

 ps:inode 本身并不纪录文件名,而是记录档案的相关属性,至于文件名则是记录在目录所属的 block 区域

 ☞ 档案与目录的关系:
    档案的相关连结会记录在目录的 block 数据区域, 所以当我们要读取一个档案的内容时,我们的 Linux 会先由根目

录 / 取得该档案的上层目录所在 inode , 再由该目录所记录的档案关连性 (在该目录所属的 block 区域) 取得该档案的

inode , 最后在经由 inode 内提供的 block 指向,而取得最终的档案内容

 ☞ 个人感觉:
  o 目录在block区的内容就是Map<String, inode号>
                                 ↑
                               文件名

    [root@linux ~]# ls -lia /
    2      drwxr-xr-x 24 root root  4096 Jul 16 23:45 .
    2      drwxr-xr-x 24 root root  4096 Jul 16 23:45 ..
    719489 drwxr-xr-x 83 root root 12288 Jul 21 04:02 etc
    523265 drwxr-xr-x 24 root root  4096 Jun 25 20:16 var
      ↑                                              ↑
    inode号                                         文件名

  o 根据路劲搜索文件时,inode - block - inode - block ...  - inode - block  ...  - inode - block

◆补充:something confusing...

  [root@linux ~]# ls -lid / /home
  2 drwxr-xr-x 26 root root 4096 7月 21 09:08 /
  2 drwxr-xr-x 42 root root 4096 7月 14 23:37 /home

  ??????????????怎么 / 与 /home 的 inode number 都是 2 ?
  answer:原因很简单啊!因为 / 是 /dev/hda1 而 /home 是 /dev/hda2 ,这两个 partition 都有 inode number 为 2

的号码。


◆4.ext2 有几个特色:
  - Blocks 与 inodes 在一开始格式化时 (format) 就已经固定了;
  - 一个 partition 能够容纳的档案数与 inode 有关;
  - 一般来说,每 4Kbytes 的硬盘空间分配一个 inode ;
  - 一个 inode 的大小为 128 bytes;
  - Block 为固定大小,目前支持 1024/2048/4096 bytes(1k/2k/4k) 等;
  - Block 越大,则损耗的硬盘空间也越多。
  - 关于单一档案: 若 block size=1024,最大容量为 16GB,若 block size=4096,容量最大为 2TB;
  - 关于整个 partition : 若 block size=1024,则容量达 2TB,若 block size=4096,则容量达 32TB。
  - 文件名最长达 255 字符,完整文件名长达 4096 字符。

◆5.inode数量问题:

 ☞ 通常 inode 数量的多寡设定为 (partition 的容量) 除以 (一个 inode 预计想要控制的容量)。 举例来说,若我的

block 规划为 4Kbytes,假设我的一个 inode 会控制两个 block ,亦即是假设我的一个档案大致的容量在 8Kbytes 左右

时,假设我的这个 partition 容量为 1GBytes, 则 inode 数量共有:( 1G * 1024M/G * 1024K/M ) / ( 8K ) = 131072

个。而一个 inode 占用 128 bytes 的空间,因此格式化时就会有 ( 131072个 * 128bytes/个 ) = 16777216 byes =

16384 Kbytes 的 inode table 。也就是说,这一个 1GB 的 partition 在还没有储存任何数据前, 就已经少了 16MBytes

的容量

 ☞ 当 block 大小越小,而 inode 数量越多,则可利用的空间越多,但是大档案写入的效率较差; 这种情况适合档案数

量多,但是档案容量小的系统,例如 BBS 或者是新闻群组( News )这方面服务的系统;

 ☞ 当 Block 大小越大,而 inode 数量越少时,大档案写入的效率较佳,但是可能浪费的硬盘空间较多; 这种状况则比

较适合档案容量较大的系统!


◆6.EXT2 fs物理结构
 ☞ 物理结构划分
    superblock
    group description ┐
    block bitmap      │
    inode bitmap      ├ Block Group1
    inode table       │
    data blocks       ┘
                         Block Group2
                         ...
                         Block GroupN

  o SuperBlock:如前所述, Superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个

filesystem 了。他记录的信息主要有:
    - block 与 inode 的总量;
    - 未使用与已使用的 inode / block 数量;
    - 一个 block 与一个 inode 的大小;
    - filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等档案系统的相关信息;
    - 一个 valid bit 数值,若此档案系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1 。

  o Group Description:纪录此 block 由何处开始记录;
  o Block bitmap:此处记录那个 block 有没有被使用;
  o Inode bitmap:此处记录那个 inode 有没有被使用;
  o Inode table:为每个 inode 数据存放区;
  o Data Blocks:为每个 block 数据存放区。

 ☞ 查看这些信息
    sudo dumpe2fs /dev/hda1

◆7.日志式档案系统

 ☞ 产生原因
    在 EXT2 档案系统当中,要进行档案的写入时,会将数据分别在数据存放区与 metadata 区记录下来, 若当这两个动

作无法一次完成时,就会造成所谓的不一致现象。若发生不一致现象, 因为系统不知道是那个档案发生不一致现象,所以

就会将整个 filesystem 做一致性的检查,如此一来,很费时。

 ☞ 在 filesystem 当中,规划出一个区块,专门来记录写入或修订档案时的步骤,也就是说:
    1. 当系统要写入一个档案的时候,会先在日志记录区块中纪录:某个档案准备要写入磁盘了;
    2. 开始写入档案的权限与数据;
    3. 开始更新 metadata 的数据;
    4. 完成数据与 metadata 的更新后,在日志记录区块当中完成该档案的纪录。

◆8.挂载点的意义 (mount point):

 ☞ 基本概念:
  - 档案系统 (filesystem) 通过『挂载 (mount)』才能被Linux使用
  - 目录可以记录文件名与 inode 的相关信息,此外, 目录也是让我们得以跟 filesystem 产生对应的入口点。因此,我

们称那个入口点目录为『 挂载点 (mount point) 』
  ps:挂载点一定是『目录』而不是档案!也就是说,这个挂载点就是进入该 filesystem 的入口

◆9.其它 Linux 支持的档案系统

 ☞ 常见的支持档案系统有:
  - 传统档案系统:ext2 / minix / MS-DOS / FAT (用 vfat 模块) / iso9660 (光盘)等等;
  - 日志式档案系统: ext3 / ReiserFS / Windows' NTFS / IBM's JFS / SGI's XFS
  - 网络档案系统: NFS / SMBFS

 ☞ 查看:
  - 想要知道您的 Linux 支持的档案系统有哪些,可以察看底下这个目录:
    [root@linux ~]# ls -l /lib/modules/`uname -r`/kernel/fs
  - 查看系统目前已启用的档案系统:
    [root@linux ~]# cat /proc/filesystems

◆10.磁盘与目录的容量:

 ☞ df
    [root@linux ~]# df [-ahikHTm] [目录或文件名]
  o 参数:
  * -a :列出所有的档案系统,包括系统特有的 /proc 等档案系统;
    ps :使用 -a 这个参数时,系统会出现 /proc 这个扇区,但是里面的东西都是 0 ,不要紧张! /proc 的东西都是

Linux 系统所需要加载的系统数据,而且是挂载在『内存当中』的, 所以当然没有占任何的硬盘空间啰!
    -k :以 KBytes 的容量显示各档案系统;
    -m :以 MBytes 的容量显示各档案系统;
  * -h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
    -H :以 M=1000K 取代 M=1024K 的进位方式;
  * -T :连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
  * -i :不用硬盘容量,而以 inode 的数量来显示

    df -h /etc 在 df 后面加上目录或者是档案时, df会自动的分析该目录或档案所在的 partition ,并将该

partition 的容量显示出来,

  o 结果说明:
    - Filesystem:代表该档案系统是在那个 partition 啊,所以列出装置名称;
    - 1k-blocks:说明底下的数字单位是 1KB 呦!可利用 -h 或 -m 来改变容量;
    - Used:顾名思义,就是使用掉的硬盘空间啦!
    - Available:也就是剩下的磁盘空间大小;
    - Use%:就是磁盘的使用率啦!如果使用率高达 90% 以上时, 最好需要注意一下了,免得容量不足造成系统问题喔!

(例如最容易被灌爆的 /var/spool/mail 这个放置邮件的磁盘)
    - Mounted on:就是磁盘挂载的目录所在啦!(挂载点啦!)

 ☞ du
    [root@linux ~]# du [-ahskm] 档案或目录名称
  o 参数:
    -a :列出所有的【档案与】目录容量,因为预设仅统计目录底下的档案量而已。
    -h :以人们较易读的容量格式 (G/M) 显示;
    -s :列出总量而已,而不列出每个各别的目录占用容量;
    -k :以 KBytes 列出容量显示;
    -m :以 MBytes 列出容量显示;

  ex:du -sm /etc/*

◆11.连接档
    连结档有点类似 Windows 底下的『快捷方式』!也就是很多的连结档案( link file )其实都指向同一个来源档案(

source file )!不过,在所有的档案类型当中, 连结档算是比较难理解的一部份了!因为连结档还分成 Hard link 与

symbolic link 两种,这两种连结档在架构上是完全不一样的。

 ☞ Hard Link (硬式连结或实际连结)
  o Hard Link 【只是在某个目录下新增一个该档案的关连数据】而已!
  o 一般来说,使用 hard link 设定连结文件时,磁盘的空间与 inode 的数目都不会改变! 由上面的说明来看,我们可

以知道, hard link 只是在某个目录下的 【block】 多写入一个关连数据,所以当然不会用掉 inode 与磁盘空间啰!
  o 由于 hard link 是在同一个 partition 上面进行数据关连的建立,所以 hard link 是有限制的:
    - 不能跨 Filesystem;
    - 不能 link 目录。【没看懂,为啥不是直接指到目录的inode?】

  *注意 以 hard link 进行『档案的连结』时,可以发现,在 ls -l 所显示的第二字段会增加一

 ☞ Symbolic link (符号连结,亦即是快捷方式)
    基本上, Symbolic link 就是在建立一个独立的档案, 而这个档案会让数据的读取指向他 link 的那个档案内容!由

于只是利用档案来做为指向的动作, 所以,当来源档被删除之后,symbolic link 的档案会『开不了』, 会一直说『无法

开启某档案!』
    与 Windows 的快捷方式可以划上等号,由 Symbolic link 所建立的档案为一个独立的新的档案,所以会占用掉 inode

与 block


◆12.关于目录的 link 数量:
  o 当我们建立一个新目录名称为 /tmp/testing 时,基本上会有三个东西,那就是:
    - /tmp/testing    <- 该目录
    - /tmp/testing/.  <- 该目录
    - /tmp/testing/.. <- 上级目录

    * so:当我们建立一个新的目录时,『新的目录的 link 数为 2 ,而上层目录的 link 数则会增加 1 』

◆13.磁盘的分割、格式化、检验与挂载:

  如果我们想要在系统里面新增一颗硬盘时,应该有哪些动作需要做的呢?有几个动作啰:
    - 1. 对磁盘进行分割,以建立可用的 partition ;
    - 2. 对该 partition 进行格式化( format ),以建立系统可用的 filesystem;
    - 3. 若想要仔细一点,则可对刚刚建立好的 filesystem 进行检验;
    - 4. 在 Linux 系统上,需要建立挂载点 ( 亦即是目录 ),并将他挂载上来;


 ☞ 磁盘分割:fdisk

    fdisk -l /dev/sda

    fdisk其实就是在编辑分区表『 partition table 』

    m p(相当于在外边fdisk -l) n d w q

    “+100M”

    在 fdisk 完成之后,请记得使用 mke2fs 格式化

    以 root 的身份进行硬盘的 partition 时,最好是在单人维护模式底下比较安全一些, 此外,在进行 fdisk 的时候

,如果该硬盘某个 partition 还在使用当中, 那么很有可能系统核心会无法重新加载硬盘的 partition table ,解决的

方法就是将该使用中的 partition 给他卸载,然后再重新进入 fdisk 一遍,重新写入 partition table ,那么就可以成

功啰!

 ☞ 磁盘格式化:mke2fs

    [root@linux ~]# mke2fs [-bicLj] 装置名称

  o 参数:
    -b :可以设定每个 block 的大小,目前支持 1024, 2048, 4096 bytes 三种;
    -i :多少容量给予一个 inode 呢?
    -c :检查磁盘错误,仅下达一次 -c 时,会进行快速读取测试;
         如果下达两次 -c -c 的话,会测试读写(read-write),会很慢~
    -L :后面可以接表头名称 (Label),这个 label 是有用的喔!后面会讲~
    -j :本来 mke2fs 是 EXT2 ,加上 -j 后,会主动加入 journal 而成为 EXT3

  o 范例:
    1.将刚刚建立的 /dev/hdb5 格式化成为 ext3 !且名称为 logical
      [root@linux ~]# mke2fs -j -L "logical" /dev/hdb5

  o 其他格式?
    see:mkfs

 ☞ 制作一个可以开机进入 Linux 的软盘:mkbootdisk

    [root@linux ~]# mkbootdisk --device /dev/fd0 `uname -r`
                                                     ↑
                                       目前 Linux 系统所使用的核心版本

    低阶格式化1.44软盘:mke2fs 指令
    fdformat /dev/fd0H1440

 ☞ 磁盘检验: fsck(有点像是 Windows 的 scandisk)

    [root@linux ~]# fsck [-AtCary] 装置名称

    * fsck, “成果”放在『 lost+found 』,只有挂载 partition 的目录 (就是挂载点) 才会有这个预设的目录

    ** 执行 fsck 时, 被检查的 partition 务必不可挂载到系统上!亦即是需要在卸载的状态

  o 参数:
    -t :fsck 可以检查好几种不同的 filesystem ,而 fsck 只是一支综合程序而已。个别的 filesystem 的检验程序都

在 /sbin 底下,您可以使用 ls -l /sbin/fsck* 去检查看看,就知道有几种 filesystem 啰。预设的 FC4 情况下,至少

有:
ext2, ext3, vfat, msdos 等等 filesystem。
    -A :依据 /etc/fstab 的内容,将所有的装置都扫瞄一次 (通常开机过程中就会执行此一指令)
    -a :自动修复检查到的有问题的扇区,所以你不用一直按 y 啰!
    -r :一定要让使用者决定是否需要修复,这与上一个 -a 刚好相反!
    -y :与 -a 类似,但是某些 filesystem 仅支持 -y 这个参数,所以您也可以利用 -y 啦!
    -C :可以在检验的过程当中,使用一个长条图来显示目前的进度!
    -f :强制检查!一般来说,如果 fsck 没有发现任何 unclean 的旗标,不会主动进入细部检查的,如果您想要强制

fsck 进入细部检查,就得加上 -f 旗标啰!

 ☞ 磁盘检验:badblocks

    badblocks -[svw] 装置名称

    * 跟 Windows 的 scandisk 相同功能啦!不过由于 fsck 的功能比较强,所以目前大多已经不使用这个指令了)

  o 参数:
    -s :在屏幕上列出进度
    -v :可以在屏幕上看到进度
    -w :使用写入的方式来测试,建议不要使用此一参数,尤其是待检查的装置已有档案时!

  o 范例:
    [root@linux ~]# badblocks -sv /dev/hdb5
    Checking blocks 0 to 722893
    Checking for bad blocks (read-only test): done

 ☞ sync 直接将系统暂存在内存当中的数据回存写入磁盘当中

◆14.磁盘挂载与卸载:

    要将建立起来的磁盘档案系统或软盘正式的在 Linux 上面启用时,一定需要将他挂载上档案系统! 而所谓的『挂载点

』则是该 partition 所在的目录,且在该目录下的所有目录都归在该 partition 所有。

  * 如果您要用来挂载的目录里面并不是空的,那么挂载了档案系统之后, 那么原目录下的东西就会【暂时的消失】

  * 在 Linux 或 Unix 系统之下,分区是以目录来代表,也就是说, 一个目录很可能就是一个分区了! 举个例子来说,

通常 Linux 预设的软盘挂载的地点在 /mnt/floppy 这里!那么如果你需要软盘的数据时,就将 /dev/fd0 这一个装置(前

面提过啰!这个是周边存取装置的一个设备档案类型)挂上 /mnt/floppy 就可以啦!然后你进入到 /mnt/floppy 就可以读

取软盘的数据啰

  o 例子:
    假设: / 为 /dev/hda1
           /home 为 /dev/hda2
    则:那么在 /home/test 底下的咚咚就也都归 /dev/hda2 这个 partition 所有

 ☞ mount

    [root@linux ~]# mount -a
    [root@linux ~]# mount [-tonL] 装置名称代号 挂载点

  o 参数:
    -a :依照 /etc/fstab 的内容将所有相关的磁盘都挂上来!
    -n :一般来说,当我们挂载档案系统到 Linux 上头时, Linux 会主动的将目前的 partition 与 filesystem 还有对

应的挂载点,都记录到 /etc/mtab 那个档案中。不过,有些时刻 (例如不正常关机导致一些问题,而进入单人模式)系统无

法写入 /etc/mtab 时,就可以加上 -n 这个参数来略过写入 mtab 的动作。
    -L :系统除了利用装置名称代号 (例如 /dev/hda1) 之外,还可以利用 partition的表头名称 ( Label ) 来进行挂载
    -t :您的 Linux 支持的档案格式。举例来说,我们在上面建立 /dev/hdb5 是 ext3 档案系统,那么要挂载时,就得

要加上 -t ext3来告知系统,用 ext3 的档案格式来挂载该 partition 呢!
      系统支持的 filesystem 类型在 /lib/modules/`uname -r`/kernel/fs 当中。常见的有:
       • ext2, ext3, reiserfs, 等 Linux 惯用 filesystem
       • vfat, msdos 等 Windows 常见 filesystem
       • iso9660 为光盘片的格式
       • nfs, smbfs 等为网络相关档案系统。
      若 mount 后面没有加 -t 档案系统格式时,则 Linux 在预设的情况下,会主动以 /etc/filesystems 这个档案内规

范的档案系统格式

    -o :后面可以接一些挂载时,额外加上的参数喔!比方说账号、密码、读写权限等:
       • ro, rw: 此 partition 为只读(ro) 或可擦写(rw)
       • async, sync: 此 partition 为同步写入 (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 让 user 执行 mount ?一般来说,mount 仅有 root 可以进行,但下达

user 参数,则可让一般 user 也能够对此 partition 进行 mount 。
       • defaults: 默认值为:rw, suid, dev, exec, auto, nouser, and async
       • remount: 重新挂载,这在系统出错,或重新更新参数时,很有用!

  o 范例:
    - 范例一:将刚刚建立的 /dev/hdb5 挂载到 /mnt/hdb5 上面!
      [root@linux ~]# mkdir /mnt/hdb5
      [root@linux ~]# mount -t ext3 /dev/hdb5 /mnt/hdb5
      [root@linux ~]# df

    - 范例二:挂载光盘!
      [root@linux ~]# mount -t iso9660 /dev/cdrom /mnt/cdrom
      [root@linux ~]# mount /dev/cdrom
      # 上面的参数当中提到,如果没有加上 -t 这个参数时,系统会主动的以
      # /etc/filesystems 里面规范的内容给他测试一下是否挂载~另外,
      # 因为我们的 /etc/fstab 里面会规范 /dev/cdrom 应该挂载到那个挂载点,
      # 因此,直接下达 mount /dev/cdrom 也是可以的喔!(当然要看/etc/fstab设定啦!)

    - 范例三:挂载 Window fat 软盘、磁盘!
      [root@linux ~]# mount -t vfat /dev/fd0 /mnt/floppy

      [root@linux ~]# mkdir /mnt/win98
      [root@linux ~]# mount -t vfat /dev/hda1 /mnt/win98
      [root@linux ~]# mount -t vfat -o iocharset=cp950 /dev/hda1 /mnt/win98
                                             ↑
                                          设置编码

    - 范例四:将 / 重新挂载,并加入参数为 rw !
      [root@linux ~]# mount -o remount,rw /

    - 范例五:将 Label 名为 logical 的 partition 挂载到 /mnt/hdb5 中
      [root@linux ~]# mount -t ext3 -L logical /mnt/hdb5

    - 范例六:将系统所有的以挂载的 partition 数据列出来
      [root@linux ~]# mount
        /dev/hda1 on / type ext3 (rw)
        /dev/proc on /proc type proc (rw)
        /dev/shm on /dev/shm type tmpfs (rw)
        /dev/hda5 on /home type ext3 (rw)
        /dev/hdb5 on /mnt/hdb5 type ext3 (rw)

  o 我们也可以利用 mount 来将某个目录挂载到另外一个目录
    - 范例一:将 /home 这个目录暂时挂载到 /tmp/home 底下:
      [root@linux ~]# mkdir /tmp/home
      [root@linux ~]# mount --bind /home /tmp/home
      [root@linux ~]# ls -lid /home/ /tmp/home
        159841 drwxr-xr-x 6 root root 4096 May 30 20:07 /home/
        159841 drwxr-xr-x 6 root root 4096 May 30 20:07 /tmp/home
    - 范例二:将 /tmp/home 卸载:
      [root@linux ~]# umount /tmp/home

    * 其实两者连结到同一个 inode

      ??????? 为什么这不是硬链接的概念???

 ☞ unmount(将装置档案卸载)
    [root@linux ~]# umount 装置代号或挂载点

  o 范例:
    [root@linux ~]# umount /dev/hdb5(装置代号)
    [root@linux ~]# umount /mnt/hdb5(挂载点)


◆15.磁盘参数修订:

 ☞ mknod

    在 Linux 底下所有的装置都以档案来代表,however,个档案如何代表该装置呢?

    [root@linux ~]# mknod 装置名称 [bcp] [Major] [Minor]

  o 参数:
    - 装置种类:
      b :设定装置名称成为一个周边储存设备档案,例如硬盘等;
      c :设定装置名称成为一个周边输入设备档案,例如鼠标/键盘等;
      p :设定装置名称成为一个 FIFO 档案;
    - Major :主要装置代码;
    - Minor :次要装置代码;

  o 范例:
    范例一:建立 /dev/hda10 这个磁盘储存装置
    [root@linux ~]# mknod /dev/hda10 b 3 10
                                       ↑
    # 上面那个 3 与 10 是有意义的,不要随意设定!更多与 Linux 核心有关的装置及装置代号可以参考:
      • http://www.kernel.org/pub/linux/docs/device-list/devices.txt

 ☞ e2label,修改『磁盘的表头数据』,也就是 label

    [root@linux ~]# e2label 装置名称 新的Label名称

  o 范例:
    [root@linux ~]# e2label /dev/hdb5 hdb5
    [root@linux ~]# dumpe2fs -h /dev/hdb5
      Filesystem volume name: hdb5
      .....其它省略.....

    ps:除了利用磁盘的代号之外 (/dev/hdxx) 也可以直接利用磁盘的 label 来挂
        /etc/fstab
 
 ☞ tune2fs

    [root@linux ~]# tune2fs [-jlL] 装置代号

  o 参数:
    -j :将 ext2 的 filesystem 转换为 ext3 的档案系统;
    -l :类似 dumpe2fs -h 的功能~将 superblock 内的数据读出来~
    -L :类似 e2label 的功能,可以修改 filesystem 的 Label 喔!

  o 范例:
    [root@linux ~]# tune2fs -l /dev/hdb5

 ☞ hdparm 启动 DMA 模式,以及测试硬盘的存取效能等等...(其他选项不要轻易改)

  o 范例:测试这颗硬盘的读取效能
    [root@linux ~]# hdparm -Tt /dev/hda
      /dev/hda:
        Timing cached reads: 544 MB in 2.01 seconds = 270.28 MB/sec
        Timing buffered disk reads: 80 MB in 3.01 seconds = 26.56 MB/sec

◆16.设定开机挂载

  /etc/fstab 及 /etc/mtab

  系统挂载的一些限制:
  • 根目录 / 是必须挂载的﹐而且一定要先于其它 mount point 被挂载进来。
  • 其它 mount point 必须为已建立的目录﹐可任意指定﹐但一定要遵守必须的系统目录架构原则
  • 所有 mount point 在同一时间之内﹐只能挂载一次。
  • 所有 partition 在同一时间之内﹐只能挂载一次。
  • 如若进行卸载﹐您必须先将工作目录移到 mount point(及其子目录) 之外。

 ☞ /etc/fstab

    [root@linux ~]# cat /etc/fstab
      # Device     Mount point  filesystem parameters    dump fsck
      LABEL=/      /            ext3       defaults       1    1
      /dev/hda5    /home        ext3       defaults       1    2
      /dev/hda3    swap         swap       defaults       0    0
      /dev/hdc     /media/cdrom auto       pamconsole,exec,noauto,managed 0 0
      /dev/devpts  /dev/pts     devpts     gid=5,mode=620 0    0
      /dev/shm     /dev/shm     tmpfs      defaults       0    0
      /dev/proc    /proc        proc       defaults       0    0
      /dev/sys     /sys         sysfs      defaults       0    0

    其实这个 /etc/fstab 就是将我们使用 mount 来挂载一个装置到系统的某个挂载点, 所需要下达的指令内容,除了

『装置代号、挂载点、档案系统类别、参数』等等,还加入了两项额外的功能,分别是备份指令 dump 的执行与否,以及是

否开机进行 fsck 扫瞄磁盘

  o 栏位说明
    1.磁盘装置代号或该装置的 Label
      使用Label挂载时,格式为:LABEL=(your label name) 来设定您的装置

    2.挂载点 (mount point)
    3.磁盘分割槽的档案系统 (fs)
    4.档案系统参数:每个档案系统还有很多参数可以加入的,例如中文编码的 iocharset=big5,codepage=950 之类
      • async/sync 异步/同步
        是否允许磁盘与内存中的数据以同步写入的动作?使用 async 这个异步写入的方式会比较快速一些。
      • auto/noauto 自动/非自动
        在开机的时候是否自动挂载该扇区?既然设定在这个区域内了, 当然希望开机的时候自动挂载啰!
      • rw/ro 可擦写/只读
        让该扇区以可擦写或者是只读的型态挂载上来,ro适用于 vfat 之类的非 Linux 传统扇区。
      • exec/noexec 可执行/不可执行
        限制在此档案系统内是否可以进行『执行』的工作?如果是纯粹用来储存资料的, 那么可以设定为 noexec 会比

较安全,相对的,会比较麻烦!
      • user/nouser 是否允许使用者使用 mount 指令来挂载呢?一般而言,我们当然允许/不允许使用者挂载不希望一般

身份的 user 能使用 mount 啰,因为太不安全了,因此这里应该要设定为 nouser 啰!
      • suid/nosuid 具有/不具有 suid 权限
        该档案系统是否允许 SUID 的存在?一般而言,如果不是 Linux 系统的扇区,而是一般数据的 partition ,那么

设定为 nosuid 确实比较安全一些!毕竟有 SUID 是蛮可怕的一件事。
      • usrquota
        注意名称是『 usrquota 』不要拼错了!这个是在启动 filesystem 支持磁盘配额模式
      • grpquota
        注意名称是『grpquota』,启动 filesystem 对群组磁盘配额模式的支持。
      • defaults
        同时具有 rw, suid, dev, exec, auto, nouser, async 等参数。基本上,预设情况使用 defaults 设定即可!

    5. 能否被 dump 备份指令作用: 在 Linux 当中,可以利用 dump 这个指令来进行系统的备份的。而 dump 指令则会

针对 /etc/fstab 的设定值,去选择是否要将该 partition 进行备份的动作呢! 0 代表不要做 dump 备份, 1 代表要进

行 dump 的动作。 2 也代表要做 dump 备份动作, 不过,该 partition 重要度比 1 小。

    6. 是否以 fsck 检验扇区: 开机的过程中,系统预设会以 fsck 检验我们的 partition 内的 filesystem 是否完整

(clean)。 不过,某些 filesystem 是不需要检验的,例如虚拟内存 swap ,或者是特殊档案系统, 例如 /proc 与 /sys

等等。所以,在这个字段中,我们可以设定是否要以 fsck 检验该 filesystem 喔。 0 是不要检验, 1 是要检验, 2 也

是要检验,不过 1 会比较早被检验啦! 一般来说,根目录设定为 1 ,其它的要检验的 filesystem 都设定为 2 就好了。

  o /etc/fstab 是开机时的设定档,不过,实际 filesystem 的挂载是记录到 /etc/mtab 与 /proc/mounts 这两个档案当

中的。每次我们在更动 filesystem 的挂载时,也会同时更动这两个档案喔!但是,万一发生您在 /etc/fstab 输入的数据

错误,导致无法顺利开机成功,而进入单人维护模式当中,那时候的 / 可是 read only 的状态,当然您就无法修改

/etc/fstab ,也无法更新 /etc/mtab 啰~那怎么办? 没关系,可以利用底下这一招:
    [root@linux ~]# mount -n -o remount,rw /
    加上 -n 则不更新 /etc/mtab ,加上 -o 则提供额外的参数设定。 利用这一动作,嘿嘿!您的 / 就可以读写,那么

自然就能够更新档案内容啰~


◆17.特殊装置 loop 挂载

 ☞ 虚拟装置的建立和挂载

  1.建立大型档案
    [root@linux ~]# dd if=/dev/zero of=/tmp/loopdev bs=1024k count=2048
      2048+0 records in
      2048+0 records out

  2.格式化
    [root@linux ~]# mke2fs -j /tmp/loopdev

  3.挂载
    [root@linux ~]# mount -t ext3 -o loop /tmp/loopdev /media/cdrom/
    [root@linux ~]# df


 ☞ swap 的扩增

    swap 主要的功能是当物理内存不够时,则某些在内存当中所占的程序会暂时被移动到 swap 当中,让物理内存可以被

需要的程序来使用。另外,如果您的主机支持电源管理模式, 也就是说,您的 Linux 主机系统可以进入『休眠』模式的话

,那么, 运作当中的程序状态泽会被纪录到 swap 去,以作为『唤醒』主机的状态依据!。 另外,有某些程序在运作时,

本来就会利用 swap 的特性来存放一些数据段

    swap 的建立其实也很简单。建立出 swap 这个【装置】【或】者是【档案】后, 将他格式化成为 swap 的格式,最后

将他挂载到系统上即可

  o 装置
    1. 以『 fdisk /dev/hd[a-d] 』先建立一个 partition,然后,将该 partition 的 ID 改为 82 这一个 swap 的磁盘

档案格式代号
    2. 以『 mkswap /dev/hd[a-d][1-16] 』的方式来将您刚刚建置出来的 partition 『格式化为 swap 的档案格式』
    3. 以『 swapon /dev/hd[a-d][1-16] 』将 swap 启动

    ps:关掉是用swap off

  o 档案
    1. 以 dd 指令来建立 swapfile ;
    2. 以 mkswap 来将 swapfile 格式化为 swap 的档案格式;
    3. 以 swapon 来启动该档案,使成为 swap ;
    4. 以 swapoff 来关闭该档案!

    - ex:面新增 64MB 的虚拟内存
      1.使用 dd 这个指令来新增一个 64MB 的档案在 /tmp 底下:
        [root@linux ~]# dd if=/dev/zero of=/tmp/swap bs=4k count=16382
          16382+0 records in
          16382+0 records out
        # dd 这个指令是用来转换档案并且 copy 用的;
        # if 指的是要被转换的输入档案格式 /dev/zero 可以由 man zero 来查看内容;
        # of 指的是输出的档案,我们将之输出到 /tmp/swap 这个档案;
        # bs 指的是一个扇区占用几个 kb ;
        # count 指的是要使用多少个 bs ,所以最后的容量为 bs*count = 4k * 16382 ~ 64MB

      2. 使用 mkswap 将 /tmp/swap 这个档案格式化为 swap 的档案格式:
        [root@linux ~]# mkswap /tmp/swap
          Setting up swapspace version 1, size = 67096576 bytes
        # 请注意,这个指令在下达的时候请『特别小心』,因为下错字元控制,
        # 将可能使您的 filesystem 挂掉!

      3. 使用 swapon 来将 /tmp/swap 启动

        [root@linux ~]# free
                       total  used   free shared buffers cached
          Mem:         62524 60200   2324      0     716  19492
          -/+ buffers/cache: 39992  22532
          Swap:       127004  2620 124384

        [root@linux ~]# swapon /tmp/swap

        # 如果您需要每次都启动该档案,那么将 swapon /tmp/swap 写入 /etc/rc.d/rc.local 当中即可!
        [root@linux ~]# free
                       total  used   free shared buffers cached
          Mem:         62524 60200   2324      0     716  19492
          -/+ buffers/cache: 40024  22500
          Swap:       192524  2620 189904


      4. 使用 swapoff 关掉 swap file
        [root@linux ~]# swapoff /tmp/swap

  o 限制
    • 最多 32 个
    • 总量最大为 64GB


ex:

• 如何增加一颗新的硬盘在你的 Linux 系统当中?请详述流程:
安装硬盘:关掉 Linux 主机电源,调整 Hard Disk 的 Jump (master 或 slave),串接在 IDE 的接口,请注意,留意你

增加的硬盘所串接的 IDE 接口为哪一个插槽,例如你插在 IDE2 的 Master ,则你的硬盘应为 hdc;此外,需要特别留意

的是,目前的机器中,如果是 ATA 66 以上的排线(那种很密的排线),那么 master 或者是 slave 在排在线的顺序是固

定的!底端的是 Mater 而中间的是 Slave ,这点请稍微注意呦! 新增硬件于BIOS:开启计算机后,按 del 键进入 BIOS

,选择 IDE Hard Disk Detector 字样的选项, 让BIOS去捉硬盘,然后再选择 Save and Exit;不过,较新的机器通常都

可以自动侦测了!但是, 如果你的机器是旧型的,那么还是手动来增加硬盘吧! Linux 系统侦测:如果你的 Linux 系统

有启动 kudzu 这个服务时,那么开机就会自动去侦测新的硬件装置! Fedora Core IV 预设是有开启这项服务的,除非你

关掉他了!OK,假设你有开启这项服务,那么开机进入 Linux 的时候,系统会告诉你有捉到一个新的硬件,你可以按

『configure』由系统直接安装即可; 格式化硬盘:以 root 的身份进入 Linux 后,执行以下两个程序:fdisk /dev/hd

[a-d] 与 mke2fs /dev/hd[a-d][1-16] 。 建立 mount point:假设我的这颗硬盘要挂在 /disk3 下面,那么就需要 :

mkdir /disk3 开机自动加载( mount ):再来则是以 vi 修改 /etc/fstab 档案,让每次开机把这个硬盘直接挂入系统中。

安装完成:你可以使用 mount -a 来将全部的装置重新挂载一遍,或者是重新开机就可以啦!
• 假设条件:我原先规划的 /home 只有 1GB ,但是目前的使用者日众,所以容量不足!我想要增加一棵 8GB 的旧硬盘,

要如何作?!
将硬盘加入 Linux 系统中:利用刚刚上一题的方式将你的硬盘加入到 Linux 系统中,亦即是使用 fdisk 与 mke2fs 建立

了 ext2 的档案格式的硬盘!好了,假设该硬盘的代号为 /dev/hdc1 好了! 挂载新硬盘:由于我需要将新旧扇区都挂上来

,这样才有办法将数据由旧硬盘移到新硬盘上面,OK! 我就建立一个暂存的目录,称为 /disk-tmp:
mkdir /disk-tmp mount -t ext2 /dev/hdc1 /disk-tmp
如此一来则 /disk-tmp 就是新挂上来那颗 8 GB 的硬盘啦! 移动数据:好了!现在开始将数据 copy 到新挂上的硬盘上面

吧!
cd /home tar -zcvf /disk-tmp/home.tar.gz * cd /disk-tmp tar -zxvf home.tar.gz
上面的指令会将目前旧有的 /home 底下的东西完全的压缩之后移动到 /disk-tmp/home.tar.gz 这个压缩档,然后再到

/disk-tmp 底下将他解压缩!这样数据就复制到新挂上来的硬盘啦! 卸载旧的,挂上新的:好了,那么我们就开始来测试

一下吧!你可以这样做:
umount /home mount -t ext2 /dev/hdc1 /home
注意呦!如果你的 /home 底下原本就没有挂载扇区的话,那么你就可以直接将 /home 底下的数据都砍掉,然后在挂上新的

那颗硬盘就好了!而 home.tar.gz 这个档案就可以用作为备份之用! 开机执行:同样的,如果要设定成开机就挂上这颗新

的硬盘,那就修改 /etc/fstab 档案吧!
• 如果扇区 /dev/hda3 有问题,偏偏他是被挂载上的,请问我要如何修理此一扇区?
umount /dev/hda3 fsck /dev/hda3