开始学习LINUX了,
每个星期学一些,打算象以前读书一样做些笔记,
week1 2005/11/1 - 2005/11/6 第一章 安装和bootloader
week2 2005/11/7 - 2005/11/13 第二章 文件系统和RPM (未完)
[ 本帖最后由 sam's 于 2005-11-8 19:47 编辑 ]
Chapter 1.rar
Chapter 2.rar
编号1124 回复于:2005-11-05 13:39:19
鼓励!!!最好别用附件,贴出来,大家可以帮你看看
sam's 回复于:2005-11-05 13:57:40
第一章:Linux的安装
每次学习我碰到的第一个问题就是环境问题,我总想第一时间搭建一个学习的环境。尤其是Linux这种的企鹅动物类的确是一个需要亲历亲为才能掌握的冬冬。于是我,一个Linux新手,第一件事情就是在自己常去的技术网站和google寻找RHEL的最新的安装盘片了。(我总是喜新厌旧,总想要找到最新的版本,不过也是,最新版本应该也是最简单的版本,因为软件总是在不断进步的,越来越好用才对。)不辞辛苦,你总能找到的,我就在以下网站(http://it.cnlinux.net/iso/)找到iso盘片,下载并安装的。如果在公司使用有盗版问题的话,对于RHEL来说,CentOS是一个很好的替代品,其实就是用redhat源代码重新编译,大家可以去centos.org下载,其实是完全一样的东西,而且是free的,很棒哦。我都开始转向CentOS了,懒得去每次找RHEL的最新版本。
有了安装盘片,就可以开始安装了。可以在自己的家用电脑上安装windows+linux双系统,如果在公司,我想大家最好的办法还是使用VMWare或者是Virtual PC这样的虚拟机。虽然本人觉得VMWare更好用和更健壮,不过Virtual PC没有版权问题,对于我们这种只是用于学习的人来说也是已经足够的了。我个人就在家使用vmware,在公司使用virtual pc。
我以前安装过RHEL3,感觉RHEL4的安装过程更加友好了,不过在virtual pc上却给我带来很多的麻烦。我把我的安装经历和我觉得应该知晓的预备知识document在这里。
一. 预备知识:
分区
PC的BIOS的工作真的是很简单,做完机器自检之后,如果是从硬盘启动的,只会认定硬盘的0磁面0磁道1扇区,将之读入内存,并将控制权交给它。这个0磁面0磁道1扇区就是我们常常称为硬盘主引导扇区的MBR (Master Boot Record),我们知道一个扇区只有512个字节,还被分成了三个部分:前面部分是启动代码,叫作主引导记录,共446个字节,接着后面的是64个字节是硬盘分区表DPT (Disk Partition Table),用于存放主分区信息,MBR的最后是结束标志2字节。
由于PC硬盘的最初的分区方案只允许4个主分区(Primary Partition )。实际使用中这太少了,为克服这个设计问题,人们发明了扩展分区(Extended Partition)。这个方法允许将基本分区分为若干子分区,这个基本分区被称为扩展分区,而其子分区被称为逻辑分区(Logical Partition)。硬盘是一个整体,每个主分区都有一个启动扇区。
最简单的主引导记录包括一段小程序,读入分区表,检查哪个分区是活动分区(即启动分区),并读入活动分区的第一个扇区:该分区的启动扇区(MBR是整个硬盘的启动扇区)。这个启动扇区包括另一个小程序,读入这个分区(假设是可启动的)上操作系统的第一个部分,然后把控制权交给它。
大家都知道在Linux中一切都是文件,包括我们的硬盘和分区!在Linux 里硬盘和分区都是设备文件,存放在/dev目录下。IDE设备是/dev/hdX,而SCSI设备是/dev/sdX,X是设备标签。IDE设备标签一般从a到d ,为什么,因为我们只有两个IDE接口,而每个IDE接口只能接最多两个硬盘。/dev/hda代表主板上主IDE插口上的主设备,/dev/hdb代表主板上主IDE插口上的从设备,/dev/hdc代表主板上从IDE插口上的主设备,/dev/hdd代表主板上从IDE插口上的从设备。我没有SCSI硬盘,所以不做过多讲述。
如果我们有了一个连接在主板上主IDE插口上的主设备位置的硬盘/dev/hda ,我们开始为硬盘分区,从上面所讲,我们知道硬盘最多可以有4个主分区,而在Linux就这么约定的1-4是主分区(不管实际上有几个主分区),5-8是逻辑分区(不管它在哪个基本分区中),所以从/dev/hda1到/dev/hda4 这4个分区设备文件是为主分区预留的。扩展分区可以是从/dev/hda2到/dev/hda4中的任意一个,但逻辑分区只能是从/dev/hda5开始,而且一定是从/dev/hda5开始的。分区使用的fdisk我想大家应该都会使用吧,而且在Linux安装过程之中可以使用图形化的工具Disk Druid,很容易,使用确省选项就很好。
在windows之中每个硬盘或者分区都有个盘符,好像C:, D:之类的。这一点Linux是与之大不相同的,在Linux之中一切皆文件,我们知道/dev之下的设备文件代表了这个硬盘或者分区,如果分区要能够被我们使用的话,其实最终也需要在其上建立文件系统(就是格式化啊),并最终成为一个目录。所以可能/usr和/boot是在两个不同的分区(甚至硬盘)之下的。不要认为大家都在/之下就认为在一个分区之内。
我把这种目录叫做接挂点(mount point),比如/opt与/不在同一个分区之内,如果我只是把/ mount了,而没有mount /opt,我会发现虽然在/之下有一个/opt目录(怎么发现,使用ls或者dir命令嘛),但是这时候你会发现/opt这时只是一个空目录而已。所有的接挂目录都必须事先存在的,好像我们要mount一个cdrom到/mnt/cdrom,我们必须事先建立一个空的/mnt/cdrom目录。
Note:
e2label又是什么东西呢,我觉得就是我们给分区取的别名。比如我们把hda1分区的mount point设为了/boot,那么我们如果引用/boot的时候,其实也就是在引用hda1。这种资料应该记录在分区的super block之中。在使用fdisk等分区工具创建新的分区的时候,已经帮我们用接挂目录建立了别名。当然我们可以通过e2label命令进行更改,不过最好不要更改,因为如果在Bootloader或者其他什么脚本使用了LABEL=/之类的引用的话,会导致我们的linux的无法正常启动。有兴趣可以做个小实验,启动linux之后,在shell之中打入以下命令,使用fdisk –p /dev/hda 列出分区(不要用swap分区做实验,swap分区没有别名的),然后使用e2label /dev/hda? 逐个查看一下它的别名,找到/boot分区,我知道一般GRUB会用LABEL来引用他们,现在使用e2label /dev/hda? newlabel来更改它的别名,不要再叫/boot。好了, reboot后看看结果吧。
BootLoader
Bootloader的出现也是因为原来的引导代码只是将控制交给活动分区的启动扇区,这样的代码实在太简单了,现实之中有很多更多的需要,比如我们要实现在多个系统之中选择性的启动某个系统。于是出现了更加强大的启动代码,在Linux之中常用的就是以下两个:LILO和GRUB。现在我们没有必要知道这两个Bootloader的不同之处,反正这两个都可以被安装在MBR之中(直接控制启动过程)或者安装在某个分区(需要是活动分区或者需要其他Bootloader的配合)完成启动的任务,GRUB是更新的产品,所以一定比LILO更好些。
对于启动Linux的主要任务是接手控制,加载指定内核,并最终把控制交给内核。
PC的Linux启动过程
我简叙我所理解的Linux的启动过程:
1.BIOS读取MBR主引导扇区(LILO或者GRUB的一部分一般已经写入MBR);
2.于是LILO或者GRUB被加载入内存;
3.LILO或者GRUB会负责加载LINUX内核;
4.内核取得控制权之后会接挂根文件系统/,启动init,一切进程的“鼻祖”,读取/etc/inittab文件;
5.允许所有运行级别1指定的脚本程序;
6.在运行级别1的结尾处告诉系统前进到运行级别n(/etc/inittab之中指定);
允许所有运行级别n(/etc/inittab之中指定)指定的脚本程序;系统就绪;
双系统
通过硬盘分区和相应的BootLoader可以使Windows和Linux在一台电脑上和平共处。
虚拟机的安装
1. VMWare,我是用的VMWare workstation 5
2. Virtual PC
详细安装略。
三. RHEL4的安装
VMWare Workstation V5下的安装:
1. New一个virtual machine,记得选择redhat的enterprise 4。
2. 将CD-ROM选择用下载的第一张CD
3. 接下来power on这台virtual machine
4. 基本上一切的选用default,中间切换一下CD就搞定了
四. 深入BootLoader
我详细讲解一下两种Linux下的Bootloader:LILO和GRUB。
Linux的启动方式
基本方式有如下三种:
1、 Bootloader
大多数启动都是通过这种方式。Linux的Bootloader可以安装在MBR或者某个分区(第二Bootloader)。
2、 Loadlin
Loadlin是一个DOS命令,可以在DOS之中启动Linux。
3、 软盘启动
当然可以通过软盘来启动Linux,这样可以将MBR留给其他操作系统的Bootloader。
MBR只是硬盘的第一个扇区,容量只有512k字节,一般来说复杂的bootloader会分2个阶段来执行。Stage 1 / Stage 2
Stage 1:这一阶段必须安装在MBR或者分区的引导扇区。
Stage 2:第二阶段载入bootloader的所有配置文件,好像GRUB是在/boot之下。
Bootloader除了引导系统,另外一个重要的功能是可以指向另外一个分区的引导扇区,也就是另外一个Bootloader。
比如我的hda1分区安装的是windows,hda2分区内安装的是Linux的/boot,那么在MBR内的GRUB就可以实现以下几种开机方法:
• 直接交给Linux的内核开机
• 将控制权交给/dev/hda2的启动扇区,有可能安装的是LILO
• 将控制权交给/dev/hda1的启动扇区,应该是windows的Loader
但是windows的bootloader总是要写入MBR,这样就无法识别Linux的bootloader了,所以一般来说我们需要先安装windows然后再安装Linux。
sam's 回复于:2005-11-05 13:58:13
initrd
在载入内核的过程之中,都只会mount根目录/,而且一般只以readonly的方式挂接。为了更加方便接挂驱动之类,通常会使用虚拟磁盘(Ramdisk)来辅助实现,这就是initrd和linuxrc了。initrd映像会被一起载入,Linux内核系统会设置虚拟磁盘,并使用linuxrc这个程序的功能来进行模块的加载。完成加载驱动的工作之后,initrd所建立的虚拟磁盘就会被从内存之中去除了。Initrd并非必要的,不过现在的版本好像都有initrd。Linuxrc一般要符合以下条件:
• 文件名必须是linuxrc
• 放置在initrd的最顶层目录
• 是可以被内核执行的
LILO
如果按照之前的default安装,将会选定GRUB作为Bootloader,所以如果要使用LILO的话,需要自己安装LILO包。可以使用rpm命令安装。具体操作如下:
将安装盘4装入CD-ROM
$mount /mnt/cdrom
$cd /mnt/cdrom/RedHat/RPMS
$rpm –Uvh lilo*
记住这只是LILO软件的安装,并不代表LILO已经安装至MBR或者Linux的分区。如果要将LILO安装成真正的Bootloader,(当然Linux安装过程已经帮我们做了这些事情)跟着以下步骤:
第一步,编辑lilo的配置文件
第二步,运行lilo命令。
LILO的stage 1和stage 2的两个部分通过lilo命令都被写入了MBR或者是分区的启动扇区之中。
Notes:
Lilo命令的作用是读取LILO的配置文件(一般是/etc/lilo.conf,可在命令行指定),然后更新MBR或者分区启动扇区的引导纪录,在引导纪录之中包含了诸如内核文件,initrd文件的在硬盘位置之类的寻址资料,所以每次配置文件有变化,或者内核文件和initrd文件的任何可能移动都要重新运行lilo更新MBR或者启动扇区内的LILO引导纪录。Lilo命令和/etc/lilo.conf文件只是安装LILO的辅助工具。其实在PC启动过程之中是完全无用甚至是不可见的。
配置文件的部分参数解释:
全局参数:
boot = /dev/hda # The boot device is /dev/had
指定LILO安装的设备,如果是硬盘/dev/had这样的没有数字在后面的,会写入硬盘的MBR,如果是分区后面带有数字比如/dev/hda1,则只会写入分区的启动扇区。
map = /boot/map # Save the map file as /boot/map
指定map文件的位置,预设是 /boot/map
install=boot-sector
使用指定文件作为新的boot sector.预设是/boot/boot.b.
password=password
启动时候进入交互模式的访问密码。并未加密。
default=name
设定预设的启动image,如果没有设定将会按顺序的第一个。
delay=tsecs
进入default image的等待时间。1/10秒为单位,30表示3秒。
message=message-file
指定message文件。最大 65,535 bytes.
prompt
显示boot:命令行模式。
linear
生成并使用liner sector addresses寻址。
Image选项:
image=pathname
指定Linux内核文件。
label=name
为image指定一个名称。如果没有指定就是文件名(不包括路径)
alias=name
还可以再指定一个别名。
loader=chain-loader
对于非Linux系统,可以指定下一个bootloader,预设是/boot/chain.b,这个预设的chain loader会交给other选项指定的设备,或者是第一个硬盘的活动分区的启动扇区。
password=password
image的密码。
other=devicename
非Linux系统,指定该系统的安装分区。
内核Kernel选项:
其中的append, read-only, read-write, root, 和vga 也可以作为全局参数配置。
append=string
会传送给内核的参数,比如BIOS无法识别大于64M内存时可以使用 append = "mem=128M"。
initrd=filename
指定initrd的ramdisk映像文件。
noinitrd
不使用ramdisk?
root=root-device
指定root分区。
vga=mode
VGA模式设定。
read-only
启动时以readonly方式mount根,这个只是启动第二阶段的根,不是最后我们所看到的根,一般都会使用read-only方式
read-write
启动时以read write方式mount根,这个只是启动第二阶段的根,不是最后我们所看到的根
LILO配置文件示例:
1、(摘自RHCE Red Hat Certified Engineer Linux Study Guide (Exam RH302), Fourth Edition):
prompt
timeout=50
default=linux
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
message=/boot/message
linear
image=/boot/vmlinuz-2.4.21-3
label=linux
initrd=/boot/initrd-2.4.21-3.img
read-only
append="hdc=ide-scsi root=LABEL=/"
other=/dev/hda1
label=Win98
table=/dev/hda
2、(摘自Linux in a Nutshell, 3rd Edition):
prompt
default=linux
boot=/dev/hda
install=/boot/boot.b
map=/boot/map
image=/boot/vmlinuz
label=linux
root=/dev/hda2
read-only ## Image section: For testing a new Linux kernel image=/testvmlinuz
label=testlinux
root=/dev/hda2
read-only
optional # Omit image if not available when map is
built ## Image section: For booting DOS
other=/dev/hda1
label=dos
loader=/boot/chain.b
table=/dev/hda # The current partition table ## Image section:
For booting Windows 95
other=/dev/hda1
label=win95
loader=/boot/chain.b
table=/dev/hda
LILO的交互模式:
有必要在这里介绍一下LILO的交互模式。可以进行配置(主要是内核参数)的调试。不过交互模式不会帮你修改配置文件,调试完成后需要自己更改配置文件并重新运行lilo更新MBR或者是相应的分区。
• 如果设定了prompt , LILO总会停留在等待画面,等待用户的输入。如果你选择按CTRL+X进入text的命令行模式,你可以再指定内核参数。
• 如果没有设定prompt,当出现 "LILO"的时候,按 Control, Shift,或者 Alt,就会到 boot:的text命令行模式。
• 在boot:之下,你可以使用tab来选择image,就是之前的label名称,也可以输入。而且可以在后面增加参数。例如:boot:linux single
以下参数可以在这时传送给内核:
debug
打印所有内核消息到console。
hd=cylinders,heads,sectors
指定硬盘参数。
load_ramdisk=n
指定多少个ram disk会传送给内核。
mem=size
指定内存参数。
noinitrd
如果设定后,不会进行the two-stage的启动,而且保留在/dev/initrd的内容,于是启动后还可见。
number
指定runlevel。
ro
Mount根为readonly。
rw
Mount根为read-write。如果没有制定ro或者rw,将会用rw方式。
single
启动单用户模式。对排错很有帮助。
GRUB
GRUB同样支持菜单和命令行两种方式来控制启动。
GRUB通过filesystem进行寻址并将内核读入内存。
GRUB启动过程:
1、 GRUB启动时会在/boot/grub/中寻找一个名字为menu.lst的配置文件
2、 如果找不到此文件则不进入菜单模式而直接进入命令行模式。
3、 找到文件后根据文件显示菜单
4、 用户选择后,根据配置文件制定的路径加载内核
5、 将控制交给Linux内核
安装到MBR或者分区:
GRUB的软件安装在这里就不做多讲了,这里讲讲如何重新安装GRUB到MBR或者某个分区。好比我一直使用LILO,现在我想换成GRUB了,需要做什么。
方法一:
$grub-install install_device
方法二:
$grub
grub>setup install_device
两种方法都可以有不同的选项。可以自行察看帮助文件。
GRUB的文件系统规范
GRUB支持FAT、FFS、minix、ext2 和 ReiserFS 分区。
GRUB之中的的一些约定与Linux的约定不尽相同,大家需要注意一下。所谓此root不是彼root,很容易搞混淆,所以我打算先说说这一点。hd还是hd的,这点没有区别,接下去就不同了。GRUB使用数字来区别硬盘,不象Linux的had-hdd的字母表示,所以在GRUB之中的对应分别是hd0-hd3,我们也可以看出在GRUB之中一切都是从0开始计数的。分区怎么表示呢,在GRUB完整的分区表示是这样的:(hd0,0)。最后一个位只是需要用Linux的分区规则减一就好了。重点是GRUB的所谓root,GRUB作为一个多系统的bootloader,并不关心启动之后的事情,所以对于GRUB的root通常就是Linux内核文件的放置位置,一般是/boot。当然如果/boot没有自己的分区,就是/了。定义了root之后在之后的配置之中所有的文件将会是相对于这个root的,比如内核是/boot/vmlinuz,而/boot又是一个独立的分区,那么在配置文件里我们应该使用kernel /vmlinuz而不是kernel /boot/vmlinuz。后者会让GRUB去寻找/boot/boot/vmlinuz的。
利用 chain loader 的方式:
Chain loader就是将控制权交给下一个bootloader。启动事也交给下一个bootloader,所以需要知道的只是下一个bootloader的分区和所在的磁盘位置,GRUB可以指定那个扇区。比如我们的windows安装在hda1,Linux安装在hda2,在MBR的GRUB的有关启动windows的设定如下:
title windows partition
root (hd0,0)
chainloader +1
这里root就是代表了windows所在的分区hda1,而chainloader的+1就是代表第一个扇区。
配置文件:(/boot/grub/grub.conf或者/boot/grub/menu.lst,后者是前者的链接)
全局选项
default=0
GRUB的计数都是从0开始的。
timeout=3
表示默认等待的时间,这儿是3秒钟。超过3秒,用户还没有作出选 择的话,系统将自动选择默认的操作系统。
root=device
指定GRUB的root,就是stage 2的所在分区。
splashimage=pathname
指定开机画面文件的位置
Title选项
类似LILO的image部分。
title description
为每个启动设定义一个说明
root=device
指定GRUB的root,就是stage 2的所在分区。
kernel=pathname
指定Linux内核文件。
initrd=pathname
指定initrd映像文件。
chainloader +1
指定下一个bootloader的位置。
内核Kernel选项:
同LILO,请参照LILO相应部分。
命令行的交互模式:
GRUB的命令行模式比LILO更加强大,一般用于调试配置。基本命令基本与上面一些配置选项相同:
1、grub>root (hd0,0) #设置GRUB的root
2、grub>kernel /vmlinuz root=LABEL=/
3、grub>initrd /initrd.img
4、boot
详细命令可以参照help。
GRUB配置文件示例:
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this # file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/hda1
# initrd /boot/initrd-version.img
#boot=/dev/hda
default=0
timeout=3
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
title Red Hat Linux (2.4.18-14)
root (hd0,0)
kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/
initrd /boot/initrd-2.4.18-14.img
title Microsoft Windows XP
map (hd0) (hd1)
map (hd1) (hd0)
root (hd1,0)
chainloader (hd1,0)+1
boot
总结
LILO不认识filesystem,所以将相关绝对寻址存入了MBR之中,每次变动都需要运行lilo来更新启动扇区或者MBR。
GRUB可以读取filesystem内(主要是/boot下)的文件,而不必存储内核在硬盘的绝对指针,取而代之的是路径相对路径。所以更改配置文件或者更新移动内核后无需重新安装MBR或者启动扇区部分代码。
编号1124 回复于:2005-11-05 14:11:20
不错,可以加精华了!
风流涕淌 回复于:2005-11-05 14:30:42
好像在哪里看过
sam's 回复于:2005-11-07 13:03:44
第二章:文件系统和RPM
我们知道在Linux之中一切皆文件,好像硬盘和分区的设备文件,各种串口并口以及USB在Linux之中都是一个文件。
根/
在Linux之中只表现单一的层次结构,所有的其他目录都是根/的子目录。
Mount和umount文件系统
硬盘要在Linux之中使用,必须要分区,然后格式化,我想这一点所有的操作系统应该都一致的。分区格式化之后就可以摆放我们自己或者系统软件的文件了。任何硬盘分区的文件系统只有mount接挂之后才可以被使用,而且是有一定先后顺序的,我们必须先mount接挂根/目录,才能接挂其它的文件系统到/的某个目录下,第一章之中我把它叫做接挂点(mount point)。所以不是因为同在/下就一定在同一分区下。如果某个目录被挂接成另外的文件系统,那么它以前的内容将不可访问,直到被接挂的文件系统被umount。除了硬盘分区之外,我们也可以mount网络文件系统,比如nfs,smb等,以及CDROM和软盘等等。
分区和文件系统类型:
我们知道windows使用的是FAT或者NTFS文件系统。而在Linux里则是ext2和ext3。我想大家知道磁盘的物理结构就是一些磁道,扇区之类了。文件系统的出现当然是为了更好的管理文件,文件系统的主要特征,我想是它的逻辑结构。FAT,NTFS或者ext2都是这样,不过大家的定义总是有一些不同,搞的大家很麻烦。以后不知哪个牛人可以创建一个让微软和其他unix厂商都信服的文件系统呢,一统江湖。
我大致说说ext2的逻辑结构:
Superblock 是分区的第一个Block,比如文件系统的大小,起始扇区地址,以及其他一些重要信息存放于此。如果损坏,整个分区将回天乏术了。
Block group 实际每个ext2分区后都会分成几个block group的,每个group之中都有自己的
superblock / group description / block bitmap / inode bitmap / inode table / data blocks
Group Description Block group的说明信息
Block bitmap 对应所有Block的使用状况
Inode bitmap 对应所有inode的使用状况
Inode table 类似于以前我们学的文件分配表,文件的各种属性将放于此,而具体内容将放于Block区。同时在inode之中也会有文件的地址信息,从而找到文件。
Block area sector扇区的2的n次方,是文件系统最小的读写单位。当然在合理范围内越大读写相对越快,不过对于小文件浪费空间。
要点:
1、 Superblock,block bitmap,inode bitmap就是metadata
2、 格式化ext2分区的时候决定了inode table和block area的大小,而且格式化之后再不可改变。一般为每4kb分配一个inode,每个inode的大小是128b,block size一般大小是1024/2048/4096等。
3、 Inode table的大小决定了能够存放文件的多少。
4、 Inode并不存放文件名称,文件名称和相应的inode信息存放于目录的block area之中。
做个总结,我们需要编辑/etc/passwd下的一个文件,Linux的基本操作应该大致是这样:
1、 根据/的block area信息找到对应的/etc目录的inode信息
2、 再用/etc的inode信息在inode table之中找到对应/etc项,找到对应的/etc的目录block area区域,找到/etc/passwd的inode信息
3、 再到inode table之中根据/etc/passwd的inode信息找到对应项,这样我们就找到了这个文件的block area地址了。
4、 根据地址读出文件
清楚了吧,其实文件系统的实现原理也基本一样,理解了FAT的文件分区表,也很好理解这个inode table的。
ext3只是ext2的加强,增加了日志功能(journaling)。当然写的时候会慢些,不过恢复的时候会快很多,而且增加了文件系统的稳定性。
Linux所支持的主要的文件系统:
• Linux的VFS (Virtual Filesystem Switch)
Linux的内核通过这个VFS来管理和读取其他文件系统的。这样的话,其他的应用并不需要知道各种文件系统的存取模式就可以读取不同文件系统之中的文件了,因为所有这些,VFS已经为我们做了。对于软件开发商来说这的确是一件大好事。
• 传统文件系统
ext2 / minix / MS-DOS / FAT / iso9660
• 日志型文件系统
ext3 / ReiserFS / NTFS / JFS / XFS
• 网络型文件系统
NFS / SMBFS
好了,接下来说一说分区和建立文件系统:
使用fdisk建立分区:
$fdisk –l #可以列出所有设备
$fdisk devicename #管理指定设备的分区,device是整个硬盘
进入fdisk之后我想大有DOS的fdisk使用经验的话,很容易掌握Linux下的fdisk的使用。改变分区之后,应该要重新启动,才可对新的分区进行操作。
使用mke2fs建立文件系统:
$mke2fs devicename #这里是分区
可以使用参数-b指定block size
可以使用参数-j创建ext3文件系统
等等…详细请察看man手册
Swap分区和swap文件
在windows95的时候我们就知道了有虚拟内存的概念,Linux世界也是一样,在Linux之中实现虚拟内存可以使用专门的分区,也可以使用swap文件来实现。
一般我们建立我们内存2倍大的swap。
swap分区:
1、 fdisk建立一个新的分区,并将其partition ID设为82。
2、 mkswap devicename 刚才的那个分区
3、 swapon devicename 来启动虚拟内存
swap文件:
1、 建立swap文件,比如dd if=/dev/zero of=/tmp/myswap bs=4k coung=16382会创建一个64k的文件/tmp/swap
2、 mkswap filename将文件变成swap格式
3、 swapon filename来启动这个文件的虚拟内存
LVM和RAID我打算以后找个篇幅专门说说,也有待我再研究。
如果希望可以建立一个可以扩充的文件系统,就必须要使用LVM的有关卷的概念,如果使用partition magic之类的工具调整分区大小,最多也不能超过该硬盘的大小。
ren76ren 回复于:2005-11-07 14:17:53
偶用安装盘装了个redhat 9,请问与用虚拟机安装的最大区别在哪?
如果用虚拟机安装的话除了用虚拟机软件以外,还需要什么东东,比如安装源文件之类的
sam's 回复于:2005-11-07 20:25:09
没什么区别,有cd就行了
sam's 回复于:2005-11-07 20:26:31
接下来说说文件系统之中的具体的文件。
在Linux之中有以下的文件类型:
使用ls -l命令可以知道文件的类型,在Linux之中有以下7中文件类型:
目录 d
普通文件 -
字符设备 c
块设备 b
本地套接口 s
有名管道 p
链接(类似windows的快捷方式) l
文件的属性资料(存储在inode之中的)我想在用户权限的时候再详细说明。
相对路径(relative)和绝对路径(absolute):
以根目录/开头的就是绝对路径,而以其他开头的路径就是相对路径,表示相对当前路径而言,相对路径变成绝对路径会加上pwd命令返回的当前路径。
目录树:
FHS (Filesystem Hierarchy Standard)是一个规范,很多Linux厂商已经开始遵照它了。不过FHS很笼统,只规定了两级目录的规范。其一是根目录/下的主要目录以及应该摆放什么文件,比如/etc应该摆放各种配置文件,而/bin和/sbin应该摆放可执行文件等,第二级则主要针对/usr和/var做出了更深层目录的定义。以下我大致说说每个目录在Linux之中的作用。
/
根目录/,一般建议根目录下只放目录,尽量不要将文件直接放于其中。/是首先加载的文件系统。
/boot
第一章已经提到了,放置内核以及bootloader的文件。主要用于启动。
/dev
设备文件全部在这个目录,硬盘,分区,键盘,鼠标,USB,tty等等。
/bin
最小的系统操作性所需要的执行文件。
/etc
配置文件的集中营。
/home
用户的家。
/lib
C库和C编译器。
/sbin
系统管理所需要的一些命令。包括引导,修复等命令,我想是system admin bin的意思。
/tmp
临时文件目录。每次重新启动就会被系统自动删除。
/usr
次要的文件和命令。由FHS定义的第二层目录,类似windows之中的program files。
• /usr/bin, /usr/sbin:user和系统管理员的大部分命令
• /usr/include:c/c++等程序的header
• /usr/lib:应用软件用到的库
• /usr/local:用户自行安装的软件
• /usr/share:共享文件的目录
• /usr/share/doc:应用软件的说明文件
• /usr/share/man:manpage
• /usr/src:Linux的源代码
• /usr/X11R6:X window的执行文件等
/var
由FHS定义的第二层目录。主要放些一些应用的专用数据和配置文件,比如named的/var/named就放了zone文件,当然一般log日志文件也是在这个目录。
• /var/cache:系统的缓存
• /var/lib:执行的运行库
• /var/log:日志
• /var/lock:锁
• /var/run:进程的pid
• /var/spool:队列的目录,包括邮件,打印和cron的schedule。
/mnt
/media
挂接点,比如CDROM通常在/mnt/cdrom
/opt
类似/usr/local,应用软件的安装点
/lost+found
系统不正常时候,无法在inode table找到的孤儿,就会放在这里,通常是fcsk命令产生,会在每个分区的最高层目录,比如/boot是单独分区的话,会有/boot/lost+found
/srv
一些服务用到的文件,比如www
/root
root的家
/proc
使虚目录,主要是内核等等信息,比如:/proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net 等。
不可单独分区的目录:
因为Linux启动时,一般只有/被挂接,所以启动所需的文件皆不可单独分区。比如/etc,/bin,/sbin,/dev,/lib等。
建议单独分区的目录:
/home, /usr, /var, /tmp,这些目录可能会因应需要不断扩展的,单独分区容易管理。
murdoc 回复于:2005-11-07 20:29:08
引用:原帖由 zhongzhiwen4321 于 2005-11-7 14:01 发表
垃圾笔记也发表出来
请不要无视别人的劳动
牙齿晒太阳 回复于:2005-11-07 20:50:30
够详细,又多了解了不少,支持~!!
bugkill 回复于:2005-11-07 20:51:50
呵呵:)尊重劳动成果是应该的
牙齿晒太阳 回复于:2005-11-07 20:51:56
有的时候整理笔记也是很好的提高方法
什么叫垃圾笔记???BS
ren76ren 回复于:2005-11-07 20:54:33
学习了 支持
bingosek 回复于:2005-11-07 20:55:16
挺详细的,这样学习linux会比较系统
llzqq 回复于:2005-11-08 07:14:36
新人把学习笔记放出来,不论写的好不好首先是值得肯定的。每个人都是这样过来的。
wind521 回复于:2005-11-08 09:10:23
鼓励一下
jaffas 回复于:2005-11-08 09:32:42
是呀!我就是新手,感觉写的挺好的!对我是有用的!
sam's 回复于:2005-11-08 13:51:44
RPM
RPM就是Redhat Package Manager的简称。也就是用套件的方式来管理应用程序。rpm包最大的特点是已经编译成二进制程序(所以我们下载的时候一定要认清楚不同硬件平台和不同发行版本的包,不同平台的包或者不同发行版本的包应该是不兼容的),我们无需再进行配置和编译,而且包含包的相关信息,比如包的相关性。而且安装完毕后会有安装资料纪录库,记录在/var/lib/rpm目录之中。不过我觉得rpm最大的烦恼就是包的相关性的问题。
命令简介:
常附加用参数:
--nodeps
强制安装,不检查包的相关性。当然不检查的话,风险是可能无法使用。
--nomd5
不检查rpm之中的MD5信息。
--noscripts
不执行rpm包治中的自动执行命令。因为rpm安装可以做一些初始化的工作,使用这个参数表示你不想系统作这些。
--replacefiles
当出现文件已经安装的信息时候,可以强制覆盖文件。覆盖后不可复原。
--replacepkgs
重新安装已经安装的rpm包。
--force
也就是--replacefiles 和 --replacepkgs 同时使用。
--test
测试套件是否可被安装,并不会真正安装
1、 安装
使用方法:
$rpm -ivh package_names
参数:
-i :install的意思
-v :察看详细安装画面
-h :进度表示
示例:
我们在第一章之中这样安装lilo包
$rpm –ivh /mnt/cdrom/RedHat/RPMS/lilo*
注意我们可以一次过安装多个包
2、 升级
使用方法:
$rpm -Uvh package_name
$rpm -Fvh package_name
参数:
-u :update的意思,如果已经安装则更新到新版本,如果没有安装就安装
-f :如果已经安装则更新到新版本,如果没有安装就不安装
-v :察看详细安装画面
-h :进度表示
示例:
我们更新lilo包
$rpm –Uvh /mnt/cdrom/RedHat/RPMS/lilo*
3、 查询
使用方法:
$rpm -q
参数:
-q :后面跟packagename,查询包是否已安装
-qa :列出所有已经安装的包
-qi :后面跟packagename,查询包的信息
-ql :后面跟packagename,查询包内的文件列表
-qc :后面跟packagename,查询包的配置文件名称,已经安装在/etc之内的
-qd :后面跟packagename,列出与man有关的文件名
-qR :后面跟packagename,列出相关性包 (Required 的意思)
-qf :后面跟任何文件名,可以查询文件属于哪个包
示例:
查询lilo包是否已经安装
$rpm –q lilo
查询系统安装的所有包
$rpm –qa
查询lilo包的信息
$rpm –qi lilo
查询lilo包的文件列表
$rpm –ql lilo
查询lilo包的配置文件列表
$rpm –ql lilo #lilo.conf并不包含于lilo包之内哦
查询lilo包的doc
$rpm –qd lilo
查询lilo包的相关文件
$rpm –qR lilo
查询/etc/passwd所属包
$rpm –qf /etc/passwd #passwd文件属于setup包
4、 反安装
使用方法:
$rpm –e packagename
参数:
-e:解除安装
示例:
反安装lilo
$rpm –e lilo
5、 验证
使用方法:
$rpm -V
参数:
-V :后跟packagename,改变过的包会被列出来
-Va :列出所有改变的文件,包括所有包
-Vp :后跟packagename,改变过的文件会被列出来
-Vf :后跟文件名,如果改变过会被列出来
显示结果说明:
S :file Size differs
M :Mode differs (includes permissions and file type)
5 :MD5 sum differs
D :Device major/minor number mis-match
L :readLink(2) path mis-match
U :User ownership differs
G :Group ownership differs
T :mTime differs
rpm包内的文件类型:
c :config file
d :documentation
g :ghost file
l :license file
r :read me
示例:
检查lilo之中的文件是否变化过
$rpm –V lilo
列出所有发生过变化的包
$rpm –Va
列出lilo之中的变化过的文件
$rpm –Vp lilo
列出/etc/passed是否改变过
$rpm –Vf /etc/passwd
techwolf 回复于:2005-11-08 13:56:20
建议建立一个维基。你这样简单的写下来,以后发现前面的内容有错误怎么办?别人看了,想帮你充实内容呢?
sam's 回复于:2005-11-08 19:48:56
没有建过,请指点
liuzhuan23 回复于:2005-11-08 20:36:04
呵呵,好贴,关键是有自己的思路,比较清晰,建议加精华,呵呵
sam's 回复于:2005-11-09 09:36:15
下周打算学学基本的系统管理和用户管理,以下是我的大纲,
系统管理篇:
一、 再谈Boot Process
二、 再谈Filesystem
三、 Raid和LVM
四、 基本的网络配置
五、 虚拟控制台tty
六、 其他基本配置
七、 什么是shell
八、 常用的命令
用户管理篇:
一、 如何增加新用户
二、 用户管理基本知识
三、 用户环境的设置
四、 文件的权限与用户
五、 其他安全篇
sam's 回复于:2005-11-10 13:15:37
第三章:基本的系统管理和用户管理
学习Linux并不是只为了能够使用Linux,而是要能够管理它,甚至控制它,前面的两章基本都是些Linux的周边知识,这一章我们进入了怎么使用和管理Linux的篇章。
系统管理篇:
一、 再谈Boot Process
从第一章可以知道大致的启动过程,这里只提及的Linux部分,而不管bootloader部分。
1、bootloader加载内核
内核是个压缩文件,程序包含一个解压程序,内核取得控制后会自行解压。
2、建立initrd虚拟磁盘并加载各种驱动程序
如果支持虚拟磁盘的内核,会根据所传递的initrd的参数建立虚拟磁盘,initrd之中包括很多可以动态加载的驱动。我们前面说过,内核会执行/initrd/linuxrc程序来进行驱动加载。
3、内核加载完毕后,执行init程序
内核加载完毕之后,/也已经被mount了。接下来init是系统第一个被执行的程序,所以它的进程号pid始终会是1,所有的其他程序进程都是由init负责产生的,所以我们说init是所有进程的“鼻祖”了。init执行后会读取/etc/inittab文件,一般这时候都只有/被挂接了,如果/etc有自己的独立的文件系统或者是分区,我想大家都知道会发生什么事了。
Linux的run-level:
0:halt 关机
1:single user mode 单用户模式
2:multi-user without Network 不支持网络的多用户模式
3:full multi-user mode 完整的多用户模式
4:unused 保留
5:X x window模式
6:reboot 重新启动
/etc/inittab之中定义了开机之后的run-level以及其他有关启动的设定,在inittab之中有一个基本的语法:
[id]:[run-levels]:[action]:[process]
[id]是一个代号,最好不要超过4个字符,超过了大部分版本的解释器不支持。
[run-levles]是运行的级别,可以指定多个级别,比如2345表示在2,3,4,5级别都执行。
[action]init的行动,有以下几种:
respawn:
表示process如果terminate结束后会被重新启动,好比mingetty,用户logout之后会重新启动一个mingetty等待用户login。
wait:
这种process只会启动一次,并且init会等待process结束。
once:
这种process只会启动一次,init不会等待process结束。
boot:
启动时运行,run-levels会被忽略
bootwait:
同boot,而且init会等待process的结束,好像/etc/rc
off:
什么也不做
ondemand:
特定的run-level执行,可能是a,b,c之类。(没有试过,不知道怎么用。)
initdefault:
启动后要进入的run-level
sysinit:
启动时运行,会在boot和bootwait的process之前运行,忽略run-levels
powerwait
电源错误时候,init会等待这个process结束
powerfail
电源错误时候运行
powerokwait
电源恢复时候运行,init会等待这个process结束
powerfailnow
电源(UPS)即将没电时执行
ctrlaltdel:
顾名思义,CTRL+ALT+DEL的处理
kbrequest:
指定的键盘热键的处理,可以在自己的keymaps之中指定热键,指定后要loadkeys一下。
[process]
要执行的程序包括脚本,如果以+开始,表示init不会为process做utmp和wtmp的工作。
以下是我电脑之中的/etc/inittab:
#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
# 这里使用initdefault指定系统启动后进入的run-level
id:5:initdefault:
# 这里使用sysinit来指定系统初始化的脚本,可以指定为其他脚本
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
# 每个run-level自己的初始化脚本
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
# 处理 CTRL-ALT-DELETE
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# 处理powerfail事件
# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
# 处理powerokwait事件
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
# 定义虚拟控制台tty,2-5都有6个text的控制台,用的是respawn,每次logout后init又会
# 产生一个新的mingetty进程
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
# 如果run-level = 5,定义x window控制器
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
sam's 回复于:2005-11-11 09:40:10
4、init执行/etc/rc.d/rc.sysinit
在/etc/inittab之中sysinit定义的初始化脚本,可以使用不同的名称,主要做系统的初始化,大家可以打开看看自己的/etc/rc.d/rc.sysinit都作了些什么。主要有:
1〉 设置网络配置参数
读取/etc/sysconfig/network,并据此设置环境变量
在我的/etc/ sysconfig/network很简单,就是下面两个:
$cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=test
2〉 接挂/proc
Init接着会接挂/proc,我们前面说过/proc是虚拟的文件系统,是我们访问内核
的一种途径。接着还会检查usb硬件,动态配置usb,挂接在/proc/usb/bus关于
usb,其实我们可以通过访问/dev下的设备文件直接访问,在/proc之中挂接的
最大好处是可以支持usb的动态配置,好像热插拔之类。
3〉 检查SELinux状态
设置SELinux,安全加强型的Linux。
4〉 提示输入I可以进入交互启动状态
这时候,会在控制台打印一句话,提示输入I可以进入交互模式启动。不过,好像选择了I,也不是马上反应的,屏幕上刷刷的还是一串串字符。
5〉 设定控制台
根据控制台的参数设置来设定控制台,好像字体之类。
6〉 初始化硬件,加载驱动
…
7〉 内核配置
会根据sysctl调整内核参数。
8〉 设定clock
设置clock
9〉 fsck和remount /
这时候会fsck检查/目录,如果没有错误的话,init会把readonly的/重新moount成为read
write模式。
10〉 umount虚拟内存磁盘/initrd
11〉 Quota
需要内核的支持,如果内核支持的话,这时候根据配置会设定quota
12〉 设定RAID和LVM
如果有raid和lvm这时候会设定这两样
13〉 清除/tmp
init会每次启动都将/tmp内的文件清空,所以不要把重要文件放在这个目录。
14〉 启动swap分区或者文件
15〉 将信息写入/vat/log/dmesg
最后会把屏幕上的信息写入dmesg,可以使用dmesg命令访问或者直接打开文件看。
6、init然后根据run-level执行/etc/rc.d的脚本
这是些wait的process,init会等待进程结束后才会继续其他。大部分的服务会在这个时候启动。系统支持的服务的脚本会在/etc/rc.d/init.d,这种脚本一般都支持三种参数,start,stop和restart。其他的在/etc/rc.d/rcX.d内的脚本基本都是会调用/etc/rc.d/init.d内的脚本来启动或者停止服务。另外使用chkconfig也可以配置服务。chkconfig –list可以列出这些服务和预设的启动状态。
7、init执行/etc/rc.d/rc.local脚本
init还会执行/etc/rc.d/rc.local脚本,好像dos的autoexec.bat文件。可以自己加入些命令,不过这是系统级的动作,对于整个Linux系统起作用,记住我们的Linux可是真正的多用户操作系统。如果想要用户级的初始化,请参照用户设定篇。
8、init初始化控制台,等待用户登陆
Init最后会启动mingetty的虚拟控制台,当然也可以配置其他的控制台。如果用户输入了用户名之后,mingetty就会把用户名传递给login程序,当然login会提示用户输入密码之类了,密码正确了,就会进入shell。
bloodworld 回复于:2005-11-11 10:03:40
支持,看来我也应该写一个学习笔记才行。
sam's 回复于:2005-11-11 14:20:44
二. 单用户模式
run-level如果等于1的话,就会进入单用户模式了。一般进入单用户模式不用输入密码,所以,如果忘记root密码的话,我们可以进入单用户模式,然后用passwd来更改。
单用户模式没有网络,那些在chkconfig之中看到的服务也没有启动,进入/etc/rc.d/rc1.d,用ls命令看看里面有些什么文件:
[attach]a01[/attach]
我们会发现里面只有两个S开头的文件,其他全部是K开头的文件。S是代表start,而K代表kill。
在Bootloader之中我们有讲到传递给内核的参数有single,会进入单用户模式,那么那种单用户模式与run-level=1的单用户模式有没有什么不同么?
另外我们好可以在bootloader传递init=/bin/bash给内核,与单用户模式又有什么不同呢。
第二个问题,还好理解,就是让内核把bash当成init来启动所以init所作的事情是一件也不会做的,内核加载完毕后就会将控制交给shell了。启动信息简短了很多:
[attach]a02[/attach]
这时候所加载的/应该还只是内核所加载的/,一般我们是以readonly加载的(还记得第一章的那些参数吧),所以在这种环境下的所有文件也是readonly的。当然如果我们想更改文件内容的话,是可以remount根目录/。
先看看这时候系统都mount了些什么:
$mount
/dev/mapper/VolGroup00 on / type ext3 (rw)
None on /proc type proc (rw)
我不太明白结果第一行的(rw)是不是read write的含义,不过这时候的/的确是readonly的。
重新mount根目录/成read write:
$mount –o remount rw /
一切OK,这时候我们可以编辑我们所需要的文件了。不过记住init和shell的功能是大不相同的,这只是一个很不完整的Linux环境,很多东西都不能玩。
那么bootloader的参数single与run-level=1呢,我们假设/etc/inittab因为种种原因,就丢失了,重新启动后,init得到控制后找不到/etc/inittab,于是要求输入runlevel,可以无论你输入什么1-5,都会死机的,因为init根本不知道要做什么。
[attach]a03[/attach]
怎么办呢?
试试传递参数single给内核的方法(不会忘了吧),我们会发现虽然init找不到/etc/inittab,但是却把控制交到了shell的手上。
[attach]a04[/attach]
真的是很有趣。
[ 本帖最后由 sam's 于 2005-11-11 14:27 编辑 ]
sam's 回复于:2005-11-11 20:44:38
三、 run-level的切换
我们知道了Linux下的各个run-level,我们也知道可以通过设定/etc/inittab的initdefault来设置机器每次启动进入的run-level。其实Linux可以直接从一个run-level到另外一个run-level而不用重新启动。这就是命令telinit了:
$telinit run-level
我们前面提到了/etc/rc.d/init.d,我们知道所有的启动初始化脚本其实都放在这个位置,而其他的每个run-level目录底下/etc/rc.d/rcX.d的S和K文件都是/etc/rc.d/init.d的链接,下面这张图是我的电脑上的/etc/rc.d/rc3.d的ls –l 的结果:
机器启动的时候,init运行run-lelve=0的S教本,再运行initdefault设置的run-level的S开头相关脚本,同样相反,系统关机的时候,会执行相关K开头的脚本。
init处理从低到高run-level时,比较两个run-level的S和K文件不同之处,按照数字递增的运行在低run-level不存在的以S开头的脚本,按照数字递减的运行在高run-level不存在的以K开头的脚本。
而处理从高到低的时候,比较两个run-level的S和K文件不同之处,按照数字递减的运行在低run-level不存在的以K开头的脚本,按照数字递增的运行在高run-level不存在的以S开头的脚本。
不会关闭两个run-level都存在的服务。
使用runlevel命令可以知道现在的run-level。
[ 本帖最后由 sam's 于 2005-11-11 21:24 编辑 ]
unregister 回复于:2005-11-12 04:57:06
谢谢了,读了这些帖子让我这个新手受益非浅。
bensooon 回复于:2005-11-12 18:52:05
好,希望可以坚持
顶
zhx551655 回复于:2005-11-13 07:49:27
谢谢~~~
lijietz 回复于:2005-11-13 22:28:46
up
uisoft 回复于:2005-11-13 22:53:08
为什么我不能下附件 愤怒
sam's 回复于:2005-11-14 20:02:37
四、 Rescue模式
接下来我想说说rescue模式,很多时候对于我们这些新手出了问题的时候,紧急盘也许是唯一的解救方法。可以使用安装盘的第一张作为rescue盘,也可以制作软盘的应急盘,这里主要介绍安装盘第一张作为rescue盘。
假设我们系统的/etc/fstab不见了,无法进入系统,现在我们尝试使用rescue的方法解决这个问题:
首先mv /etc/fstab /etc/fstab.bak 再重新启动。这下无法进入linux了。
[attach]01.gif[/attach]
当然我们可以输入root密码进入shell进行修改,不过我们这里会用rescue的方式来进行修复。
1. 使用安装盘1进入安装界面,在画面之中输入 linux rescue 然后回车
[attach]02.gif[/attach]
可以使用linux rescue askmethod进行网络的安装,安装源会在/mnt/source。
[attach]03.gif[/attach]
2. 然后选择语言和键盘格式
[attach]04.gif[/attach]
[attach]05.gif[/attach]
3. 选择是否需要配置网络
一般在rescue模式都不需要网络,除非需要从网络安装rpm包。
选择完键盘之类会有画面选择rescue方式:
[attach]06.gif[/attach]
4. 选择是否然让系统查找硬盘上的linux 系统
[attach]07.gif[/attach]
可以选择继续,系统将会尝试寻找linux然后将它们挂接到/mnt/sysimage,如果选择read-only,系统做同样事情,然后挂接成readonly。Skip会略过这步,系统不会尝试挂接任何文件系统。
5. 硬盘上的文件系统并没有被找到
好像rescue并不识别lvm,所以并没有找到我的文件系统,rhel4缺省使用了lvm进行安装/。
[attach]08.gif[/attach]
[attach]09.gif[/attach]
6. 如果找到的话,我们知道会北挂接在/mnt/sysimage下,现在没有找到/,怎么办?我们进入到了一个shell。
详细的lvm将会在后面详细介绍,这里用简单方法找出文件系统,然后moun它:
$lvm
lvm>pvdisplay
lvm>vgdisplay
lvm>lvdisplay
[attach]10.gif[/attach]
可以看到我的两个logical volume:
/dev/VolGroup00/LogVol00和/dev/VolGroup00/LogVol01,根据它的大小我们也可以一眼就知道/dev/VolGroup00/LogVol00是我们的/。我们可以在lvm环境看到我们的lvm,是不是可以马上就mount为/mnt/sysimage呢?我尝试mount它:
$mkdir /mnt/sysimage
$mount -t ext3 /dev/VolGroup00/LogVol00 /mnt/sysimage
[attach]11.gif[/attach]
怎么提示没有文件或目录呢,/mnt/sysimage是已经创建了的啊。其实是设备文件不存在,rescue环境只是一个很简单的linux环境,并不会把我们以前创建的设备文件拷贝过来,我的/都没有mount,甚至都找到。
怎么办,看看/dev吧,看看都有些什么咚咚:
$ls /dev
[attach]12.gif[/attach]
的确是没有lvm的设备文件,甚至连cdrom都没有,我的cdrom是ide-0的,找不到hda啊。没办法了,只能是想办法创建我们需要的设备文件了,才能完成我们的mount啊。不是有MAKEDEV,makenod么,找找吧:
$whereis MAKEDEV
[attach]13.gif[/attach]
没有啊,经过一轮查找我发现(可以看看rescue的PATH变量),rescue环境的大部分命令都存在于/usr/bin下,里面有一个makedevs命令。
[attach]14.gif[/attach]
真的可以,于是我尝试创建了hda:
$makedevs /dev/hda b 3 0 0 0 s
$mkdir /mnt/cdrom
$mount –t iso9660 /dev/hda /mnt/cdrom
真的成功了哦。那剩下来要做的是要创建lvm的设备文件,我想大家翻看详细的资料应该可以知道要创建些什么设备文件,我找到了一个简单的办法:
启动时在rc.sysinit不是会启动lvm的支持么:
我找到了这么几句:
if /sbin/lvm.static vgscan --mknodes --ignorelockingfailure > /dev/null 2>&1 ; then
action $”…..” /sbin/lvm.static vgchange –a y --ignorelockingfailure
fi
[attach]15.gif[/attach]
于是我试了一下:
$lvm
lvm>vgscan --mknodes --ignorelockingfailure
lvm>vgchange -ay --ignorelockingfailure
lvm>quit
$ls /dev
真的为我们创建了lvm的设备文件。
接下来就很简单了
$mkdir
$mount –t ext3 /dev/mapper/VolGroup00-LogVol00 /mnt/sysimage
[attach]16.gif[/attach]
把/etc/fstab.bak拷贝回/etc/fstab,问题解决。
如果是rescue环境下找不到的其他分区,可以以下方式处理:
$fdisk –l #查找已有的分区
$mkdir pathname #创建你想挂接到的目录
$mount –t ext3 /dev/hdaX pathname #挂接文件系统,如果设备文件不存在,按上面的方式可以创建设备文件
6. 如果是rescue找到的文件系统,将会挂接在/mnt/sysimage下。
7. 可以直接进入/mnt/sysimage或者chroot更改出错的配置文件,如果必须重新安装rpm包的话,要chroot到我们的/,否则软件都安装到rescue的环境了,可以按照之前的方法挂接cdrom,然后重新安装,我在第二章有列出基本的rpm命令,可以参考。
8. 完成之后,可以使用exit退出chroot,再exit就退出rescue环境了,就会重新启动。
重点:
1. 如果是文件系统问题,可以直接使用fsck
2. 可以用mount来mount有配置问题或者其他问题的文件系统
3. 可以用chroot切换/到指定的文件系统。(这样可以使用指定文件系统的命令)
基本上rescue的linux更加象是一个单用户或者传递了init=/bin/bash的linux,然后我们可以mount目录,也可以chroot来修复系统,所以等同使用一个软盘版的linux进入shell之后。
[ 本帖最后由 sam's 于 2005-11-14 20:19 编辑 ]
|