我们在前面的档案权限介绍的章节当中,提到很多的权限与属性的观念,那么接下来要了解的是,这些属性是记录在硬盘的那个地方?这里就要特别了解到 Linux 文件系统( filesystem )是如何记录档案,与档案是如何被读取的啰!而要了解整个文件系统的观念,就不能不知道硬盘的组成组件!所以,在这个章节当中,我们由最基础的硬盘组成组件介绍起,并介绍 inode 与链接文件等基本知识,以及如何利用开机即可挂载的方式来使我们的各个 partition 可以在开机时就已经进行好挂载的动作喔! |
整个读取的流程大致上就是这样,不过这里有几点小事情要提醒一下:
- 在目录底下的档案数如果太多而导致一个 Block 无法容纳的下所有的关连性数据时,Linux 会给予该目录多一个 Block 来继续记录关连数据;
- 一个档案所占用的 Block 都会记录在该档案所在的 inode 内,所以硬盘的磁头可以直接去读取各个 Block ,除非该档案所储存的各个 Block 真的很离散(事实上不太可能发生),否则在 Linux 的 ext2 当中,是不需要进行碎片整理的!
- inode 数量与 Block 的大小在格式化的时候就已经被设定好了,通常一个 Block 的大小为 4 Kbytes,至于 inode 的数量则依据不同的设定而异,基本的设定为 ( 硬盘大小 / 一个 inode 所控制的容量 ) 。举例来说,我有一个 1 GBytes 的硬盘,我希望该硬盘中 inode 的数量只要 block 的一半就好了,那么就可以设定一个 inode 控制的容量为 8 Kbytes ,则 inode 数量共有: ( G * 1024M/G * 1024K/M )/( 8 K ) = 131072 个 inode 啰!而 inode table 则占去了 131072 * 128 byte = 16777216 bytes = 16384 Kbytes。也就是说,这一个 1GB 的硬盘还有没任何数据时,就少了 16 MBytes 的容量啦!(用在 inode table 上面)。
- 因为一个 inode 只能记录一个档案的属性,所以 inode 数量比 block 多是没有意义的!举上面的例子来说,我的 Block 规划为 4 Kbytes ,所以 1GB 大概就有 262144 个 4Kbytes 的 block ,如果一个 block 对应一个 inode 的话,那么当我的 inode 数量大于 262144 时,多的 inode 将没有任何用处,徒然浪费硬盘的空间而已!另外一层想法,如果我的档案容量都很大,那么一个档案占用一个 inode 以及数个 block ,当然 inode 数量就可以规划的少很多啦!
- 格式化 Linux 的 ext2 文件系统,可以使用 mke2fs 这个程序来执行!
- 当 block 大小越小,而 inode 数量越多,则可利用的空间越多,但是大档案写入的效率较差;这种情况适合档案数量多,但是档案容量小的系统,例如 BBS 或者是新闻组( News )这方面服务的系统;
- 当 Block 大小越大,而 inode 数量越少时,大档案写入的效率较佳,但是可能浪费的硬盘空间较多;这种状况则比较适合档案容量较大的系统!
Linux 文件系统的运作:
好了,知道了 Linux 标准的 ext2 文件系统的状况后,再来了解一下那么 Linux 系统在运作时,他是如何进行数据的存取呢?!我们知道,整个计算机主机当中,输出输入 (I/O) 最快速的应该是 CPU 的快取了,然后则是主存储器,至于硬盘的存取则比前两个慢上许多。为了让 Linux 加快整个系统的存取效率,因此在 Linux 上面通常采取异步处理( asynchronously )的方式。什么是异步呢?举例来说:『当系统读取了某一个档案, 则该档案所在的 区块数据会被加载到内存当中,所以该磁盘区块就会被放置在主存储器的缓冲快取区中,若这些区块的数据被改变时,刚开始数据仅有主存储器的区块数据会被改 变,而且在缓冲区当中的区块数据会被标记为” Dirty “,这个时候磁盘实体区块尚未被修正!所以亦即表示,这些” Dirty “区块的数据必需回写到磁盘当中,以维持磁盘实体区块上的数据与主存储器中的区块数据的一致性。』
为什么要这么做呢?这是因为主存储器的运作速度比起硬盘来实在是快太多了,万一系统当中有一个档案相当的大,而又持续性的存取,那么由于较慢的硬盘存取速 度,将使得整个 Linux 速度被拖垮,所以才会使用异步方式的数据处理啊!不过,也由于硬盘与主存储器的数据可能没有同步化,因此,如果 Linux 不正常关机( 例如跳电或者是当机 )时,则由于数据尚未回写入磁盘当中,会导致系统在再次开机时,会花相当多的时间进行磁盘检验,同时也有可能造成磁盘的损毁啊!
了解了硬盘之后,接下来当然要知道我的 Linux 系统里面还剩下多少磁盘空间啰!嗯,那么在文字接口底下有什么方法可以查看目前的磁盘最大容许容量、已经使用掉的容量、目前所在目录的已使用容量?还有还 有, 怎么知道目前目录底下使用掉的硬盘容量呢?以及如何查询目前的 inodes 数目?呵呵!底下我们就来谈一谈主要的两个指令:df 查看已挂载磁盘的总容量、使用容量与 inode 等等
du 查看档案使用掉的容量有多少?
df
语法:
[root @tsai
/root ]# df -[ikm]
参数说明: -i: 使用 i-nodes 显示结果 -k: 使用 KBytes 显示结果 -m: 使用 MBytes 显示结果 范例: [root @test /root ]# df -k <==以 KB 显示磁盘空间 Filesystem 1k-blocks Used Available Use% Mounted on /dev/hda1 2118832 904600 1106600 45% / /dev/hda3 497861 37525 434632 8% /disk1 none 31220 0 31220 0% /dev/shm /dev/hda5 101089 4127 91743 5% /proxy1 /dev/hda6 101089 4127 91743 5% /proxy2 /dev/hda2 1004052 38360 914688 5% /var /dev/fd0 1423 1405 19 99% /mnt/floppy |
语法:
[root @test
/root ]# du [-abckms] [目录名称]
参数说明: [目录名称] 可以省略,如果省略的话,表示要统计目前所在目录的档案容量 -a :全部的档案与目录都列出来!默认值是指列出目录的值! -b :列出的值以 bytes 输出 -c :最后加总 total ! -k :列出的值以 KB 输出 -m :列出的值以 MB 输出 -s :只列出最后加总的值! 范例: [root @test /root]# du -m <==列出 /root 底下的目录与档案所占的容量以 MB 输出 [root @test /root]# du -s /home <==将 /home 底下的目录与档案的容量加总后输出,这里只会输出总容量! |
什么是连结档呢?其实连结档有点类似 Windows 底下的『快捷方式』!也就是很多的连结档案( link file )其实都指向同一个来源档案( source file )!不过,在所有的文件类型当中,连结档算是比较难理解的一部份了!因为连结档还分成 Hard link 与 symbolic link 两种,这两种连结档在架构上是完全不一样的咚咚,底下就来好好的谈一谈先!
Hard Link:在前一节当中,我们提到档案的读取方式为:(1)先由一层一层的目录取得档案相关的关连数据,(2)再到对应的 inode 取得档案的属性,以及档案内容数据所在的 Block ,(3)最后到 Block area 取得档案的资料。那么 hard link 怎么制作档案的连结呢?!很简单, Hard Link 只是在某个目录下新增一个该档案的关连数据而已!
举个例子来说,我的 /home/vbird/crontab 为一个 hard link 的档案,他连结到 /etc/crontab 这个档案,也就是说,其实 /home/vbird/crontab 与 /etc/crontab 是同一个档案,只是有两个目录( /etc 与 /home/vbird )记录了 crontab 这个档案的关连数据罢了!也就是说,我由 /etc 的 Block 所记录的关连数据可知道 crontab 的 inode 放置在 A 处,而由 /home/vbird 这个目录下的关连数据, crontab 同样也指到 A 处的 inode !所以啰, crontab 这个档案的 inode 与 block 都没有改变,有的只是有两个目录记录了关连数据。
一般来说,使用 hard link 设定链接文件时,磁盘的空间与 inode 的数目都不会改变!由上面的说明来看,我们可以知道, hard link 只是在某个目录下的 block 多写入一个关连数据,所以当然不会用掉 inode 与磁盘空间啰!(注:其实可能会改变的,那就是当目录的 Block 被用完时,就可能会新加一个 block 来记录,而导致磁盘空间的变化!不过,一般 hard link 所用掉的关连数据量很小,所以通常不会改变 inode 与磁盘空间的大小喔! )
由于 hard link 是在同一个 partition 上面进行数据关连的建立,所以 hard link 是有限制的:
- 不能跨 Filesystem;
- 不能 link 目录。
Symbolic Link:相对于 hard link , Symbolic link 可就好理解多了,基本上,他就是在建立一个独立的档案,而这个档案会让数据的读取指向他 link 的那个档案内容!由于只是利用档案来做为指向的动作,所以,当来源档被删除之后,symbolic link 的档案会『开不了』,会一直说『无法开启某档案!』。这里还是得特别留意,这个 Symbolic Link 与 Windows 的快捷方式可以给他划上等号,由 Symbolic link 所建立的档案为一个独立的新的档案,所以会占用掉 inode 与 block 喔!
由上面的说明来看,似乎 hard link 比较安全,因为即使某一个目录下的关连数据被杀掉了,也没有关系,只要有任何一个目录下存在着关连数据,那么该档案就不会不见!举上面的例子来说,我的 /etc/crontab 与 /home/vbird/crontab 指向同一个档案,如果我删除了 /etc/crontab 这个档案,该删除的动作其实只是将 /etc 目录下关于 crontab 的关连数据拿掉而已, crontab 所在的 inode 与 block 其实都没有被变动喔!不过,不幸的是,由于 Hard Link 的限制太多了,包括无法做『目录』的 link ,所以在用途上面是比较受限的!反而是 Symbolic Link 的使用方面较广喔!好了,说的天花乱坠,看您也差不多快要昏倒了!没关系,实作一下就知道怎么回事了!要制作连结档就必须要使用 ln 这个指令呢!
语法:
[root @test
/root ]# ln [-s] [来源档] [目的檔]
参数说明: -s :提供 symbolic line 的连结! 如果直接以 ln 不加任何参数的话,那么就属于 hard link 啰! 范例: [root @test /root]# mkdir test [root @test /root]# cd test [root @test test]# cp /usr/bin/passwd . 0. 原本的信息:
1. Hard Link
信息:
2. Symbolic
Link 信息:
3. 用 more 来试试看是怎样?!
|
ln –s /bin /root/bin那么如果你进入 /root/bin 这个目录下,『请注意呦!该目录其实是 /bin 这个目录,因为你做了连结档了!』所以,如果你进入 /root/bin 这个刚刚建立的链接目录,并且将其中的数据杀掉时,嗯! /bin 里面的数据就通通不见了!这点请千万注意!并不是 /root 底下的资料都是 root 的!还需要注意一下该属性才行!
对于一个系统管理者 ( root ) 而言,硬盘的的管理是相当重要的一环,尤其近来硬盘已经渐渐的被当成是消耗品了.....好了,如果我们要 partition 一颗新的硬盘,要使用什么程序来工作?而如果已经 partition 好了,又要如何来格式化呢?刚刚我们提到了 inodes 这个东西,那么使用格式化 ( format ) 的软件可以怎样的来格式化好我们所需要的 inodes 的大小呢?这里我们就来谈一谈啰!fdisk 硬盘切割 partition 的工具
mke2fs 就是 Linux 底下重要的 format 格式化的工具
e2label 修改硬盘的 label (表头名称) 的工具!
mknod 新增硬件对应文件的工具!
[root @test
/root ]# fdisk [-l] [装置名称]
参数说明: -l :直接列出该硬盘装置的 partition table 范例: [root @test root]# fdisk /dev/hdb<==分割我的 hdb 磁盘,记得后面不接数字 Command (m for
help): m <==印出说明内容
Command (m for help): p <==印出目前的磁盘分区状态 Disk /dev/hdb:
128 heads, 63 sectors, 523 cylinders
Device Boot Start
End Blocks Id System
Command (m for help):q <==不储存离开 fdisk [root @test root]# fdisk -l /dev/hdb<==直接秀出这颗硬盘当中的 partition Disk /dev/hdb:
128 heads, 63 sectors, 523 cylinders
Device Boot Start
End Blocks Id System
|
[root@test
root]# fdisk /dev/hdb
Command (m for help): p Disk /dev/hdb:
128 heads, 63 sectors, 523 cylinders
Device Boot Start
End Blocks Id System
Command (m for
help): d
Command (m for help): p Disk /dev/hdb:
128 heads, 63 sectors, 523 cylinders
Device Boot Start
End Blocks Id System
|
[root @test
root]# fdisk /dev/hdb
Command (m for help): p <==印出信息 Disk /dev/hdb:
128 heads, 63 sectors, 523 cylinders
Device Boot Start
End Blocks Id System
Command (m for
help): n <
==选择新增
Command (m for help): p <==再印出信息 Disk /dev/hdb:
128 heads, 63 sectors, 523 cylinders
Device Boot Start
End Blocks Id System
Command (m for
help): n <
==再次新增
Command (m for help): p Disk /dev/hdb:
128 heads, 63 sectors, 523 cylinders
Device Boot Start
End Blocks Id System
|
[root @test
/root ]# mke2fs [-b block-size] [-i inode-size]
[root @test /root ]# mke2fs [-c] [root @test /root ]# mke2fs [-L] [root @test /root ]# mke2fs [-j] 参数说明: -b :在设定每个数据区块占用的大小,目前支持的大小有 1024, 2048, 4096 三种! -i :设定 inode 值! -c :检查错误磁盘,会比较慢呦! -L :规划设定这个扇区的 label (表头名称) -j :建立 ext3 这个 journaling 的文件格式 范例: [root @test /root]# mke2fs /dev/hda5 以 mke2fs 预设的条件( ext2 )格式化 /dev/hda5 这个装置 [root @test
/root]# mke2fs -c /dev/hda5
[root @test
/root]# mke2fs –j -b 8192 -i 8192 /dev/hda5
[root @test
/root]# mke2fs /dev/fd0
<==格式化软盘呀!
This filesystem
will be automatically checked every 35 mounts or
|
[root @test
/root ]# e2label [/dev/hd...] [label_name]
参数说明: 范例: [root @test /root]# e2label /dev/hda1 / 上面的案例为将 /dev/hda1 这个磁盘槽的名字设定为 / 啦! |
[root @test
root]# mknod [device] [bcp] [Major] [ Minor]
参数说明: b :设定节点成为周边储存设备档 c :设定节点成为接口设备如鼠标等 p :建立 FIFO 范例: [root@test /]# cd /dev [root@test dev]# ll hda* lr-xr-xr-x 1 root root 32 Oct 19 13:04 hda -> ide/host0/bus0/target0/lun0/disc lr-xr-xr-x 1 root root 33 Oct 19 13:04 hda1 -> ide/host0/bus0/target0/lun0/part1 lr-xr-xr-x 1 root root 33 Oct 19 13:04 hda2 -> ide/host0/bus0/target0/lun0/part2 [root@test dev]# ll ide/host0/bus0/target0/lun0/ total 0 brw------- 1 root root 3, 0 Jan 1 1970 disc brw------- 1 root root 3, 1 Jan 1 1970 part1 brw------- 1 root root 3, 2 Jan 1 1970 part2 [root@test dev]# mknod hda3 b 3 3<==注意到啰!那个 3 3 就是上面的数值 [root@test dev]# ll hda* lr-xr-xr-x 1 root root 32 Oct 19 13:04 hda -> ide/host0/bus0/target0/lun0/disc lr-xr-xr-x 1 root root 33 Oct 19 13:04 hda1 -> ide/host0/bus0/target0/lun0/part1 lr-xr-xr-x 1 root root 33 Oct 19 13:04 hda2 -> ide/host0/bus0/target0/lun0/part2 brw-r--r-- 1 root root 3, 3 Oct 22 17:16 hda3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
现在也建立好了新的 partition 了,也 format 好了,那么有没有其他的关于硬盘的工作需要来进行呢?有的,就是需要怎样来检查硬盘有没有坏轨呢?那个就是 fsck 这个工具的用途啦!此外,您会发现到,在 / 这个目录底下 ( 其实只要有挂载硬盘的那个目录底下都有这个目录 ) 会有一个特殊的目录,就是『 lost+found 』这个目录啦!对的!就是当你处理完 fsck 之后,如果程序有发现到任何的错误的档案,就会将该档案的数据给他丢到这个目录当中,嘿嘿!所以当你发现你的 Linux 目录当中有这个档案时,不要担心,那个是正常的啦!而且只有挂载 partition 的目录才会有这个默认的目录啰!
还有,由于在 Linux 系统当中,为了增加系统效能,通常系统默认就是一些数据会写在内存当中,并不会直接将数据写入硬盘里面,这是因为内存的速度要比硬盘快上若干倍呀!但 是有个问题就发生了,万一系统由于『跳电』或者是其他的莫名原因,造成系统的 shutdown 时,唉呀!怎么办?!系统就完蛋啦!所以啰,我们需要在某些特定的时候让数据直接回存到硬盘之中呀!了乎!这里提供几个惯用的指令,其中,那个 fsck 是相当重要的,请参考其用法啰!fsck 检查硬盘有没有坏轨的工具
badblocks 跟 fsck 一样,但是 fsck 的功能比较强,所以这个指令可以不学!
sync 将 内存中的数据给他同步化写入硬盘中
fsck
语法:
[root @test
/root ]# fsck [-Aar] [装置名称]
参数说明: -A :依据 /etc/fstab 的内容,将所有的装置都扫瞄一次(通常开机过程中就会执行此一指令) -a :自动修复检查到的有问题的扇区,所以你不用一直按 y 啰! -r :一定要让使用者决定是否需要修复,这与上一个 -a 刚好相反! 范例: [root @test /root]# fsck -a /dev/hda5 <==检查 /dev/hda5 这个扇区有没有错误! |
[root @test
/root ]# badblocks [-svw] [装置名称]
参数说明: -s :在屏幕上列出进度 -v :可以在屏幕上看到进度 -w :使用写入的方式来测试,建议不要使用此一参数,尤其是待检查的装置已有档案时! 例: [root @test /root]# badblocks -sv /dev/hda1 |
[root @test
/root ]# sync
参数说明: 例: [root @test /root]# sync; sync |
嗯!搞定了上面的动作了没?!好了,如果搞定了的话,现在我们来制作一个可以开机 的软盘开机片好了!怎么制作呢?呵呵!就是利用 mkbootdisk 啰!
mkbootdisk 制作软盘开机片
fdformat 这是用来『低阶格式化』软盘的工具
mkbootdisk
语法:说明:
[root @test /root ]# mkbootdisk --device /dev/fd0 `uname -r`
参数说明:
--device :后面接装置!通常接的就是软盘啦 /dev/fd0 !
范例:
[root @test /root]# mkbootdisk --device /dev/fd0 `uname -r` <==建立可开机软盘!!
这是制作启动盘的指令,其中,『 `uname -r` 』是目前 Linux 系统所使用的核心版本,如果你有多个核心版本的话,你以可以直接输入核心版本。例如在我的系统中,旧的核心还是有保留的,所以我都会至少有两个核心,在我 管理的某部主机中,核心为 2.4.7 及 2.4.18 ,那么如果我要直接以 2.4.18 来开机的话,就可以使用mkbootdisk --device /dev/fd0 2.4.18建立软盘开机片一直是个好主意!他可以在你求助无门的时候给你莫大的帮助喔!所以,建立一个新的软盘开机片是一个好主意啦!
- fdformat
语法:说明:
[root @test /root ]# fdformat [装置名称]
参数说明:
例:
[root @test /root]# fdformat /dev/fd0H1440
这是用来『低阶格式化』软盘的指令。(注意:软盘的装置文件为 /dev/fd0 )!在上面的装置档案为 /dev/fd0H1440 , 其中加在 /fd0 之后的 H1440 为表示 1.44MB 的软盘容量!在低阶格式化之后,还要将软盘的文件格式化为 Linux 的 ext2 之型态,则需要使用 mke2fs 指令!
要将上面我们所建立起来的硬盘或软盘正式的在 Linux 上面启用时,一定需要将他挂载上文件系统!而所谓的『挂载点』则是该硬盘所在的目录,且在该目录下的所有目录都归在 该硬盘所有!假设一个情况好了,我们的 / 为 /dev/hda1 而 /home 为 /dev/hda2 ,那么在 /home/test 底下的咚咚就也都归 /dev/hda2 这个 partition 所有啰!而需要特别留意的是,由于挂载文件系统需要挂载点,所以挂载的时候得先建立起挂载的目录才行!除此之外,如果您要用来挂载的目录里面并不是空的, 那么挂载了文件系统之后,那么原目录下的东西就会暂时的消失。举个例子来说,假设您的 /home 原本是属于根目录 / 底下的 partition 所有,底下原本就有 /home/test 与 /home/vbird 两个目录。然后你想要加入新的硬盘,并且直接挂载 /home 底下,那么当您挂载上新的 partition 时,则 /home 显示的是该 partition 的内容,至于原 先的 test 与 vbird 这两个目录就会暂时的被隐藏掉了!注意喔!并不是被覆盖掉,而是 暂时的隐藏了起来,等到 partition 被 umount 之后,则该目录的内容就会再次的跑出来啦!
- mount
语法:说明:
[root @test /root ]# mount [-ahlV]
[root @test /root ]# mount -t type /dev/hdxx /mountpoint
[root @test /root ]# mount -o [options]
[root @test /root ]# umount /mountpoint
参数说明:
-a :依照 /etc/fstab 的内容将所有相关的磁盘都挂上来!
-h :只列出 mount 相关的参数,并不挂载任何装置
-l :列出目前已经挂载的装置、文件系统名称与挂载点!
-V :列出 mount 的版本信息
type :将后面 /dev/hdxx 这个装置以 type 的文件格式挂载到 /mountpoint 这个点,
常见的 type 有底下几个:
vfat, msdos :这个是支持 Windows 系统的文件格式,尤其是 vfat 常用!
ext, ext2 :这个就是 Linux 的主要文件格式啦!
iso9660 :光驱的文件格式
nfs, ntfs, ufs :Windows 2000 使用 NTFS 格式呀!
-o :这个参数后面接的咚咚可多了!可用的资料可不少呢!
rw :让 mount 的扇区为可擦写
suid :允许该扇区可以配置文件案为 SUID 的状态!
exec :允许该扇区可以执行 binary 的档案!
auto :允许该扇区可以使用 mount -a 的参数设定!
nouser :禁止其他人(非 root 之用户)使用挂载功能!这是默认值!
async :允许扇区可以进行异步记录(内存与硬盘不同步!最常用!)
defaults:同时具有 rw, suid, dev, exec, auto, nouser, async 这些功能的设定值!
nosuid :不许该扇区具有 SUID 的文件属性!
ro :设定为只读属性!
remount :让系统本来挂载的扇区重新被挂载!
范例:
[root @test /root]# mount -a
[root @test /root]# mount -t iso9660 /dev/cdrom /mnt/cdrom<==挂上光盘
[root @test /root]# mount -t vfat /dev/fd0 /mnt/floppy <==挂上 windows 文件系统的软盘
[root @test /root]# mount -t ext2 /dev/fd0 /mnt/floppy <==挂上 Linux 文件系统的软盘
[root @test /root]# mount -t ext2 /dev/hdc6 /home <==挂上 Linux 文件格式硬盘
[root @test /root]# mount -o remount,rw / <==让根目录重新挂载为可读!
这个指令只有 root 才能执行!如果你不想要单独的将某个磁盘挂上来,那么执行:mount -a就可以依照 /etc/fstab的的参数内容将所有的磁盘给他重新挂上去!此外,需要注意 的是,由于 Linux 系统中,每一个路径都有可能是一个独立的扇区系统,所以需要将每个扇区系统都挂上各自的挂载点!详细的内容请回去参考一下上一篇 Linux 文件系统 的说明。另外,由于各个扇区的文件系统可能并不相同,所以您必须先要了解该扇区的文件系统,这样才可以进行 mount 的工作!如何知道该磁盘的文件格式呢?可以使用 fdisk 来显示的功能即可!
请注意呦!由于 mount 之后的文件格式是没有办法直接被拿掉的!尤其在使用 fsck 检查你的硬盘时,更是不能挂上硬盘的!而如何将硬盘至挂载点卸除呢?呵呵,就直接使用 umount 即可啰!
底下分别谈一谈各个装置的挂载情况:这里可能先要强调一个观念,在 Windows 底下,磁盘分区是以 A, B, C, D, .... 等等的方式来划分的,然而在 Linux 或 Unix 系统之下,却是以目录来代表,也就是说,一个目录很可能就是一个扇区了! 举个例子来说,通常 Linux 默认的软盘挂载的地点在 /mnt/floppy 这里!呵呵!那么如果你需要软盘的数据时,就将 /dev/fd0 这一个装置(前面提过啰!这个是周边存取装置的一个设备文件类型)挂上 /mnt/floppy 就可以啦!然后你进入到 /mnt/floppy 就可以读取软盘的数据啰!OK!在这里也必须要介绍一下 mount 这个指令喔!
- 挂载软盘:
很多朋友常常会使用到软盘,尤其是在网络有问题的时候,那么如何使用 Linux 将软盘挂上来呢?!首先,您给先了解你的磁盘档案的格式,例如 Linux 的文件格式( ext2 )与 Windows 的文件格式( vfat )是不一样的!分别可以使用如下的方式挂上来:
[root @test /] # mount -t ext2 /dev/fd0 /mnt/floppy<==Linux 格式
[root @test /] # mount -t vfat /dev/fd0 /mnt/floppy<==Windows 格式
[root @test /] # umount /mnt/floppy<==将软盘驱动器卸除
所以啰!即使是 Windows 格式的档案,在 Linux 底下仍然是可以读取的到的呦!另外,要注意的是,即使你使用软盘完毕之后,一定要将 /mnt/floppy 卸除之后才可以取出软盘片喔!不然系统会一直告诉你发生错误啰!而在卸除 /mnt/floppy 的时候,你一定不能在该目录底下,否则会发生错误讯息喔!而如果加载的格式不符合,系统也不会将该软盘挂上来的呦!好了,那么怎么制作 ext2 的软盘呢?简单的很,就使用 mke2fs /dev/fd0 就行啦!
- 挂载光盘!
在某些 Linux distribution 底下,例如 Red Hat 7.2 在预设的状态下是将 CDROM 视为一个模块,默认的核心并没有将他加载,所以,如果你需要在 Red Hat 7.2 里面挂载 CDROM 的话,有两个解决的方法:
一个是直接将 CDROM 的模块加载系统中,这个动作比较简单,而且你也可以将这个指令直接写到 /etc/rc.d/rc.local 里面去即可!
[root @test / ]# modprobe cdrom
[root @test / ]# modprobe ide-cd
[root @test / ]# mount -t iso9660 /dev/cdrom /mnt/cdrom
[root @test / ]# umount /mnt/cdrom
前两行是模块的加载,而第三行是挂载 CDROM ,第四行则是卸除!此外,由于预设的 CDROM 挂载就是以 iso9660 的 type 来做的,所以你也可以直接写成 mount /dev/cdrom /mnt/cdrom 就可以啰!
另外一个解决的方法是将 CDROM 的模块编译进核心当中!又有两种方式,一个是直接下载新的核心来编译,另一个则是直接以 Red Hat 出的更新版的核心来直接升级就可以啦!如果是使用 up2date 的话,那么升级核心是很简单的啦!
- 挂载 Windows 扇区:
如果万一你在安装系统的时候忘记将 Windows 的 VFAT 格式的扇区 mount 上你的 Linux 时,该怎么办?!这种现象最常发生在多系统共存的环境中!例如再原有的 Windows 98 或 Win2000 上面安装 Linux ,但是结果却忘记将该扇区挂载上来!嗯!这样需要重新安装吗?!当然不需要了!又不是被入侵!那么该如何挂载上来呢?!就如同前面说的,由于一个目录可能 代表了一个扇区,因此你必须要先建立一个扇区,然后再将此扇区挂载上你的 Linux 目录,就可以啦!另外,由于需要将扇区挂在目录下,所以你还得需要了解你的 Windows 扇区是在哪一个硬盘周边中喔!如何知道你的 Windows 扇区呢?就使用 fdisk 吧!假设你的 Windows 是在 Primary IDE 的硬盘,那么应该就是 /dev/hda 啰!则你可以这样做:
[root @test / ]# fdisk –l /dev/hda
Disk /dev/hda: 255 heads, 63 sectors, 524 cylinders
Units = cylinders of 16065 * 512 bytesDevice Boot Start End Blocks Id System
/dev/hda1 1 268 2152678+ 83 Win95 FAT32
/dev/hda2 * 269 395 1020127+ 83 Linux
/dev/hda3 396 459 514080 83 Linux
/dev/hda4 460 524 522112+ 5 Extended
/dev/hda5 460 472 104391 83 Linux
/dev/hda6 473 485 104391 83 Linux
/dev/hda7 486 498 104391 82 Linux swap
/dev/hda8 499 511 104391 83 Linux
/dev/hda9 512 524 104391 83 Linux
使用 fdisk 指令的话就可以知道你的 Win95 FAT32 的扇区在哪一个,在上表中,显示的是 /dev/hda1 这一个扇区啰!那么假设我要将 Windows 的目录建置在 /mnt/win98 里面呢?就这样做吧:
[root @tsai / ]# mkdir /mnt/win98
[root @tsai / ]# mount -t vfat /dev/hda1 /mnt/win98
[root @tsai / ]# mount -t vfat -o iocharset=cp950 /dev/hda5 /mnt/win98
如此一来就将 Windows 的系统挂到 Linux 里面啰!简单吧!请注意,上面那个第三行所使用的参数可以让您的 Windows 98 的扇区当中的档案显示出正确的中文呦!
- 安装新硬盘:
再来个新问题!那么我如果想要安装一颗新硬盘呢?呵呵,也是很简单啦,就跟在 Windows 底下一样!需要先 fdisk 然后在 format ,之后就可以顺利的挂上 Linux 系统啰!假设我安装的硬盘在 Primary 的第二个 IDE 上面,也就是 /dev/hdb 上,那么整个步骤应该就会是:
[root @test / ]# fdisk /dev/hdb
....... (以下省略!直接以 fdisk 分割好硬盘啦!)[root @test / ]# mke2fs /dev/hdb1
在 Linux 中的 format 是 mke2fs 这一个指令喔!
上面的指令 在将你的硬盘扇区格式化成 Linux 的 ext2 格式啦![root @test / ]# mkdir /disk2
建立一个目 录名称为 /disk2 ,预计用来挂载你的新硬盘[root @test / ]# mount -t ext2 /dev/hdb1 /disk2
将硬盘挂上 Linux 系统啰!
- umount
语法:说明:
[root @test root]# umount [-f] [device|mount_point]
参数说明:
-f :强制将该文件系统退出,最常使用在无法退出的 NFS 文件系统中了!
范例:
[root @test root]# umount /home
就是直接将 mount 上来的文件系统给他卸除即是!卸除之后,可以使用 df 看看是否还存在呢?!
刚刚上面说了许多,那么可不可以在开机的时候就将我要的扇区都挂好呢?!这样我就不需要每次进入 Linux 系统都还要在挂载一次呀!当然可以啰!那就直接到 /etc/fstab 里面去修修就行啰!不过,在开始说明前,这里要先跟大家说一说系统挂载的一些限制:好了,那么我们进入 /etc/fstab 看一看吧:
- 根目录 / 是必须挂载的﹐而且一定要先于其它 mount point 被挂载进来。
- 其它 mount point 必须为已建立的目录﹐可以任意指定﹐但一定要遵守必须的系统目录架构原则。
- 所有 mount point 在同一时间之内﹐只能挂载一次。
- 所有 partition 在同一时间之内﹐只能挂载一次。
- 如若进行卸除﹐您必须先将工作目录移到 mount point(及其子目录) 之外。
[root @test / ]# more /etc/fstab
# History:
# ==================================================
# When Who What
# 2002/10/19 VBird This file had been modified by me.
# ==================================================
# device MountPoint filesystem parameters dump fsck
/dev/hda1 / ext3 defaults 1 1
/dev/hda2 swap swap defaults 0 0
LABEL=/backup /backup ext3 defaults 1 1
none /dev/pts devpts mode=0620 0 0
none /proc proc defaults 0 0
/dev/hda3 /mnt/win98 vfat defaults,iocharset=big5,codepage=950 0 0
我这个人比较龟毛一点,因为 Mandrake 9.0 的 /etc/fstab 档案排列方式蛮丑的,虽然每一栏之间只要以空格符分开即可,但就是觉得丑,所以通常我就会自己排列整齐,并加上批注符号,就是 # 字号,来帮我记忆这些信息!总共有六栏,分别来谈一谈吧!所以,假如我要新增加一个 /dev/hdb1 并且挂载在 /disk2 这个目录下的话,那么我就在该档案的最底加上一行:
- 扇区或标头:就是扇区啦!不过,如果是在安装的时候有给 予一个 label (标头) 的话,那么使用 label 也可以,例如上面的 LABEL=/backup 那一行。而如果是我们增加新的扇区的话,那么这里就必须要使用『扇区』了!例如新安装一个硬盘在 /dev/hdd1 当中,那么这里就写 /dev/hdd1 啰!那么如果我还是想要使用 label 来挂载呢?!就使用 e2label 来建立 label name 啦! e2label 的用法在前一章有说明,忘了的话,快去看看先!
- 挂载的目录点:就是 mount 的挂载点啦!
- 该扇区的文件格式:目前 Linux 大都使用 ext2, ext3, reiserfs 等等的,不过,如果你有使用 Windows 的文件格式的话,那么就可以使用 vfat 啰!目前支持的格式还有 iso9660( 光盘 ), msdos, minix, nfs, swap 等等的文件格式;
- 文件格式参数区:这个就重要了!有哪些磁盘参数可以参考呢? 在前一章的 mount 指令里面介绍了一些些,这里再更详细的提出说明如下:
参数 内容意义 async/sync
异步/同步是否允许磁盘与内存中的数据以同步写入的动作?使用 async 这个异步写入的方式会比较快速一些。 auto/noauto
自动/非自动在开机的时候是否自动挂载该扇区?既然设定在这个区域内了,当然希望开机的时 候自动挂载啰! rw/ro
可擦写/只读让该扇区以可擦写或者是唯独的型态挂载上来,如果是 vfat 之类的扇区,您不想让 Linux 变更的话,那么使用 ro 也不错!能够提供有效的保护呢! exec/noexec
可执行/不可执行限制在此文件系统内是否可以进行『执行』的工作?如果是纯粹用来储存数据的, 那么可以设定为 noexec 会比较安全,相对的,会比较麻烦! user/nouser
允许/不许是否允许用户使用 mount 指令来挂载呢?一般而言,我们当然不希望 user 身份的人能使用 mount 啰,因为太不安全了,因此这里应该要设定为 nouser 啰! suid/nosuid
具有suid/没有suid该文件系统是否允许 SUID 的存在?一般而言,如果不是 Linux 系统的扇区,而是一般数据的 partition ,那么设定为 nosuid 确实比较安全一些!毕竟有 SUID 是蛮可怕的一件事 usrquota 启动用户磁盘配额模式支持 grpquota 启动群组磁盘配额模式支持! defaults 同时具有 rw, suid, dev, exec, auto, nouser, async 这些功能,所以默认情况中,使用这个即可!
另外,如果有兴趣的话,还可以加上类似『iocharset=big5,codepage=950』 这种额外的功能参数以启动中文编码的支持,更详细的数据可以 man mount 搜寻呢!
- 是否可以被 dump 指令备份:这一列在说明,使用 dump 指令来备份时时,该扇区是否跟着一起动作?如果没有数字的话则以 0 带入!由于我们希望有备份的功能,所以这里当然就开启( 1 )啰!
- 检验扇区:这个数字在用来以 fsck 检验扇区用的!在开机与关机的时候,通常 Linux 希望检验一下扇区,所以这里需要设定一下。通常 root (就是根目录 / 啦)需要设定为 1 ,而其他的文件系统( filesystem )就设定为 1 即可!当然啰!由于 proc 及 swap 与 windows 并不需要以 fsck 来检验,所以就可以设定为 0 啰!
/dev/hdb1 /disk2 ext2 defaults 1 1或者我直接在这个档案上面规划好之后,再下达: mount -a 那么程序就会自动的将 /etc/fstab 里面的信息读出,并且依据里面的情况来挂载扇区喔!如此一来,每次开机的时候都会自动的建立好对应的咚咚啦!
有经验的朋友大概都还蛮清楚的,就是 /etc/fstab 写错了的时候(最常发生在 quota 设定的时候)会造成无法开机的窘境,因此,通常我们都会把自己所想要的数据给他写在 /etc/fstab 之后,以 mount –a 驱动看看,此外,如果错误已经造成了呢?那也不要太担心,由于错误造成了,所以根目录 / 默认会变成只读属性,这个时候就得要进行 remount 的工作了,亦即下达:mount –n –o rw,remount /这样应该就可以将磁盘挂载成为可擦写了!
此外,您必须了解的是, /etc/fstab 写的是您的配置文件,但是目前的系统所挂载的信息则是记录在 /etc/mtab 这个档案中喔!这个档案会实时的进行更新,如果您重新手动挂载你的档案 系统,那么这个 mtab 就会跟着变动啰!
我们前面谈了很多各式各样的 filesystem ,不过,您晓得在安装的时候设定的那一个『虚 拟内存, swap 』要如何增加吗?举个简单的例子吧,我们的 Sun 主机上面,由于跑的程序太庞大了,通常 swap 需要开启到 1GB 左右,但是呢,有的时候还是会不够的!在 Linux 当中,如果您需要使用到很大量的虚拟内存,偏偏当初给的 swap 扇区不够大,那要怎么办呢?有什么方法可以来达成:怎么说呢?基本上,虚拟内存就是将硬盘规划出一个区间,让内存的数据可以经由硬盘来读取罢了,那么如果有 swap file 也就够了对不对!是呀!所以这里我们使用两种方法来尝试建立一下 swap 的扩增吧!
- 设定一个 swap partition ?
- 建立一个虚拟内存的档案?
[root@test
/root]# 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 |
[root@test
/root]# mkswap /tmp/swap
Setting up swapspace version 1, size = 67096576 bytes 请注意,这个指 令在下达的时候请『特别小心』,因为下错字元控制,将可能使您的 filesystem 挂掉! |
[root@test
/root]# free
total used free shared buffers cached Mem: 62524 60200 2324 0 716 19492 -/+ buffers/cache: 39992 22532 Swap: 127004 2620 124384 [root@test /root]# swapon /tmp/swap 不要怀疑!这样 就已经将虚拟内存增加 64 MB 啰!如果您需要每次都启动该档案, 那么将 swapon /tmp/swap 写入 /etc/rc.d/rc.local 当中即可! 用 free 这个指令查看一下您的系统啰! [root@test /root]# free total used free shared buffers cached Mem: 62524 60240 2284 0 724 19492 -/+ buffers/cache: 40024 22500 Swap: 192524 2620 189904 |
[root@test
/root]# swapoff /tmp/swap
就直接给他关掉 啰! |
没错,就这么简单的将虚拟内存给他新增啰!赶快来去试试看去!
我们都知道目前的 IDE 硬盘主要的传输模式为 ATA 模式,最近 (2002年) 已经出到了 ATA 133 了!不过,传统上, ATA 66 就已经很厉害了!新的 IDE 硬盘也没有办法完全利用 ATA 100 呢!但是,你知道吗?有没有开启 ATA 这个传输信道的 DMA 模式,对于硬盘的存取效率差很大呦!好了!我们来测试一下磁盘的效能吧!hdparm
语法:说明:
[root @test /root ]# hdparm [-cdmXTt] [装置名称]
参数说明:
-c :提供 32 位的存取模式,支持的型态有:
-c0:关闭 32 位存取模式
-c1:开启 32 位存取模式
-c3:以较为特殊的 sync 模式开启 32 位存取模式(建议值)
-d :是否启动硬盘的 DMA 模式, 0 为关闭, 1 为开启。
-m :设定 multiple sector I/O 的模式,通常默认为 16 ,建议值亦为 16 。
-X :设定 IDE/ATA 模式的项目,支持如下的设定:
-X34:开启 DMA mode 2 (ATA)
-X66:开启 ultra DMA mode 2 (ATA66)
-T :测试暂存区 cache 的存取效能
-t :测试硬盘的实际存取效能 (较正确!)
例:
[root @test /root]# hdparm -Tt /dev/hda <==测试 hda 这颗硬盘的 cache 与实际效能
[root @test /root]# hdparm -d0 /dev/hda<==关闭 DMA 模式!
[root @test /root]# hdparm -d1 -c3 -X66 /dev/hda<==开启 DMA 模式在 DMA 66 ,并且开启 32 位存取模式
这个指令必须要 root 才能执行!此外,需要特别注意, -X 这个参数是很危险的参数设定,除非您非常了解您的硬盘架构,否则不建议自行设定,因为 manual page 上面就有说明到这一点~~不过,无论如何,目前大于 2GB 以上的硬盘至少都已经支持了 DMA 33 了!因此,使用 -X66 应该都是可行的!较常建议的硬盘 DMA 开启功能项目如下:hdparm -d1 -X66 -m16 -c3 /dev/hda另外,基本上目前的 Linux 预设都是开启 DMA 的模式,因此这个指令的功能相对的重要性就降低了!不过,有一点仍然相当的重要,就是 Linux 预设的 -c 是关闭的,亦即是 -c0 的状态,所以你可以增加上面的 -c3 来开启 32 位的存取模式呦!当然了,如果你的硬盘真的是很老旧的,那么就不要开启的好!好了!那么如何开机就启动 DMA 模式呢?!你可以将上面那一段指令写入 /etc/rc.d/rc.local 里面即可!
这里转贴一篇关于 ext2 这个 Linux 文件格式的主要特点:
自从我们开始使用计算机后,大多数的使用者都曾经使用过档案,而我们总是对关于硬盘如何正确 地储存档案感到好奇,它看起来似乎非常抽象,所以今天让我们看一看 Linux 操作系统中较新的文件系统版本『第二延伸系统( ext2 )』,并了解它各方面之用途。 这个文件系统是主要来自于Andrew Tanenbaum 所写的Minix文件系统,它也是唯一可用在免费操作系统的文件系统,称之为Minix。它后来修正为 Linux 所惯用的文件系统并称为延伸文件系统,到现在 Linux 的文件系统称为 ext2 (第二延伸文件系统),它是延伸文件系统中较新的版本并支持访问控制列(ACL)。 但是在着手研究 ext2 文件系统之前,让我们先了解文件系统中之专有名词的关联。
这个程序允许我们在ext2文件系统上去执行文件系统检查,它像是Windows中之 Scandisk一样,但却是一种更有效的系统检查方式。在此,我们可以加上一个文件名来检查上面之损坏区块。 警告:绝对不要在任何已挂载的文件系统上执行 e2fsck/fsck。假如我们想要去执行 fsck,我们应该卸下文件系统后再去执行 fsck(亦即需要 umount 该扇区啰)。如果不这样做,可能会让文件系统毁损。
这允许我们去调整文件系统的参数设定。在此,我们可以设定在两个文件系统检查间之最大 挂载总数、容量标记、错误行为、变更保留的信息和许多其他参数。
这个程序将ext2文件系统状态输出到标准的设备上。它对于分析问题以及存取一般关于 文件系统用法的信息是有帮助的。
这个程序允许我们在先前尚未格式化的磁盘中,去建立一个ext2的文件系统。它提供了 许多的选项包含区块的大小、段落的大小、每一个inode的字节到多种磁盘阵列的选项。mke2fs通常在第一次安装的期间执行,并建立完成新的 root 及其他的文件系统。(就相当于 DOS 底下的 format 程序啦!)
这个程序去搜寻磁盘并检查区块是否已经损坏,它通常会在新的文件系统安装程序前执行, 但请不要在挂载好的文件系统上执行。 |
在最新的 Red Hat 7.2 当中,已经舍弃了 ext2 而改用支持 Journaling 的 ext3 这一个文件格式了,那么这两个咚咚有什么不一样的呢?!底下有一篇翻译过的文章,看看吧!
Red Hat决定在7.2版中使用ext3的格式来作为预设的文件系统在,引起相当多熟悉Linux使用者的关注,但ext3并不是唯一的,也不是众多日志式 (journaling)文件系统中最佳的。 传统的Linux文件系统ext2,对于在相当小容量的硬盘上之小档案而言是相当的 理想。随着硬盘的容量及档案大小大幅增加,整体性能会下滑。有些原因是来自读取未有效利用的磁盘空间,有些原因是来自不正常关机或是电源中断文件系统的恢 复时间。文件系统经由e2fsck在一个1GB的硬盘做检查是毫不费力的,但相同的测试在40GB的硬盘上可能会相当的秏费时间。所以就有日志式文件系统 的诞生。 这些记录硬盘状态的档案称为日志。所以在不正确关机之后重新启动需要参考到日志档案 来重新回复文件系统的状态,而非将整个硬盘做扫描。同时,日志式文件系统可以有更高的硬盘空间使用效率及使数据在各种不同之档案大小中能够快速的读取及写 入。 Linux并不是只有一个日志式的文件系统,它有四个,或是说成三又二分之一个:
“为什么你想要从ext2转换到ext3呢?有四个主要的理由: 可利用性、数据完整性、速度及易于转换”。可利用性,他指出,这意味着从系统中止到快速重新复原而不是持续的让e2fsck执行长时间的修复。ext3的 日志式条件可以避免数据毁损的可能。他也指出”除了写入若干资料超过一次时,ext3往往会较快于ext2,因为ext3的日志使硬盘读取头的移动能更有 效的进行“。然而或许决定的因素还是在Johnson先生的第四个理由中。 “它是可以轻易的从ext2变更到ext3来获得一个强而有力的 日志式文件系统而不需要重新做格式化”他说道。”那是正确的,为了体验一下ext3的好处是不需要去做一种长时间的,冗长乏味的且易于产生错误的备份工作 及重新格式化的动作”。 |
本网页主要以Firefox配合解析度 1024x768 作为设计依据 鸟哥自由软件整合应用研究室