然后使用如下的命令:
rpm -qf --root /mnt/sysimage /etc/inittab
查出该文件属于哪个RPM包!
然后重新安装这个rpm包!
rpm -ivh --force --root /mnt/sysimage /mnt/source/Redhat/RPMS/packagename
sync
sync
sync
exit
###请转贴时保留以下内容######
Red Hat Linux Troubleshooting 系统启动部分概要
请提出宝贵意见Mail:kissingwolf@hotmail.com
KevinZ(kissingwolf)
2004.4.15
#############################
#######################
# #
####################### #
# # #
# 当电源被按下 # #
# ##
#######################
当电源Power按下后,计算机开始自检看什么CPU、内存、显卡的是否都安上了!如果这里过不去就不用我说了吧!该换什么就换什么,插插拔拔的工作要仔细!现在的主板什么排错灯、语音提示的不一而足,想当年我们那望闻问切的功夫都不用了,很怀念那小喇叭的嘟嘟声!
#######################
# #
####################### #
# # #
# 当开始BIOS自检 # #
# ##
#######################
对我们系统管理员来说BIOS就作了两件事,一是按照CMOS里的方案配置和驱动底层设备,二是把控制权交给驱动设备(软驱、硬盘、光驱等)
这里要注意的就是确认CMOS里的方案是否配置正确,驱动设备是否连接正常、是否是我们需要的启动设备!
#######################
# #
####################### #
# # #
# 当从硬盘开始启动 # #
# ##
#######################
分区是一门学问,分的不好会事倍工半,具体的我已经在前面的文中提到了,有兴趣的可以参看《Linux的分区机构》 http://www.linuxsir.org/bbs/showthre...threadid=82245
MBR就是446个字节的一段存储空间,里面存储的是Bootloader,Linux的Bootloader常见的有LILO和Grub,两者在MBR中存储的内容是不同的!
LILO:引导程序和kernel和initrd文件的具体Block位置指针
Grub:引导程序、Grub Shell和grub.conf(menu.list)所在分区的设备名
这里要注意的是如果分区表(DPT)损坏,除非你有分区表备份(当然我们是有的:-),否则第一次fdisk的时候记得把个分区的起始和结束位置记下来以备救命之用!如果是MBR损坏,最简单的办法是rescue 进入系统然后chroot 到硬盘/ 然后grub-install /dev/XXXY 。如果要删除linux的MBR信息,用Windows 98的启动盘进入DOS提示符,fdisk /mbr 把MBR换成Windows的就可以了!
#######################
# #
####################### #
# # #
# 当Bootloader装入 # #
# ##
#######################
基本上“大坏羊”都已经提到了,这里只作相应的补充。
首先,上面提到了LILO和Grub在装入MBR的区别,因为装入内容的不同所以出现问题的情况和性质就有所不同。
LILO:因为存放的是kernel文件的具体Block位置指针,所以vmlinuz-*和initrd-*文件是不可以mv来mv去的(当然除非可以保证Block位置不变的改名不在此范围!)
Grub:和LILO不同他要的是文件内容,只要你不改变分区顺序,并且保证grub.conf(menu.list)文件路径正确就完全可以找到!只是要注意grub.conf(menu.list)的内容按实际情况编写!
其次,“大坏羊”在“(三)综述”中是有问题的!归结如下:
1.LILO 的lilo.conf(默认在/etc目录下,如果在其它位置需要lilo -f /dir/file 的方式指明)
image=/boot/vmlinuz-2.4.21-4.EL #kernel所在目录树位置
label=linux #标签,boot:时你要输入的
root=/dev/sdc1 #根分区所在位置
initrd=/boot/initrd-2.4.21-4.EL.img #initrd所在目录树位置
他使用的是当前系统的目录树结构,也就是kernel和initrd的逻辑位置,当我们运行lilo -v的时候,LILO会根据lilo.conf文件的定义在MBR中记下kernel和initrd文件的具体Block位置指针,然后 lilo.conf文件就没用了,删除了也不要紧!当然MBR中还要有/分区的位置指针,解压挂接initrd的ext2文件系统和读取 /etc/inittab和/etc/rc.d/rc.sysinit 就靠它了!
2.Grub 的 grub.conf(默认也必须在/boot/grub目录下,除非你自己该grub的源码)
title linux #标签
root (hd0,1) #/boot分区所在位置
kernel /vmlinuz-2.4.21-4.EL ro root=LABEL=/ #读取kernel,挂接/分区
initrd /initrd-2.4.21-4.EL.img #读取initrd,解压挂接initrd的ext2文件系统
他使用的是自定义系统的目录树结构,换种写法就更清楚了(可以引导的最少语句)
kernel (hd0,1)/vmlinuz-2.4.21-4.EL ro root=LABEL=/
initrd (hd0,1)/initrd-2.4.21-4.EL.img
可以看出kernel 和 initrd 可以不在同一分区上,vmlinuz-*文件和initrd-*文件的目录位置是根据分区(hdX,Y)中的目录位置而定的!如果/boot没有单独分区,在分区上看到的就是/boot/vmlinuz-* ,但如果/boot单独分区,在分区上看到的就是/vmlinuz-*.
关于那句ro root=LABEL=/ ,用来解压挂接initrd的ext2文件系统和读取/etc/inittab和/etc/rc.d/rc.sysinit,可以使用卷标(LABEL)或是设备名。
3.Grub的grub.conf文件是必须要有的,否则启动的时候看到的就是grub:的grub shell状态。
#######################
# #
####################### #
# # #
# 当kernel被装入 # #
# ##
#######################
当kernel被装入的时候一般是没有问题的,但如果你的grub.conf中使用了错误的kernel名或LILO中的kernel位置不对,或是分区挂接就有问题那么kernel这里就会有问题!当然也可能是你的kernel本身有问题例如忘记把ext2文件系统的module编译入initrd中!
#######################
# #
####################### #
# # #
# 当读取/etc/inittab # #
# 时 ##
#######################
/etc/inittab是linux系统启动时读到的第一个文件,负责确定启动的level、执行启动脚本rc.sysinit和运行进程之父init.
其中问题多多,具体的来听我的课!;-)
###############################
# #
############################### #
# # #
# 当运行/etc/rc.d/rc.sysinit # #
# 时 ##
###############################
/etc/rc.d/rc.sysinit是linux系统启动的时运行的第一个脚本,负责产生系统运行中需要的环境变量和文件系统。其中mount -a 就是挂接所有在/etc/fstab中表明的文件系统!
#######################
# #
####################### #
# # #
# 当读取/etc/fstab # #
# 时 ##
#######################
/etc/fstab 由/etc/rc.d/rc.sysinit脚本中的mount -a调用,出错的机率最大。
#######################
# #
####################### #
# # #
# 当运行/etc/rc.d/rc # #
# 时 ##
#######################
/etc/inittab 中只确定默认运行的level,去运行level中脚本的其实是/etc/rc.d/rc ,/etc/inittab中的level数字只是/etc/rc.d/rc的参数
########################
# #
######################## #
# # #
# 当运行/etc/init.d/* # #
# 时 ##
########################
/etc/rc.d/rcX.d 目录下的都是连接,除了S99local,其他的都是/etc/init.d/*的软连接(符号连接)。
#############################
# #
############################# #
# # #
# 当运行/etc/rc.d/rc.local # #
# 时 ##
#############################
/etc/rc.d/rc.local 是系统启动时最后要运行的脚本,如果的了解Autoexec.bat在DOS中的作用那么就不难理解它了。
#############################
# #
############################# #
# # #
# 启动结束看到login:提示符 # #
# ##
#############################
今天就到这里,有时间我会向后继续写到用户登陆、系统调优、本地网络和服务排除!
感谢我的小胖妞Mandy,5月份我们会一到飞往乌鲁木齐去领略那美丽的西部风光!
GRUB学习笔记
声明:本笔记并非原创,只是我个人的学习笔记!
很多的内容来自www.linuxsir.com www.linuxfans.org www.linuxAID.com
非常感谢以上网站对我的学习提供的莫大的帮助,本着学习和分享的原则我贴出我的学习笔记,更希望兄弟们能给我指出其中错误的地方.谢谢!!!
学习这部分知识,首先要学到问题的思路,其次你还要记住一些东西,是死记硬背下来!你会发现这点东东的确是很有用的!
尽管如此,本文档归属linuxsir-probing!转载请注明出处!更不能被用到商业用途上!
1 首先要了解的几个概念
1.1 启动管理器
启动管理器是存储在磁盘开始扇区中的一段程序,例如,硬盘的MBR(Master Boot Record),在系统完成启动测试后,如果系统是从MBR启动,则BIOS(Basic Input/Output System)将控制传送给MBR。然后存储在MBR中的这段程序将运行。这段程序被称为启动管理器。它的任务就是将控制传送给操作系统,完成启动过程》有许多可用的启动管理器,包括GNU GRUB (Grand Unified Boot Loader),Bootmanager, LILO (LInux LOader), NTLDR (boot loader for Windows NT systems),等等等.
1.2 什么是GRUB?
grub 是一个多重启动管理器。grub是GRand Unified Bootloader的缩写,它可以在多个操作系统共存时选择引导哪个系统。它可以引导的操作系统包括:
Linux,FreeBSD,Solaris,NetBSD,BeOSi,OS/2,Windows95/98,Windows NT,Windows2000,WinXP。它可以载入操作系统的内核和初始化操作系统(如Linux,FreeBSD),或者把引导权交给操作系统(如 Windows 98)来完成引导。
1.3 GRUB的特点
特别适用于linux与其它操作系统共存情况。
支持大硬盘现在大多数Linux发行版本的lilo都有同样的一个问题:根分区(/boot分区)不能分在超过1024柱面的地方,一般是在8.4G左右的地方,否则lilo不能安装,或者安装后不能正确引导系统。而grub就不会出现这种情况,只要安装时你的大硬盘是在LBA模式下,grub就可以引导根分区在 8G以外的操作系统。
支持开机画面 grub支持在引导开机的同时显示一个开机画面。对于玩家来说,这样可以制作自己的个性化开机画面;对于PC厂商,这样可以在开机时显示电脑的一些信息和厂商的标志等。grub支持640x480,800x600,1024x768各种模式的开机画面,而且可以自动侦测选择最佳模式,与Windows那 320x400的开机画面不可同日而语。
两种执行模式 grub不但可以通过配置文件进行例行的引导,还可以在选择引导前动态改变引导时的参数,还可以动态加载各种设备。例如你在Linux下编译了一个新的核心,但不能确定它能不能工作,你就可以在引导时动态改变grub的参数,尝试装载这个新的核心进行使用。Grub的命令行有非常强大的功能,而且支持如 bash或doskey一样的历史功能,你可以用上下键来寻找以前的命令。
菜单式选择 grub使用一个菜单来选择不同的系统进行引导。你还可以自己配置各种参数,如延迟时间,默认操作系统等。
分区大小改变后不必重新配置 grub是通过文件系统直接把核心读取到内存,因此只要操作系统核心的路径没有改变,grub就可以引导系统。
除此之外,Grub还有许多非常强大的功能。例如支持多种外部设备,动态装载操作系统内核,甚至可以通过网络装载操作系统核心。Grub支持多种文件系统,支持多种可执行文件格式,支持自动解压,可以引导不支持多重引导的操作系统,支持网络启动等。
1.4 MBR和第一扇区
你可以简单的理解为MBR是整个硬盘的物理第一位置,而第一扇区是硬盘的物理第二位置.
1.5 一个GRUB配置文件
基于本例的分区如下:
hda 15G
hda1 8G / RED HAT LINUX8.0
hda5 7G /home
hdc 20G
hdc1 6.4G WinXP
hdc5 6.4G
hdc6 6.4G
hdc7 6.4G
#fdisk -l
# Disk /dev/hdc: 255 heads, 63 sectors, 2434 cylinders
Units = cylinders of 16065 * 512 bytes
Device Boot Start End Blocks Id System
/dev/hdc1 * 1 894 7181023+ b Win95 FAT32
/dev/hdc2 895 2434 12370050 f Win95 Ext'd (LBA)
/dev/hdc5 895 1787 7172991 b Win95 FAT32
/dev/hdc6 1788 2434 5196996 b Win95 FAT32
Disk /dev/hda: 255 heads, 63 sectors, 1867 cylinders
Units = cylinders of 16065 * 512 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 1020 8193118+ 83 Linux
/dev/hda2 1021 1802 6281415 83 Linux
/dev/hda3 1803 1867 522112+ 82 Linux swap
grub.conf,这个文件位于;/boot/grub/grub.conf
# 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
makeactive
boot
2 解读grub.conf文件
我们将来看看grub.conf文件内语句,(注:...)内的东西是我们的解读内容.
# 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 (注:默认的操作系统就是由default控制的。default后加一个数字n,表明是第 n+1个。需要注意的是,GRUB中,计数是从0开始的,第一个硬盘是hd0,第一 个软驱是fd0,等等。所以,default 0 表示默认的操作系统在这儿是 Red Hat Linux (2.4.18-14)如果你修改成1就是WinXP了)
timeout=3 (注:timeout表示默认等待的时间,这儿是3秒钟。超过3秒,用户还没有作出选 择的话,系统将自动选择默认的操作系统;当然你可以改成任何你乐意的时间)
splashimage=(hd0,0)/boot/grub/splash.xpm.gz (注:指定开机画面文件splash.xpm.gz的位置)
title Red Hat Linux (2.4.18-14) (注:表示Red Hat Linux的菜单项)
root (hd0,0) (注:表示第一个硬盘第一个分区,这里的root和系 统内的root不是一码事!详细如下说明)
kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/ (注:指定内核的位置,详细说明如下 文)
initrd /boot/initrd-2.4.18-14.img (注:初始化)
title Microsoft Windows XP (注:表示Microsoft Windows XP的菜单项)
map (hd0) (hd1) (注:map是命令,详细如下)
map (hd1) (hd0)
root (hd1,0) (注:这是指第二个硬盘(从硬盘)上第一个分区)
chainloader (hd1,0)+1 (注:链式装入器,装入一个扇区的数据然后把引导 权交给它。详细说明如下)
makeactive
boot
(注:在 Linux 中,当谈到 "root" 文件系统时,通常是指主 Linux 分区。但是,GRUB 有它自己的 root 分区定义。GRUB 的 root 分区是保存 Linux 内核的分区。这可能是您的正式 root 文件系统,也可能不是。我们讨论的是 GRUB,需要指定 GRUB 的 root 分区。进入 root 分区时,GRUB 将把这个分区安装成只读型,这样就可以从该分区中装入 Linux 内核。GRUB 的一个很“酷”的功能是它可以读取本机的 FAT、FFS、minix、ext2 和 ReiserFS 分区.到目前为止,您可能会感到一点疑惑,因为 GRUB 所使用的硬盘/分区命名约定与 Linux 使用的命名约定不同。在Linux 中,第一个硬盘的第五个分区称作 "hda5"。而 GRUB 把这个分区称作 "(hd0,4)"。GRUB 对硬盘和分区的编号都是从 0 开始计算。另外,硬盘和分区都用逗号分隔,整个表达式用括号括起。现在,可以发现如果要引导 Linux 硬盘 hda5,应输入 "root (hd0,4)"。
知道了内核在哪儿,还要具体指出哪个文件是内核文件,这就是kernel的工作。
kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/说明/boot/vmlinuz-2.4.18-14就是要载入的内核。后面的都是传递给内核的参数。root=LABEL=/ 就是linux的硬盘分区表示法,ro是readonly的意思。initrd用来初始的linux image,并设置相应的参数。
命令map:当你有两块硬盘,一个无法从第二块硬盘启动的操作系统,例如Windowsxp,就可以使用map命令.你能够将hd0映射为hd1,将hd1映射为hd0。换句话说,你可以虚拟的交换两个硬盘而启动所需要的操作系统 。命令形式如下:
grub> map (hd0) (hd1)
grub> map (hd1) (hd0)
GRUB 使用了“链式装入器”(chainloader)。链式装入器从分区 (hd1,0) 的引导记录中装入winxp自己的引导装入器,然后引导它。这就是这种技术叫做链式装入的原因 -- 它创建了一个从引导装入器到另一个的链。这种链式装入技术可以用于引导任何版本的 DOS 或 Windows。
GRUB的配置文件要简单就这么简单,如果你要更个性化一点,试一试把“color light-gray/blue ”加在default语句的下面,下一次启动GRUB时,看看有什么变化,再试一试“color light-blue/red",惊喜吗? 有趣吧! )
3 如何使用grub?
3.1 安装
你可以从ftp://alpha.gnu.org/pub/gnu/grub 下载GRUB的源代码。
得到文件grub-0.5.96.1.tar.gz,所以这样做:
# tar -xvzf grub-0.5.96.1.tar.gz
这个命令将解开的文件和目录放在一个名为grub-0.5.96.1的目录中。现在运行如
下命令:
#cd grub-0.5.96.1
# ./configure
如果你想定制GRUB,使之包含流行的文件系统和对网卡的支持,或者删除你不需要的网卡,可以运行如下命令:
# ./configure --help
这个命令将输出所有的命令选项。现在可以使用--enable和--disable选项增加或
删除对特定网卡的支持。(注意:GRUB支持网络启动)
为了开始编译过程,键入如下命令:
# make
# make install
至此你已经为安装GRUB真正做好了准备。
将GRUB的相关文件保存在诸如/boot/grub的目录中是一个好主意。为此,按如下步骤:
1.默认状态下,GRUB所有文件将安装在/usr/share/grub/i386-pc(或者在
/usr/local/share/grub/i386-pc目录下,这只取决于你的shell变量的设置。)
2.建立一个叫做/boot/grub的目录,然后拷贝下列文件到这个目录:
stage1 stage2 * stage1 5
稍候将解释这些文件。同时也要把GRUB(可能在/usr/sbin或者/usr/local/sbin
目录下)拷贝到/boot/grub目录下。
安装GRUB可以分为三个单独的步骤:
1.将“stage1”安装到MBR中。
2.设置“stage2”的地址或者位置。
3.设置一个菜单或选项,用来决定启动哪一个操作系统。
使用下面的命令开始安装GRUB。
#cd /boot/grub
# ./grub
这个命令根据BIOS的设置检测硬件设备,同时产生一些输出信息。这会花较长的时间。
end_request: I/O error, dev 02:00 (floppy), sector 0
GRUB version 0.5.96.1 (640K lower / 3072K upper memory)
TAB键可列出可能的命令列表。其它情况下TAB会列出设备或文件名。类似下面的提示会出现:
grub>
现在,假设你将Linux安装在了第一块硬盘的第一个分区中或者/dev/hda1中。记住GRUB的命名规则,将上面的名字改为(hd0,0)。键入下面的命令:
grub> install (hd0,0)/boot/grub/stage1 (hd0) (hd0,0)/boot/grub/stage2
p (hd0,0)/boot/grub/menu.conf
现在分析一下这个命令的细节。
install
一个内置的命令,它告诉GRUB将(hd0,0)/boot/grub/stage1安装到hd0的主引导纪录中。
(hd0,0)/boot/grub/stage2
告诉GRUB stage2映象的位置。
p with the the following options: (hd0,0)/boot/grub/menu.conf
为菜单的显示设置配置文件。
下面是对这个命令用法的总结:
1.install
2.ource_of_stage1
3.where_to_install
4.source_of_stage2
5.p source_of_configuration_file
现在,你完成了硬盘上的基本安装工作。
在软盘上的安装:
为了在软盘上安装GRUB,你要会用“dd”命令,并且了解它是如何工作的。为了做一张GRUB启动盘,你要将stage1和stage2文件放到软盘的开始扇区中。
安装stage1到软盘上:
插入一张已格式化的软盘,键入命令:
# dd if=stage1 of=/dev/fd0 bs=512 count=1
命令的详细说明如下:
if=input file
i.e., stage1
of=output file
i.e., floppy drive (this may be different on your computer)
bs=bytes to read and write
Here it is 512 bytes.
count=how many times to perform this operation
每次拷贝“bs”数目的块到目标地址。
安装stage2到软盘
# dd if=stage2 of=/dev/fd0 bs=512 seek=1
这里的步骤同stage1的相同,除了一个seek选项外。Seek选项将调过一个“bs”。例如,在上面的命令中bs的值是512,这样seek=1意味着将跳过软盘上前512个字节 ,从513字节开始。这将使得第一步操作不会覆盖stage1的前512字节。
现在你完成了基本的软盘驱动器安装。
如果已经安装了grub要把grub重新安装到主引导扇区上,只需要简单打入makebootable命令就可以了。
3.2 配置grub
grub启动时会在/boot/grub/中寻找一个名字为menu.lst的配置文件,如果找不到此文件则不进入菜单模式而直接进入命令行模式。
现在,我们来看一下如何在启动后进入各种操作系统,如何建立menu.conf文件。我们就从GRUB支持的启动过程开始。可以有两种方法来完成启动过程:
?A.通过调用内核本地启动
?B.连续启动或者将控制转给另一个引导器
A模式启动过程
1.配置跟设备或者告诉GRUB你的根文件系统。
2.告诉GRUB你的内核影像的位置,然后将参数传送给内核。
3.重新启动,试一下。
为了启动Linux,将内核以bzImage的文件名放在/boot/目录中,跟文件系统是
/dev/hda1,或者GRUB中的(hd0,0)。启动过程如下:
1.root (hd0,0) [This sets the root partition]
2.kernel /boot/bzImage root=/dev/hda1 [This sets the kernel]
B模式启动过程(这种模式假设当前的分区中安装了另一个启动管理器,例如LILO
或者NTLDR):
1.设置根分区但不要安装它
2.激活这个分区
3.配置需要启动的分区的第一个扇区
4.重新启动,看一下效果。
我们在试试启动安装在/dev/hdc1或者(hd1,0)的widows。启动windows的过程如下:
1.rootnoverify (hd1,0)
2.makeactive
3.chainloader +1 [+1 sets the first sector of the current root
partition]
4.boot [transfers the control and quits GRUB]
menu.conf文件:它用于建立启动多操作系统时的菜单。建立menu.conf并不难。它使用简单的英语,就象你在这一节看到的那样。
所有的菜单项目都以没有逗号分隔的“title TITLENAME”开头。你可以随意设置
TITLENAME。
设置Linux启动菜单步骤如下:
1.设置标题
2.设置根分区
3.设置内核的相应参数
4.启动
一个菜单例子:
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
前面有#的行是一个注释。
建立启动Windows 或者 DOS的菜单:
title Windoze
rootnoverify (hd0,0)
makeactive
chainloader +1
boot
#----
又或者:
title Microsoft Windows XP
map (hd0) (hd1)
map (hd1) (hd0)
root (hd1,0)
chainloader (hd1,0)+1
makeactive
boot
----
注意:root和rootnoverify都是一样的,把rootnoverify改成root也行。不过经过实践来看。有时引导win时,系统安装好后,是rootnoverify (hdX.Y)这样形式的,这样会出现windows起不来,出现什么windows什么文件损坏的情况。这时,我们就要把在grub中,引导 windows的那段中的rootnoverify改为root
root英文的意思就是根的意思,在这里是让linux知道自己所处的位置,也就是我们所安装linux的/根分区所在的位置 。
----
如果你安装了两个版本的Windows--一个是你自己用的,另一个给你的家人用的--这样第二个就无法安装,因为有提示说Windows已经安装了。
有一种简单的方法可以安装两个版本的Windows,即在启动时隐藏一个分区而使用另一个。你甚至可以为你的分区设置密码保护,这样可以避免别人错误的加载你的分区。下面介绍如何完成两个Windows的安装,hda1和hda2 或者 (hd0,0) 和(hd0,1),用到的命令有lock, password, hide 和 unhide。
建立windows 项目"My Entry":
title My Entry
lock
unhide (hd0,0)
hide (hd0,1)
rootnoverify (hd0,0)
makeactive
chainloader +1
boot
#----
为了更好的使用lock命令,你需要在配置文件开头使用password命令。Password命令的语法如下:password secret(“secret”就是密码)。任何时候你都可以通过按p键儿输入密码。
建立Windows 项目"Family Entry"
title Family Entry
unhide (hd0,1)
hide (hd0,0)
rootnoverify (hd0,1)
makeactive
chainloader +1
boot
任何人都可以启动这个项目,而无须输入密码。
这有一个使用password命令的有趣的窍门。为了在缺省菜单列表或配置文件中隐藏某些项目,你可以使用下面的命令加载一个定制的列表:
password secret
在这个命令中,“secret”是密码,而/boot/grub/secret-list.conf是密码文件。这样做之前,你要先进入到根目录或者给出全路径名。例如:
password secret (hd0,4)/boot/grub/secret-list.conf
还有一个更重要的命令是“map”。当你有两块硬盘,一个无法从第二块硬盘启动的操作系统,例如Windows,就可以使用map命令。例如,你能够将 hd0映射为hd1,将hd1映射为hd0。换句话说,你可以虚拟的交换两个硬盘而启动所需要的操作系统 。命令形式如下:
grub> map (hd0) (hd1)
grub> map (hd1) (hd0)
启动FreeBSD:
title FreeBSD 4.0
root (hd0,4,a)
kernel /boot/loader
boot
#----
这里我们调用了FreeBSD的启动管理器。Root (hd0,4,a)由四个参数,是因为
FreeBSD对一个单独分区进行了虚拟分割。我们称根分区为“a”。如果FreeBSD占
据了整个第二块硬盘,这里就应该是root (hd0,a)。这样,就不是调用内核而是调用FreeBSD的启动管理器,它要比调用内核更易使用。
(注意:推荐在使用OpenBSD和GNU/Hurd之前,要先试一下链式加载。)
现在你已经完成了基本的GRUB编译、安装和配置。你对GRUB了解的越多,就越会发现GRUB是一种控制启动的易用和高效的方法。
各种GRUB命令:
default xx
表明xx是缺省的启动项目
timeout yy
表明在yy秒后缺省启动项目将启动
fallback zz
在第一个启动项目失败后,过了timeout时间后,就将启动zz项目。
color
这个命令将生成彩色菜单。它的语法是:color normal current_selection。这两个域都可以有两个值,形如foreground/background。例如:
color green/black or light-gray/blue
你也可以使用相关的数字。
记住:所有的值都是从0开始,所以0是第一个
3.3 GRUB启动盘
要制作引导盘,需执行一些简单的步骤。首先,在新的软盘上创建 ext2 文件系统。然后,将其安装,并将一些 GRUB 文件复制到该文件系统,最后运行 "grub" 程序,它将负责设置软盘的引导扇区。
将一张空盘插入 1.44MB 软驱,输入:
# mke2fs /dev/fd0
创建了 ext2 文件系统后,需要安装该文件系统:
# mount /dev/fd0 /mnt/floppy
现在,需要创建一些目录,并将一些关键文件(原先安装 GRUB 时已安装了这些文件)复制到软盘:
# mkdir /mnt/floppy/boot
# mkdir /mnt/floppy/boot/grub
# cp /boot/grub/stage1 /mnt/floppy/boot/grub
# cp /boot/grub/stage2 /mnt/floppy/boot/grub
再有一个步骤,就能得到可用的引导盘。
在linux bash中,从 root 用户运行“grub”,该程序非常有趣并值得注意,因为它实际上是GRUB 引导装入器的半功能性版本。尽管 Linux 已经启动并正在运行,您仍可以运行 GRUB 并执行某些任务,而且其界面与使用 GRUB 引导盘或将 GRUB 安装到硬盘 MBR 时看到的界面(即GRUB控制台)完全相同。
在 grub> 提示符处,输入:
grub> root (fd0)
grub> setup (fd0)
grub> quit
现在,引导盘完成了。
如果要把GRUB装到硬盘上,也很容易。这个过程几乎与引导盘安装过程一样。首先,需要决定哪个硬盘分区将成为 root GRUB 分区。在这个分区上,创建 /boot/grub 目录,并将 stage1 和 stage2 文件复制到该目录中,可以通过重新引导系统并使用引导盘,或者使用驻留版本的 GRUB 来执行后一步操作。在这两种情况下,启动 GRUB,并用 root 命令指定 root 分区。例如,如果将 stage1 和 stage2 文件复制到 hda5 的 /boot/grub 目录中,应输入 "root (hd0,4)"。接着,决定在哪里安装 GRUB -- 在硬盘的 MBR,或者如果与 GRUB 一起使用另一个“主”引导装入器,则安装在特定分区的引导记录中。如果安装到 MBR,则可以指定整个磁盘而不必指定分区,如下(对于 hda):
grub> setup (hd0)
如果要将 GRUB 安装到 /dev/hda5 的引导记录中,应输入:
grub> setup (hd0,4)
现在,已安装 GRUB。引导系统时,应该立即以 GRUB 的控制台方式结束(如果安装到 MBR)。现在,应创建引导菜单,这样就不必在每次引导系统时都输入那些命令。
从软盘启动grub
制作启动盘后可以用软盘启动引导硬盘上的操作系统, 插入制作好的启动软盘,进入BIOS设定软盘启动。软盘启动成功后就会进入grub的命令行模式
grub>
要启动一个操作系统,首先指定引导哪个分区上的系统,例如要引导指第一个硬盘上的第一个分区的操作系统,先键入
grub>root (hd0,0)
接着如果要启动的是Windows系统,键入
grub>chainloader (hd0,0)+1
注意(hd0,0)要随着硬盘和分区的不同而改变数字。
如果要引导Linux或其他系统,应键入
grub>kernel (hd0,0)/boot/vmlinuz root=/dev/hda1
注意hda1参数也要随着硬盘和分区的不同而改变,如从第二个硬盘的第一个分区引导则用hdb1。
最后敲入boot就可以启动系统了。
在任何时候不能确定命令或者命令的参数都可以按Tab获得相关的帮助。用上下键可以获得命令的历史记录。其实这些命令就是menu.lst的启动描述,您也可以根据那些描述来自己键入启动命令,最后敲入boot就可以引导系统了。
4 GRUB的交互性
GRUB 最好的优点之一就是其强健的设计 -- 在不断使用它时请别忘了这点。如果更新内核或更改它在磁盘上的位置,不必重新安装 GRUB。事实上,如有必要,只要更新 menu.lst 文件即可,一切将保持正常。
只有少数情况下,才需要将 GRUB 引导装入器重新安装到引导记录。首先,如果更改 GRUB root 分区的分区类型(例如,从 ext2 改成 ReiserFS),则需要重新安装。或者,如果更新 /boot/grub 中的 stage1 和 stage2 文件,由于它们来自更新版本的 GRUB,很有可能要重新安装引导装入器。其它情况下,可以不必理睬!
GRUB的最大的特点就是交互性特别强。在开机时,按一下“c”,将进入GRUB 控制台。显示如下:
GRUB version 0.5.96.1 (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename. ]
grub>
欢迎使用 GRUB 控制台。现在,再研究命令:
将通过GRUB 控制台绕过lilo来启动RedHat linux,
grub> root (h
现在,按一次 Tab 键。如果系统中有多个硬盘,GRUB 将显示可能完成的列表,从 "hd0" 开始。如果只有一个硬盘,GRUB 将插入 "hd0,"。如果有多个硬盘,继续进行,在 ("hd2") 中输入名称并在名称后紧跟着输入逗号,但不要按 Enter 键。部分完成的 root 命令看起来如下:
grub> root (hd0,
现在,继续操作,再按一次 Tab 键。GRUB 将显示特定硬盘上所有分区的列表,以及它们的文件系统类型。在我的系统中,按 Tab 键时得到以下列表:
grub> root (hd0, (tab,按tab一下键)
Possible partitions are:
Partition num: 0, Filesystem type is fat, partition type 0x6
Partition num: 2, Filesystem type is ext2fs, partition type 0x83
Partition num: 4, Filesystem type unknown, partition type 0x7
Partition num: 5, Filesystem type is ext2fs, partition type 0x83
Partition num: 6, Filesystem type is fat, partition type 0xb
Partition num: 7, Filesystem type is fat, partition type 0xb
Partition num: 8, Filesystem type is ext2fs, partition type 0x83
Partition num: 9, Filesystem type unknown, partition type 0x82
如您所见,GRUB 的交互式硬盘和分区名称实现功能非常有条理。这些,只需要好好理解 GRUB 新奇的硬盘和分区命名语法,然后就可以继续操作了
grub> root (hd0,8)
现在已安装了 root 文件系统,到装入内核的时候了
grub> kernel /boot/vmlinuz-2.4.2 root=/dev/hda5 ro
[Linux-bzImage, setup=0x1200, size=0xe1a30]
您已经安装了 root 文件系统并装入了内核。现在,可以引导了。只要输入 "boot",Linux 引导过程就将开始。是不是很cool啊,GRUB的menu.lst更像一个linux下的脚本程序。
5 常见grub除错方法的思路
首先进去Linux的rescue模式!
用软盘或光盘启动,然后在启动的提示符输入:linux rescue
按照提示进入一个Shell状态,你可以到/mnt/下面看到一个sysimage这么目录,进去以后,就是你安装linux的/分区.
使用命令将根分区变为当前目录的根分区:chroot /mnt/sysimage
然后转到/sbin/这个目录中.
使用fdisk -l 显示当前分区情况,然后使用#grub-install /dev/hdx(x为你使用的是那块硬盘安装的,一般情况下是hda)
使用exit推出chroot,再使用exit退出linux rescue模式,系统将重新启动!取出光盘,应该可以看到grub安装好了.
在具体的环境中,编辑/boot/grub/grub.conf文件和menu.lst文件.
###请转贴时保留以下内容######
Red Hat Linux 033 实验部分
应广大RH爱好者的要求,奉献Red Hat Linux 033 实验翻译
请提出宝贵意见Mail:kissingwolf@hotmail.com
KevinZ(kissingwolf)
2004.3.4
#############################
Red Hat Linux 033 实验部分
试验3
文件和目录操作
估计时间: 1小时30分钟
目标: 熟悉函数、语法和一些基本的文件和目录的控制操作。
练习有效地组合这些命令完成一般的用户任务
试验的起点: 安装了Red Hat Linux可运行系统 ,有一个无特权用户student,密码:student
第一步:目录和文件组织
场景/情节
在您的home目录下有一系列的文件,您决定到时间整理一下了.您计划生成一些新的子目录,然后根据您的计划拷贝和移动这些文件到适当的目录;另外,这些文件不是都有用的,有一些是要删除掉的。
任务:
1. 以用户名student密码student在tty1上登陆。
2. 在您登陆系统以后,你将进入您的home目录.你可以使用"打印工作目录"检查这一情况
$ pwd
/home/student
3.使用如下每条命令检查您是否还有文件在您的home目录下:
$ ls
$ ls -a
$ ls -al
为什么第一和第二条命令返回不同的文件数?
第三条命令返回的在您当前的home目录下最大的文件是多少?
您的home目录下有子目录吗?
4. 您现在使用touch为以后的步骤建立文件。这种扩展在接下来的命令中是如何工作
的在以后的章节中进行讨论。现在,仅仅按照下面的行键入就行了(在集合与集合之间使用包括花括号{}和下划线的字符)
$ touch {report,memo,graph}_{sep,oct,nov,dec}_{a,b,c}{1,2,3}
5. 使用命令ls检查最后一条命令的结果,你会发现它在您的home目录下生成了108个
新的空文件(您不必数)。这些文件代表了您将使用的在这个步骤中的代表的数据文件。如果您看不到这些文件,向教师寻找帮助,没有这些文件,该试验后面的步骤就无法进行。
6. 为了组织您的文件,您必须先建立一些新目录,使用mkdir在您的home目录中直接
建立一些子目录:
$ mkdir a_reports
$ mkdir september october november december
再使用ls 检查您的工作。
7. 使用如下命令在您的一个新的目录中生成一些附加子目录
$ cd a_reports
为了切换到目录,接下来:
$ mkdir 1 2 3
使用ls检查你的子目录a_reports下的名为1,2,3的三个新的子目录。
8. 首先把所有带”b”的报告从home目录中移出并且按月份分组,先验证要使用的复杂的通配符模式,是个好方法。这样做以确保它对于正确的文件进行操作。如果你打算使用这种通配符模式,您可以使用一个无害的命令来替换您的命令。
$ cd
$ ls -l *dec?b?
你将看到列出了9个”december”,”b”文件,把其中的一个移到december目录中:
$ mv graph_dec_b1 december
用下面的语句移动其余的:
$ mv *dec?b? december
列出december目录的内容验证移动操作是否成功:
$ ls -l december
total 0
-rw-rw-r-- 1 student student 0 Sep 18 17:45 graph_dec_b1
-rw-rw-r-- 1 student student 0 Sep 18 17:45 graph_dec_b2
-rw-rw-r-- 1 student student 0 Sep 18 17:45 graph_dec_b3
-rw-rw-r-- 1 student student 0 Sep 18 17:45 memo_dec_b1
-rw-rw-r-- 1 student student 0 Sep 18 17:45 memo_dec_b2
-rw-rw-r-- 1 student student 0 Sep 18 17:45 memo_dec_b3
-rw-rw-r-- 1 student student 0 Sep 18 17:45 report_dec_b1
-rw-rw-r-- 1 student student 0 Sep 18 17:45 report_dec_b2
-rw-rw-r-- 1 student student 0 Sep 18 17:45 report_dec_b3
9.把其余所有带”b”的报告分别移动到各自对应的目录中:
$ mv *oct?b? october
$ mv *sep?b? september
10. 现在你将把”a”报告收集到它们各自对应的目录中。注意使用~代替 “你的home
目录”。通配符和模式的组合指定了您的home目录下所有以_a1结尾的文件。
$ cd a_reports
$ mv ~/*_a1 1/
“september””a1”文件陈旧并且不再需要,使用echo确定您已经建立了一个只匹配该类文件的模式,然后删除它们,并且检查剩下的”a1”文件是否正确移动:
$ cd 1
$ echo *sep*
$ rm *sep*
$ ls
graph_dec_a1 graph_oct_a1 memo_nov_a1 report_dec_a1 report_oct_a1 graph_nov_a1 memo_dec_a1 memo_oct_a1 report_nov_a1
11.最后移动”a2”和”a3”报告到各自对应的目录中。为了使过程变得有趣,我们将把
它们移出当前目录,使用相对和绝对的的路径名。第一步,使用pwd确定当前目录:
$ pwd
/home/student/a_reports/1
用echo检查涉及到”a2”文件的模式,然后使用绝对路径名:
$ echo /home/student/*a2*
$ mv /home/student/*a2* /home/student/a_reports/2
即使您当前在/home/student/a_reports/1目录下,也能把文件从/home/student移动到/home/student/a_reports/2目录中,因为您指定了文件的路径名称(在本例中为绝对路径名称)
现在使用相对路径移动“a3”文件。再一次的,首先确信模式指定的是正确的文件名称。
$ echo ../../*a3*
$ mv ../../*a3* ../3
12.返回您的home目录,并且使用ls 来校验仅存在该目录中的文件都是“c”文件(例如:graph_dec_c1,graph_dec_c2,…)
13.“c1”和“c2”报告文件对于每个月来说都非常重要,并且您打算把它们备份到另外一个目录:
$ mkdir /tmp/archive
$ cp report*[12] /tmp/archive/
另外的,所有的对于十二月份的报告文件应该备份到/tmp/archice目录下面。注意,-i选项使得cp程序在覆盖任何文件之前进行提示:
$ cp -i report_dec* /tmp/archive/
cp: overwrite `/tmp/archive/report_dec_c1'? n
cp: overwrite `/tmp/archive/report_dec_c2'? n
14.现在您备份了一些对您重要的“c”文件,您现在要删除位于您的home目录下面所有的文件。使用通配符“*c*”检查剩下的含有c的文件。您为什么不想执行命令rm *c* ?
(作为提示:尝试:ls *c*)
15.删除您的home目录下的剩余*c*文件。在发出一个破坏性的命令之前我们再次使用echo命令。
$ echo *c[1-3]
$ rm *c[1-3]
$ ls
a_reports december november october september
试验的结果
一个组织良好的home目录,文件放置在合理的位置,一些文件备份到了/tmp/archive目录中
第二步:决定磁盘的使用率
场景/情节
您想记录您的系统中的每一个文件系统总共有多少剩余空间。
另外,您想有一个关于哪些目录消耗了系统的多数的空间的列表。
任务
1. 使用df获取文件系统总的剩余空间,您的输出应该是类似于下面的例子(尽管输出
依赖于您的特定的安装,输出可能不同)
$ df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hdc2 14129568 1809728 11602096 14% /
/dev/hdc1 49743 8847 38328 19% /boot
none 63312 0 63312 0% /dev/shm
2.注意缺省的命令df操作是以块为单位报告信息,试用-h,-H选项,则是用 “用户可读的“形式报告
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hdc2 13G 1.8G 11G 14% /
/dev/hdc1 49M 8.7M 37M 19% /boot
none 62M 0 61M 0% /dev/shm
$ df -H
Filesystem Size Used Avail Use% Mounted on
/dev/hdc2 14G 1.9G 11G 14% /
/dev/hdc1 51M 9.1M 39M 19% /boot
none 65M 0 64M 0% /dev/shm
这两个开关有什么不同(使用man df)?
2. 在您的home目录使用du(磁盘使用率)命令来决定您所有的文件消耗的空间。确保尝试-h选项获得更可读的输出。
第三步:检视文本文件
任务
1.我们需要一个可供我们工作的文本文件:
$ cd
$ cp /usr/share/dict/words
.
2.使用cat显示文件:
$ cat words
Aarhus
Aaron
Ababa
…输出省略….
Zulu
Zulus
Zurich
3.在这种情况下cat是一个坏的选择,因为很多输出快速的滚屏,试用less:
$ less words
Aarhus
Aaron
Ababa
…输出省略…
abiding
Abidjan
Abigail
…输出省略…
使用less的时候,您可以向前翻页(使用b),向后翻页(使用空格键)在整个输出中,每次一屏.
4.如果你只需要快速的看看某个文件的最前几行和最后几行,你要使用head或者tail:
$ head words
Aarhus
Aaron
Ababa
aback
abaft
abandon
abandoned
abandoning
abandonment
abandons
$ tail words
zoologically
zoom
zooms
zoos
Zorn
Zoroaster
Zoroastrian
Zulu
Zulus
Zurich
您可以使用man帮助页面发现能使用head和tail中的哪个开关修改行号或是显示的行的相关的位置.
哪个命令你能使用显示文本的前50行?
哪个命令您能使用显示文件从第25,000行到结束的内容?
试验4
用户信息
估计时间: 30分钟
目标: 熟悉一些用户标识和帐户转换基本的控制操作。
试验的起点: 安装了Red Hat Linux可运行系统,并且是成功完成试验系统。有另外一个无特权用户visitor,密码:visitor帐户的存在。请教师检查您的系统中是否已经建立这个帐户。如果这个visitor用户帐户没有建立,按照以下步骤进行
1. 用root帐户登陆虚拟控制台。
2. 在提示符下键入以下命令
# useradd visitor
3. 现在键入
# passwd visitor
Changing password for user visitor.
New password: {输入visitor}
BAD PASSWORD: it is based on a dictionary word
Retype new password: {输入visitor}
passwd: all authentication tokens updated successfully.
第一步:本地用户登陆
任务:
1. 完全从工作站中退出。确定您已经推出所有虚拟终端和X Windows系统
2. 转换到虚拟终端1(tty1)通过按:
3. 使用密码redhat进入root帐号登陆您的工作站
4. 确定指定的登陆信息,使用下列命令:
# whoami
# groups
# id
检查这些命令的输出。
5.获取工作站当前所有登陆者信息,当前,应该只有一个用户登陆系统,按如下顺序键入的命令的输出是很有趣的。
# users
# who
# w
检查这些命令的输出。
6. 转换到虚拟终端2(tty2)通过按
7.以用户student,密码:student登陆你的工作站。
8.获取指定登陆者的信息,运行下列命令:
$ whoami
$ groups
$ id
检查这些命令的输出。
9.获取工作站上当前所有登陆者的信息:
$ users
$ who
$ w
检查这些命令的输出。
10. 转换到虚拟终端3(tty3)通过按
11. 以用户visitor,密码:visitor登陆你的工作站
12. 获取指定登陆者的信息,运行下列命令:
$ whoami
$ groups
$ id
检查这些命令的输出。
13. 获取工作站上当前所有登陆者的信息:
$ users
$ who
$ w
检查这些命令的输出。
步骤2:切换帐户
任务:
1. 按下如下的键切换到虚拟终端3(tty3)
2. 运行id命令来决定您的用户信息,pwd来喜爱能使您目前的工作目录
$ id
$ pwd
记录结果:
id=__________________________________________
pwd=_________________________________________
3. 使用su - 来切换到root用户,运行id和pwd来获取您的当前的目录
$ su -
# id
# pwd
记录结果:
id=__________________________________________
pwd=_________________________________________
4. 从root帐户退出,返回到visitor帐户
# exit
5. 使用不含 - 的su切换到root用户,运行pwd和id。
$ su
# id
# pwd
记录结果:
id=__________________________________________
pwd=_________________________________________
为什么和第3步骤的结果不同呢?
6.登出所有您在这个步骤中本地的和远程的shell。
试验6
Linux文件系统的要点
估计时间: 90分钟
目标: 深入了解linux文件系统知识,包括:创建和使用links,使用slocate和find,归档压缩文件。
试验的起点: 一个Red Hat Linux系统。
第一步:创建和使用links
任务:
1.在早些时候的试验,你已经拷贝了一个文件/usr/share/dict/words到你使用的用户student的主目录 ~/words.在这个案例里,你不需要编辑文件-拷贝一个文件到你的主目录就可以在试验的期间使用了。
2.为了要避免原始文件和副本之间的混乱。在student’s主目录中删除words的副本
$ cd
$ rm words
3.虽然你可能没有在那时了解它, 这个文件/usr/share/dict/words 的副本实际上是一个软link。列出内容下面目录 /usr/share/dict的内容查看link和它的参数。
$ ls -l /usr/share/dict
total 404
-rw-r--r-- 1 root root 409305 Apr 3 10:29 linux.words
lrwxrwxrwx 1 root root 11 Apr 20 17:33 words ->linux.words
a.你能告诉我words是一个软链接吗?
b.为什么words的文件大小是11?
c.words允许所有人访问。这和linux.words文件用什么冲突?除了root用户,其他用户能够能在linux.words上面写数据吗?
4.再一次列出文件,这次显示相应的indeds号。为什么两个文件会有相同或不同的inodes号?
$ ls -I /usr/share/dict
5. 现在在你的主目录中产生两个的代号和硬链接到/usr/share/dict/linux.words:
$ ln -s /usr/share/dict/linux.words soft
$ ln /usr/share/dict/linux.words hard
6. 测试一下,你新建的链接两者都指到 linux.words 文件:
$ head hard soft
7. 检查你所有文件的link , 然后在下面回答问题:
$ ls -il hard soft
$ stat had soft
报告文件大小,hard_______和soft_______.
被占用的真实的空间,hard_______和soft_______.
你怎样解释这两个link占用空间的差别。
列出链接的记数,hard_______和soft_______.
所有权,hard_______和soft_______.
文件硬链接的所有者和root用户可以完全访问,其他用户是只读权限。学生将会可以删除这个新的文件吗?为什么?
8. 更多的挑战:如果时间许可,探究一下下面的问题:
a.你能创建一个目标文件并不存在的软连接吗?看看ls命令的输出能否给你一些提示。
b.你能创建一个目标文件并不存在的软连接吗? 为什么?
c.你能创建一个软连接的硬连接吗? 当你尝试的时候有什么问题吗?
d.在创建了几个硬连接后,你能说出哪个是更加真实的文件吗?
步骤2:使用find命令
任务:
作为student登录。设计完成find命令提出结果
查看你当前的umask。设计并且运行find命令在每下列各项被描述的结果指令里。然后写下提供的空格里。
你可能需要在在find的man page里查许找。记得你能用/stringz man page里查找。
第一个答案已经为你列出。
1.在/var/lib目录下查找所有文件其所有者是games用户的文件
$ find /var/lib -user games 2> /dev/null
2.在/var目录下查找所有文件其所有者是root用户的文件。_________________________________________________________
3.查找所有文件其所有者不是root,bin和student用户并用长格式显示(如ls -l 的显示结果)。
_________________________________________________________
4.查找/usr/bin目录下所有大小超过一百万byte的文件并用长格式显示(如ls -l 的显示结果)。
_________________________________________________________
5.对/etc/mail目录下的所有文件使用file命令.
_________________________________________________________
6.查找/tmp目录下属于student的所有普通文件,这些文件的修改时间为120分钟以前,查询结果用长格式显示(如ls -l 的显示结果)。
_________________________________________________________
7. 对于查到的上述文件,用-ok选项删除。
_________________________________________________________
步骤3:归档和压缩
情景/故事:
你的系统上的主硬盘在你使用它的时候有可怕的噪音,但是它上面有有价值的数据。自从系统在两年半以前备份过,你有决定手动备份少数几个你最紧要的文件。那 / tmp 目录里储存在不同的硬盘的分区上快怀的分区,这样你想临时的把文件备份到那里。
任务:
1. 在/home目录里,用find命令定位文件所有者是student的文件。然后将其压缩。
$ find /home -user student -exec tar rvf /tmp/backup.tar {} \;
2. 保存/etc目录下的文件到/tmp目录下:
$ tar cvf /tmp/confbackup.tar /etc
3. 列出两个文件的大小
$ ls -lh /tmp/*.tar
-rw-rw-r-- 1 student student 1.9M Oct 17 23:06 /tmp/backup.tar
-rw-rw-r-- 1 student student 5.4M Oct 18 00:27 /tmp/confbackup.tar
backup.tar文件的大小________
confbackup.tar文件的大小________
4. 使用gzip压缩你的文档。然后报告文件的大小:
$ cd /tmp
$ gzip -v *.tar
$ ls -lh *tar*
-rw-rw-r-- 1 student student 580K Oct 17 23:06 backup.tar.gz
-rw-rw-r-- 1 student student 913K Oct 18 0:27 confbackup.tar.gz
backup.tar.gz文件大小为____________
backup.tar.gz文件的压缩百分比________
confbackup.tar.gz文件大小为____________
confbackup.tar.gz文件的压缩百分比________
5. 先解压缩bzip2文件然后在压缩,然后比较新文件的大小:
$ gunzip *.gz
$ ls -lh *tar
-rw-rw-r--1 1 student student 1.9M Oct 17 23:06 backup.tar
-rw-rw-r--1 1 student student 5.4M Oct 18 00:27 confbackup.tar
$ bzip2 -v *tar
$ ls -lh *tar
-rw-rw-r--1 1 student student 510K Oct 17 23:06 backup.tar.bz2
-rw-rw-r--1 1 student student 791K Oct 18 00:27 confbackup.tar.bz2
backup.tar.bz2文件大小为____________
backup.tar.bz2文件的压缩百分比________
confbackup.tar.bz2文件大小为____________
confbackup.tar.bz2文件的压缩百分比________
6. 在传统UNIX系统,
$ rm confbackup.tar.bz2
$ tar czf test1.tgz /etc
$ tar cjf test2.tbz /etc
$ file test*
test1.tgz:gzip compressed data,deflated,last modified:Wed Oct 18 01:52:11 2000,os:Unix
test2.tbz:bzip2 compressed data,block size = 900K
结果:
你的“重要数据”被压缩备份到/tmp目录里了。
问题答案2
2. find /var -user root -group mail 2>/dev/mull
3. find / -not -user root -not -user bin -not -user student -ls 2> /dev/null
or
find / ! -user root ! -user bin ! -user student -exec ls -ld {} \; 2> /dev/null
4. find /usr/bin -size +1000000c -ls 2> /dev/null
5. find /etc/maill -exec file {} \; 2 > /dev/null
6. find /tmp -user student -and -mmin +120 -and -type f -ls 2> /dev/null
7. find /tmp -user student -and -mmin +120 -and -type f -ok rm {} \;
(end)
试验7
bash Shell
估计时间: 45分钟
目标: 深入了解bash shell,包括创建定制。
试验的起点: 一个Red Hat Linux系统。
第一步:使用Aliases
任务:
1.你决定创建一个alias,当你使用cls的时候,系统能够运行clear命令清除你的屏幕。使用student身份在tty1登录,然后输入下列命令.
$ alias cls=‘clear’
$ alias
$ cls
2.当你重新登录的时候这个别名就丢失了。确信新的别名在用户student每次登录的时候都能够使用,可以执行一下几步。
$ cd
$ vi .bashrc
查找包含下列的文字:#User specific aliases and functions 添加到你的别名命令行:
alias cls=’clear’
保存并推出。
3.测试你的改变当你注销的时候,重新登录到tty1上的时候,试下面的命令:
$ alias
$ cls
4.现在使用ls 的man page 去创建一个叫lr的别名,利用ls的五个开关。测试并添加你的别名到.bashrc中.这个别名能够:
a)用长格式显示文件
b)显示隐含文件
c)给文件分类
d)用相反的顺序显示文件
e)按文件修改时间显示文件。
目标:
一条新的清屏命令和一条新的列文件命令。(都是别名)
步骤2:改变你的bash提示
情景/故事:
你决定定制你的bash提示以能够显示完全的路径和命令的序列号。
任务:
5. 在终端窗口,显示当前主要提示符的值。
$ echo $PS1
6. 改变你的提示符为一个字符串。
$ PS1=’Red Hat Linux ->’
7. 这个不常使用,因此恢复到有$提示符的情况下,同时加上主机名。
$ PS1=’\h $’
8. 在主机名和$符号之间插入bash表示历史纪录提示符的特殊字符 \!。
9. 查找bash 的man 手册,把当前的工作目录放入提示符中。
10. 你定制的提示符显示实例,如不同请继续修改。
station1:~ 21 $ cd /tmp
station1:/tmp 22 $
11. 编辑你重新定义的PS1 到你的.bashrc,然后打开新的终端窗口看看结果如何.
步骤3:配置shell选项
情景/故事:
使用set和shopt你定制几个bash shell 。
任务:
12.以student身份登录tty1界面上.查看许多普遍的配置shell选项:
$ set -o
allexport off
braceexpand on
emacs on
errexit off
hashall on
… output truncated …
13.察看目前ignoreeof的属性,用ctrl+d 键看是否能logout.
14.用student身份在tty1上登录,执行下面的改变,然后测试ignoreeof选项:
$ set -o ignoreeof
$
$ 用 “logout” 退出shell
$ set +o ignoreeof
$
15.当试图执行命令的时候可以看到提示信息.使用type的命令:
$ type cat
cat is hashed (/bin/cat)
$ type cls
cls is aliased to ‘clear’
$ type set
shopt is a shell builtin
$ type while
while is a shell keyword
结果:
现在你有一个更好的shell options.
问题答案4:命令替代
1. 确定完全路径名
$ which metacity
$ which
$ ^message^window-demo
2. 重复执行上一个包含字符串ig的命令:
$
3. 当一个命令在另一个命令的后面用(‘ ‘)起来的时候,bash会先执行后面的命令并把执行的结果作为第一个命令的输入. 使用这个技术,看看下面命令的执行结果.
$ ls -l ‘which nautilus‘
(end)
试验8
定制图形化界面
估计时间: 15分钟
目标: 探索Red hat liunx多种多样的图形化桌面环境..
试验的起点: 一个Red Hat Linux系统。
第一步:定制窗口管理
任务:
1.在你的桌面的左边点击Red Hat图标,选择”属性”然后点击”控制中心”.Nautilus 将打开显示的可以定制你的桌面环境的窗口.
2.双击”背景”图标.点击”选择图片”按钮,可用的图片在/usr/share/backgrounds 下,有一些图片作为墙纸很漂亮;你可以在”图片选项”中选择居中拉伸.
选择一个你喜欢的,或者选”没有图片”然后你可以使用”背景风格”颜色和属性.当你完成的后,关闭”背景属性”对话框.
3. 双击”鼠标”的图标, 这个参数面板你能够调整双击的时间延迟,速度和灵敏度 .
假如你伸左撇子,你也可以在这里选择左收习惯
当完成后选择关闭”鼠标属性”对话框.
4. 打开”桌面主题”面板.你可以选择一个主题,默认的主题是”Bluecurve”.选一个你喜欢的,然后关闭这个面板.
5. 最后,打开”工具栏”,你能够选择你可以选择下列特性中的一个:显示工具条,或小的图标.然后关闭面板.
目标:
Red Hat Linux的桌面环境已经按你的要求定制好了。
试验9
标准输入输出和管道
估计时间: 30分钟
目标: 熟悉Red Hat Linux中的标准输入输出和管道
试验的起点: 标准的Red Hat Linux安装
步骤1:标准输入和输出
任务:
1. 使用你熟悉的编辑器创建两个文件:
packages1.txt 应该包含以下八行:
amanda
galleon
metacity
mozilla
postgresql
procinfo
rpmfind
squid
packages2.txt应该包含以下6行
anaconda
openssh
gnome-core
samba
sendmail
xscreensaver
2. cat工具是最简单的linux过滤器,它会默认把跟在后面的参数当作文件名,并把这个文件作为输入,如果没有文件名则把标准的输入作为自己的输入,然后将它们发送到标准的输出上去。现在我们来实验一下:
$cat packages1.txt
3.如果cat后没有参数,则它会等待标准的输入,所以当你输入cat命令后,再回车,然后什么也没有显示。输入cat后,cat命令会监视标准输入,等待输入的到达。如果这个时候输入一些文本,再按回车,cat就会把输入的内容当作自己的输入,然后输出到标准的输出----显示器上,结束cat的命令为按下 ctrl-d,这是结束输入的标志。
$ cat
输入一些文字,然后按回车。
^d (就是按ctrl-d)
4. 大多数的文本处理命令是执行过滤操作,他们可以读标准输入,对输入做一些动作,然后把结果发送到标准输出去。这些命令就向cat一样,只是对输入的处理不太一样。
tr命令,也是过滤器命令,如果给tr后加两个字符串做为参数,它会读取标准输入,然后把输入中包含着前一个字符串的字符变成第二个字符串,然后输出到标准输出去。
把刚才的命令换成tr,tr将把字符串中有的字符变成大写的。
$ tr 'aeiou' 'AEIOU'
输入一些文字,然后按回车。
^d
5. 定义shell不要把命令的输出发到标准输出上,而是重定向到一个文件中,我们使用 > 来重定向
重复cat的例子重定向标准的输出到packages1.catfile,这样把输出到屏幕的东西输出到了文件中,效果就和重新copy了一份文件是一样的,cat这个输出文件,然后用diff和ls确认原文件与package1.catfile内容一样。
$ cat packages1.txt > packages1.catfile
$ cat packages1.catfile
$ diff packages1.txt packages1.catfile
$ ls -l packages1*
6. 使用>>来重定向会把输出附加到已存在的文件的末尾。
把packages2.txt文件中的内容附加到packages1.catfile之后,然后检验结果。
$ cat packages2.txt >> packages1.catfile
$ cat packages1.catfile
7. 如果输出重定向时cat没有直接跟文件名的参数,那么cat就会等待标准的输入,直到按下ctrl-d作为结束,然后把所有输入的东西重定向到这个文件中去。这样可以很容易的创建一个文本文件,
$ cat > typedin.txt
This time, when text is typed at the keyboard,
It is not echoed back to the screen.
Instead, it is redirected to the file typedin.txt.
^d
$ ls -l typedin.txt
$ cat typedin.txt
8. 使用tr取代cat,重复刚才的命令
$ tr 'aeiou' 'AEIOU' > trfile.txt
This time, when text is typed at the keyboard,
It is not echoed back to the screen.
Instead, it is redirected to the file typedin.txt.
^d
$ ls -l trfile.txt
$ cat trfile.txt
9. 使用set -o命令,确认显示出目前bash的noclobber选项是关闭状态,确认当输出重定时向你可以重写文件
$ set -o
$ ls -l /tmp > trifle.txt
$ ls -l trfile.txt
$ cat trifle.txt
10. 使用set命令更改noclobber选项,如下操作:
$ set -o noclobber
$ echo “new contents” > trfile.txt
bash: trfile.txt:cannot overwrite existing file
11. cat可以接受一个文件名或者是一个输入重定向的文件,测试以下两个命令:
$ cat packages1.txt
$ cat < packages1.txt
12. 但是tr不能接受文件名作为参数,它只希望输入是标准输入。
$ tr 'aeiou' 'AEIOU' < packages1.txt
13. 下面的例子中标准输入和输出都被重定向,输入还是packages1.txt文件,这回改为输出到文件packages1.trfile.txt中去了。
$ tr 'aeiou' 'AEIOU' < packages1.txt >packages1.trfile.txt
$ ls -l packages1.txt packages1.trfile.txt
$ cat packages1.trfile.txt
步骤2:管道
1. 把一个命令的标准输出直接传输给另一个命令作为它的标准输入,这样特殊的机制叫做管道。
如果没有管道,你要想打印你的目录中文件的列表至少要两步,还需要把没用的文件删除,(lpr命令可以把文件的内容发给默认的打印机,它的用法会在第12章讲)(注意只有当你没有打印机时可以使用以下的例子)
$ ls -l > /tmp/ls.txt
$ lpr /tmp/ls.txt
$ rm /tmp/ls.txt
使用管道,这些命令可以仅仅用以下短短的一条命令,将ls -l的输出直接发送给lpr作为输入,lpr也不需要别的参数。
$ ls -l | lpr
2. 管道经常的用法是一个命令产生了很多页的输出,可以把这些输出直接给less,管道左边是你的命令,右边是less,less不需要参数。(空格键是翻页,q键是退出less)
$ ls -l /usr/bin | less
步骤3:练习
答案在下面,可以使用man page来帮助你解决问题
1. 拷贝一份cal命令的man page,放在你的主目录下,取名叫cal.man。
2. 只在一行上输入什么样的命令,可以使你从键盘上输入的文本输出到打印机上
3. 怎样把/usr/bin下以c或d开头的文件列表发送到打印机上?
步骤3:练习-答案
1. man cal > cal.man
2. lpr
lpr打印出以后面的参数命名的文件中的内容,如果没有参数,lpr就会从标准输入中读取,标准的输入是键盘,直到你按下ctrl-d表示键盘输入结束。
3.ls -l /usr/bin/[cd]* | lpr
试验10
字符串处理
估计时间: 60分钟
目标: 熟悉字符串处理
试验的起点: 一个Red Hat Linux系统,把/etc/passwd拷贝到你的主目录下。
第一步:字符串处理基本知识
任务:
1..拷贝/etc/passwd到你的主目录下:
$ cd
$ cp /etc/passwd
2. 在/etc/passwd里面有系统里的每一个帐户.使用wc,在passwd文件里计算有多少行。
$ wc -l passwd
在你的系统里有多少个帐户____________
3. 找出本机中所有用户使用的各种shell并把其放置在一个文件内:
$ cut -d: -f7 passwd > shells
4. 使用cat命令查看你新的shells文件的内容,为了使输出结果更为友好.用sort命令输出这些数据在一个新的文件里:
$ sort shells > sorted.shells
5. 你的文件包含许多同样的内容.使用uniq命令可以计算出有多少个相同的行:
$ uniq -c sorted.shells > uniq.sorted.shells
为什么在使用uniq之前要使用sort命令
6. 按照数字由大到小的顺序列出在你的机器上使用的各种shell:
$ sort -nr uniq.sorted.shells
i. /sbin/nologin
6 /bin/bash
1 /sbin/shutdown
1 /sbin/halt
1 /bin/sync
结果:
按照数字由大到小的顺序列出你机器上所有用户使用的各种shell:
步骤2:更多的练习
为每一个练习写下解决办法.记住,答案是一个你想出办法的命令,不是输出.答案在实验的最后被列出来了,但是在对答案之前,你可以试着完成每个任务.每个答案将显示单独的一行.这个命令aspell没有man page;你将怎样获得帮助呢?
7. 有多少文件在/usr/bin目录下?输出是一个单一的整数.提示:设计一个命令列出文件名到每一行,然后计算一共有多少行.
__________________________________________________________
8. 列出下列文件/usr/share/doc/nautilus-*/NEWS中拼错的单词.
__________________________________________________________
12. 多少唯一的单词从上述练习中输出?
__________________________________________________________
步骤2答案:
1 ls -1 /usr/bin | wc -l (注意ls 的参数是数字1)
2 aspell -l < /usr/shar/doc/nautilus-*/NEWS
3 aspell -l < /usr/share/doc/nautilus-*/NEWS | sort | uniq | wc -l
试验11
使用正则表达式进行字符处理
估计时间: 60分钟
目标: 熟悉Red Hat Linux中进行字符处理的几个工具
试验的起点: 安装Red Hat Linux,并且能正常工作,拷贝 /etc/passwd到
你的主目录中
步骤1:使用grep进行字符处理
任务:
1. 在copy到你主目录中的/etc/passwd文件的副本中,使用grep显示出所有以“g”开头的帐户:
2. 显示出所有使用bash shell的帐户:
$ grep ‘bash$’ passwd
3. 显示出没有使用bash作为shell的帐户:
$ grep -v ‘bash$’ passwd
4. 为了做一个使用diff的例子,我们要更改这个passwd文件的拷贝,先用grep把原文件中所有含有“N”和“P”的行删除:
$ grep -v ‘[NP]’ passwd > modified.passwd
5. 最后再用tr将含有的所有大写字母变成小写:
$ tr “A-Z” “a-z” < modified.passwd > modified2.passwd
6. 这时使用cat命令看原来的passwd文件和改过的modified2.passwd文件,不仔细看看不出其中的区别,这只是小文件,如果文件大一些,想象一下拥有几千个用户的文件。使用diff可以产生两个文件中不同之处的列表。
$ diff modified2.passwd passwd
14a15,16
> ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
> nobody:x:99:99:Nobody:/:/sbin/nologin
… …
步骤2:正则表达式及字符处理
在任务下面的横线上写下你的解决方案,你要写出你的命令而不是命令的输出,答案在实验最后,但是要先试着自己解决,可以使用man page来帮助你解决问题。
任务:
1. 使用grep显示出/usr/share/dict/words文件中还有某参数的行,例如显示出所有含有fish的行:
$ grep fish /usr/share/dict/words
blowfish
bluefish
codfish
… output truncated …
unselfish
unselfishly
unselfishness
2. 使用grep的man page作为帮助,输出任何包含fish的所有行,还要输出紧接着这行的上下各两行的内容:
--------------------------------------------------------------------------
3. 使用grep的man page作为帮助,找出相应的命令,来显示出在words文件中有多少行含有fish。
--------------------------------------------------------------------------
4. 使用grep的帮助文件,找出相应的命令,显示出那些行含有fish,并将行号一块输出,看一看starfish在哪行?
--------------------------------------------------------------------------
5. 想列出/usr/share/dict/words中包含先有字母t然后有一个元音字母,之后是sh的单词,命令为:
--------------------------------------------------------------------------
6. 在/usr/share/dict/words文件中,创建可以符合abominable,abominate,anomie和atomize的正则表达式,但是不要选到别的单词。
--------------------------------------------------------------------------
7. 在/usr/share/dict/words文件中包含多少先有字母t然后有一个元音字母,之后是sh的单词,只输出数量。
--------------------------------------------------------------------------
8. 列出/usr/share/dict/words中刚好包含16个字母的单词:
--------------------------------------------------------------------------
9. 我们将要使用/usr/share/doc文件夹来完成我们的下几个任务。
列出/usr/share/doc/bash-2.05b文件夹中,所有包含单词expansion的文件,
--------------------------------------------------------------------------
10. 显示出“Linux”在/usr/share/doc/bash-2.05b文件夹的文件中出现的次数,但是不要显示没有这个单词的文件。提示:先列出所有的文件,然后想如何使输出符合要求:
--------------------------------------------------------------------------
11. 列出所有包含Havoc的文件名:
--------------------------------------------------------------------------
步骤3:使用正则表达进行文本流编辑
任务:
想象你创建一个了名叫“cats”的文件包含以下单词:
cat
catalog
concatenate
polecat
Cat
猜想执行以下每个sed命令之后,把cats文件的每一行的执行后的结果写在后面:
1. sed 's/cat/dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________
2. sed 's/[Cc]at/dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________
3. sed 's/\<[Cc]cat/dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________
4. sed 's/[Cc]at\>/dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________
5. sed 's/\<[Cc]at\>/dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________
6. sed 's/\<[Cc]at\>/& and dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________
7. 创建一个'cats'文件,运行sed命令,测试你的答案。
步骤2的答案:
2.grep -B2 -A2 "fish" /usr/share/dict/words
3.grep -c "fish" /usr/share/dict/words
4.grep -n "fish" /usr/share/dict/words
5.grep "t[aeiou]sh" /usr/share/dict/words
6. "^a.omi.*e$"
或
"\
诀窍是判断哪些字母是变化的哪些是不变的,注意想代替任意个任意字符要使用 “.*”。
7.grep -c "t[aeiou]sh$" /usr/share/dict/words
8.grep "^…………….$" /usr/share/dict/words
或者:
grep -c "^.\{16\}$" /usr/share/dict/words
9.grep -l expansion /usr/share/doc/bash-2.05b/*
10.grep -c "Linux" /usr/share/doc/bash-2.05b/* |grep -v ":0"
11.grep -R -l "Havoc" /usr/share/doc
试验12
进程控制
估计时间: 30分钟
目标: 练习与进程控制有关的不同命令
试验的起点: 安装Red Hat Linux,并且能正常工作,有一个用户名和密
码都为student的用户
步骤1:进程控制
场景描述:
在这个任务中,大家会启用几个进程,然后使用bash的进程控制方法来控制它们。你将会在几个控制台间切换,注意你在哪个控制台上运行命令。
任务:
1. 开始使用student用户在第一、二个控制台(tty1、tty2)上登陆
2. 到tty1上,然后运行以下命令:
$ (while true; do echo -n A >> log; sleep 1;done)
3. 注意这个控制台现在因为在运行你的进程,所以处于忙的状态(进程在前台运行),这个进程不断把字母“A”添加进~/log文件中去,到tty2上运行以下命令:
$ tail -f log
你会看到“A”不断增长
4. 切换回控制台tty1,按下
5. 回到tty1,再次启动进程,运行jobs会显示job[1]在运行了,到tty2上看到文件继续增长了:
$ bg
$ jobs
6. 到tty1上,按向上的箭头,重新找回第二步时的命令,把A换成B,在最后加上&,然后在把B换成C:
$ (while true; do echo -n B >> log; sleep 1;done)
$ ^B^C
7. 输入jobs确认三个进程都在运行,到tty2上看到每秒钟会有三个字母增长。
8. 在第4步你按ctrl-z时,实际上是给进程发一个信号,使用kill命令也可以给它们发信号,使用kill来显示信号列表和标号,然后发一个SIGSTOP(19)的信号给job[1],到tty1上执行:
$ kill -l
$ kill -19 %1
9. 输入jobs,确认job[1]停止,到tty2上看结果是否停止。
10. 用kill重新启动进程,使用SIGCONT(18)信号,你会看到进程又重新启动了。(参考第8步的实现方法)
11. 使用kill命令的SIGTERM(15)信号,也是kill的默认信号,来结束三个进程,先结束job[2]和job[3]时,用jobs来看一下它们的状态是不是terminated的:
$ kill %2 %3
$ jobs
12. 结束最后的进程:
$ fg
$
13. 在tty1上使用jobs命令来看一下,然后在tty2上看是否进程真的结束了,然后按
14. 在tty1上删除 ~/log文件
试验13
用户信息
估计时间: 1小时
目标: 熟练掌握vi的控制操作。
试验的起点: 安装了Red Hat Linux可运行系统,安装vim-common、
vim-minimal、vim-enhanced 的rpm 包
在提示符下键入: vimtutor
你会看到英文的试验教程
第一讲第一节∶移动光标
※※ 要移动光标,请依照说明分别按下 h、j、k、l 键。 ※※
^
k 提示∶ h 的键位于左边,每次按下就会向左移动。
< h l > l 的键位于右边,每次按下就会向右移动。
j j 键看起来很象一支尖端方向朝下的箭头。
v
1. 请随意在屏幕内移动光标,直至您觉得舒服为止。
2. 按下下行键(j),直到出现光标重复下行。
---> 现在您应该已经学会如何移动到下一讲吧。
3. 现在请使用下行键,将光标移动到第二讲。
提示∶如果您不敢确定您所按下的字母,请按下
然后再次从键盘输入您想要的命令。
提示∶光标键应当也能正常工作的。但是使用hjkl键,在习惯之后您就能够快速
地在屏幕内四处移动光标了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲第二节∶VIM的进入和退出
!! 特别提示∶敬请阅读完整本一节的内容,然后才能执行以下所讲解的命令。
1. 请按
2. 然后输入∶ :q! <回车>
---> 这种方式的退出编辑器绝不会保存您进入编辑器以来所做的改动。
如果您想保存更改再退出,请输入∶
:wq <回车>
3. 如果您看到了命令行提示符,请输入能够带您回到本教程的命令,那就是∶
vimtutor <回车>
通常情况下您也可以用这种方式∶
vim tutor <回车>
---> 这里的 'vim' 表示进入vim编辑器,而 'tutor'则是您准备要编辑的文件。
4. 如果您自信已经牢牢记住了这些步骤的话,请从步骤1执行到步骤3退出,然
后再次进入编辑器。接著将光标移动到第一讲第三节来继续我们的教程讲解。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲第三节∶文本编辑之删除
** 在正常(Normal)模式下,可以按下 x 键来删除光标所在位置的字符。**
1. 请将光标移动到本节中下面标记有 ---> 的那一行。
2. 为了修正输入错误,请将光标移至准备删除的字符的位置处。
3. 然后按下 x 键将错误字符删除掉。
4. 重复步骤2到步骤4,直到句子修正为止。
---> The ccow jumpedd ovverr thhe mooon.
5. 好了,该行已经修正了,下一节内容是第一讲第四节。
特别提示∶在您浏览本教程时,不要强行记忆。记住一点∶在使用中学习。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲第四节∶文本编辑之插入
** 在正常模式下,可以按下 i 键来插入文本。**
1. 请将光标移动到本节中下面标记有 ---> 的第一行。
2. 为了使得第一行内容雷同于第二行,请将光标移至文本第一个字符准备插入
的位置。
3. 然后按下 i 键,接著输入必要的文本字符。
4. 所有文本都修正完毕,请按下
重复步骤2至步骤4以便修正句子。
---> There is text misng this .
---> There is some text missing from this line.
5. 如果您对文本插入操作已经很满意,请接著阅读下面的小结。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲小结
1. 光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键。
h (左移) j (下行) k (上行) l (右移)
2. 欲进入vim编辑器(从命令行提示符),请输入∶vim 文件名 <回车>
3. 欲退出vim编辑器,请输入以下命令放弃所有修改∶
或者输入以下命令保存所有修改∶
4. 在正常模式下删除光标所在位置的字符,请按∶ x
5. 在正常模式下要在光标所在位置开始插入文本,请按∶
i 输入必要文本
特别提示∶按下
的命令。
好了,第一讲到此结束。下面接下来继续第二讲的内容。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第一节∶删除类命令
** 输入 dw 可以从光标处删除至一个单字/单词的末尾。**
1. 请按下
2. 请将光标移动到本节中下面标记有 ---> 的那一行。
3. 请将光标移至准备要删除的单词的开始。
4. 接著输入 dw 删除掉该单词。
特别提示∶您所输入的 dw 会在您输入的同时出现在屏幕的最后一行。如果您输
入有误,请按下
---> There are a some words fun that don't belong paper in this sentence.
5. 重复步骤3至步骤4,直至句子修正完毕。接著继续第二讲第二节内容。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第二节∶其他删除类命令
** 输入 d$ 从当前光标删除到行末。**
1. 请按下
2. 请将光标移动到本节中下面标记有 ---> 的那一行。
3. 请将光标移动到该行的尾部(也就是在第一个点号‘.’后面)。
4. 然后输入 d$ 从光标处删至当前行尾部。
---> Somebody typed the end of this line twice. end of this line twice.
5. 请继续学习第二讲第三节就知道是怎么回事了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第三节∶关于命令和对象
删除命令 d 的格式如下∶
[number] d object 或者 d [number] object
其意如下∶
number - 代表执行命令的次数(可选项,缺省设置为 1 )。
d - 代表删除。
object - 代表命令所要操作的对象(下面有相关介绍)。
一个简短的对象列表∶
w - 从当前光标当前位置直到单字/单词末尾,包括空格。
e - 从当前光标当前位置直到单字/单词末尾,但是 *不* 包括空格。
$ - 从当前光标当前位置直到当前行末。
特别提示∶
对于勇于探索者,请在正常模式下面仅按代表相应对象的键而不使用命令,则
将看到光标的移动正如上面的对象列表所代表的一样。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第四节∶对象命令的特殊情况
** 输入 dd 可以删除整一个当前行。 **
鉴于整行删除的高频度,VIM 的设计者决定要简化整行删除,仅需要在同一行上
击打两次 d 就可以删除掉光标所在的整行了。
1. 请将光标移动到本节中下面的短句段落中的第二行。
2. 输入 dd 删除该行。
3. 然后移动到第四行。
4. 接著输入 2dd (还记得前面讲过的 number-command-object 吗?) 删除两行。
1) Roses are red,
2) Mud is fun,
3) Violets are blue,
4) I have a car,
5) Clocks tell time,
6) Sugar is sweet
7) And so are you.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第五节∶撤消类命令
** 输入 u 来撤消最后执行的命令,输入 U 来修正整行。**
1. 请将光标移动到本节中下面标记有 ---> 的那一行,并将其置于第一个错误
处。
2. 输入 x 删除第一个不想保留的字母。
3. 然后输入 u 撤消最后执行的(一次)命令。
4. 这次要使用 x 修正本行的所有错误。
5. 现在输入一个大写的 U ,恢复到该行的原始状态。
6. 接著多次输入 u 以撤消 U 以及更前的命令。
7. 然后多次输入 CTRL-R (先按下 CTRL 键不放开,接著输入 R 键) ,这样就
可以执行恢复命令,也就是撤消掉撤消命令。
---> Fiix the errors oon thhis line and reeplace them witth undo.
8. 这些都是非常有用的命令。下面是第二讲的小结了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲小结
1. 欲从当前光标删除至单字/单词末尾,请输入∶dw
2. 欲从当前光标删除至当前行末尾,请输入∶d$
3. 欲删除整行,请输入∶dd
4. 在正常模式下一个命令的格式是∶
[number] command object 或者 command [number] object
其意是∶
number - 代表的是命令执行的次数
command - 代表要做的事情,比如 d 代表删除
object - 代表要操作的对象,比如 w 代表单字/单词,$ 代表到行末等等。
$ (to the end of line), etc.
5. 欲撤消以前的操作,请输入∶u (小写的u)
欲撤消在一行中所做的改动,请输入∶U (大写的U)
欲撤消以前的撤消命令,恢复以前的操作结果,请输入∶CTRL-R
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲第一节∶置入类命令
** 输入 p 将最后一次删除的内容置入光标之后 **
1. 请将光标移动到本节中下面示范段落的首行。
2. 输入 dd 将该行删除,这样会将该行保存到vim的缓冲区中。
3. 接著将光标移动到准备置入的位置的上方。记住∶是上方哦。
4. 然后在正常模式下(
5. 重复步骤2至步骤4,将所有的行依序放置到正确的位置上。
d) Can you learn too?
b) Violets are blue,
c) Intelligence is learned,
a) Roses are red,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲第二节∶替换类命令
** 输入 r 和一个字符替换光标所在位置的字符。**
1. 请将光标移动到本节中下面标记有 ---> 的第一行。
2. 请移动光标到第一个错误的适当位置。
3. 接著输入 r ,这样就能将错误替换掉了。
4. 重复步骤2和步骤3,知道第一行是已经修改完毕。
---> Whan this lime was tuoed in, someone presswd some wrojg keys!
---> When this line was typed in, someone pressed some wrong keys!
5. 然后我们继续学校第三讲第三节。
特别提示∶切记您要在使用中学习,而不是在记忆中学习。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲第三节∶更改类命令
** 要改变一个单字/单词的部分或者全部,请输入 cw **
1. 请将光标移动到本节中下面标记有 ---> 的第一行。
2. 接著把光标放在单词 lubw 的字母 u 的位置那里。
3. 然后输入 cw 就可以修正该单词了(在本例这里是输入 ine 。)
4. 最后按
5. 重复步骤3和步骤4,知道第一个句子完全雷同第二个句子。
---> This lubw has a few wptfd that mrrf changing usf the change command.
---> This line has a few words that need changing using the change command.
提示∶请注意 cw 命令不仅仅是替换了一个单词,也让您进入文本插入状态了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲第四节∶使用c指令的其他更改类命令
** 更改类指令可以使用同删除类命令所使用的对象参数。**
1. 更改类指令的工作方式跟删除类命令是一致的。操作格式是∶
[number] c object 或者 c [number] object
2. 对象参数也是一样的,比如 w 代表单字/单词,$代表行末等等。
3. 请将光标移动到本节中下面标记有 ---> 的第一行。
4. 接著将光标移动到第一个错误处。
5. 然后输入 c$ 使得该行剩下的部分更正得同第二行一样。最后按
---> The end of this line needs some help to make it like the second.
---> The end of this line needs to be corrected using the c$ command.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲小结
1. 要重新置入已经删除的文本内容,请输入小写字母 p。该操作可以将已删除
的文本内容置于光标之后。如果最后一次删除的是一个整行,那么该行将置
于当前光标所在行的下一行。
2. 要替换光标所在位置的字符,请输入小写的 r 和要替换掉原位置字符的新字
符即可。
3. 更改类命令允许您改变指定的对象,从当前光标所在位置直到对象的末尾。
比如输入 cw 可以替换当前光标到单词的末尾的内容;输入 c$ 可以替换当
前光标到行末的内容。
4. 更改类命令的格式是∶
[number] c object 或者 c [number] object
下面我们继续学习下一讲。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲第一节∶定位及文件状态
** 输入 CTRL-g 显示当前编辑文件中当前光标所在行位置以及文件状态信息。
输入 SHIFT-G 则直接跳转到文件中的某一指定行。**
提示∶切记要先通读本节内容,之后才可以执行以下步骤!!!
1. 按下 CTRL 键不放开然后按 g 键。然后就会看到页面最底部出现一个状态信
息行,显示的内容是当前编辑的文件名和文件的总行数。请记住步骤3的行号。
2. 按下 SHIFT-G 键可以使得当前光标直接跳转到文件最后一行。
3. 输入您曾停留的行号,然后按下 SHIFT-G。这样就可以返回到您第一次按下
CTRL-g 时所在的行好了。注意∶输入行号时,行号是不会在屏幕上显示出来
的。
4. 如果愿意,您可以继续执行步骤1至步骤三。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲第二节∶搜索类命令
** 输入 / 以及尾随的字符串可以用以在当前文件中查找该字符串。**
1. 在正常模式下输入 / 字符。您此时会注意到该字符和光标都会出现在屏幕底
部,这跟 : 命令是一样的。
2. 接著输入 errroor <回车>。那个errroor就是您要查找的字符串。
3. 要查找同上一次的字符串,只需要按 n 键。要向相反方向查找同上一次的字
符串,请输入 Shift-N 即可。
4. 如果您想逆向查找字符串,请使用 ? 代替 / 进行。
---> When the search reaches the end of the file it will continue at the start.
"errroor" is not the way to spell error; errroor is an error.
提示∶如果查找已经到达文件末尾,查找会自动从文件头部继续查找。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲第三节∶配对括号的查找
** 按 % 可以查找配对的括号 )、]、}。**
1. 把光标放在本节下面标记有 --> 那一行中的任何一个 (、[ 或 { 处。
2. 接著按 % 字符。
3. 此时光标的位置应当是在配对的括号处。
4. 再次按 % 就可以跳回配对的第一个括号处。
---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
提示∶在程序调试时,这个功能用来查找不配对的括号是很有用的。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲第四节∶修正错误的方法之一
** 输入 :s/old/new/g 可以替换 old 为 new。**
1. 请将光标移动到本节中下面标记有 ---> 的那一行。
2. 输入 :s/thee/the <回车> 。请注意该命令只改变光标所在行的第一个匹配
串。
3. 输入 :s/thee/the/g 则是替换全行的匹配串。
---> the best time to see thee flowers is in thee spring.
4. 要替换两行之间出现的每个匹配串,请输入 :#,#s/old/new/g (#,#代表的是
两行的行号)。输入 :%s/old/new/g 则是替换整个文件中的每个匹配串。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲小结
1. Ctrl-g 用于显示当前光标所在位置和文件状态信息。Shift-G 用于将光标跳
转至文件最后一行。先敲入一个行号然后按 Shift-G 则是将光标移动至该行
号代表的行。
2. 输入 / 然后紧随一个字符串是则是在当前所编辑的文档中向后查找该字符串。
输入问号 ? 然后紧随一个字符串是则是在当前所编辑的文档中向前查找该字
符串。完成一次查找之后按 n 键则是重复上一次的命令,可在同一方向上查
找下一个字符串所在;或者按 Shift-N 向相反方向查找下该字符串所在。
3. 如果光标当前位置是括号(、)、[、]、{、},按 % 可以将光标移动到配对的
括号上。
4. 在一行内替换头一个字符串 old 为新的字符串 new,请输入 :s/old/new
在一行内替换所有的字符串 old 为新的字符串 new,请输入 :s/old/new/g
在两行内替换所有的字符串 old 为新的字符串 new,请输入 :#,#s/old/new/g
在文件内替换所有的字符串 old 为新的字符串 new,请输入 :%s/old/new/g
进行全文替换时询问用户确认每个替换需添加 c 选项,请输入 :%s/old/new/gc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲第一节∶在 VIM 内执行外部命令的方法
** 输入 :! 然后紧随著输入一个外部命令可以执行该外部命令。**
1. 按下我们所熟悉的 : 命令设置光标到屏幕底部。这样就可以让您输入命令了。
2. 接著输入感叹号 ! 这个字符,这样就允许您执行外部的 shell 命令了。
3. 我们以 ls 命令为例。输入 !ls <回车> 。该命令就会列举出您当前目录的
内容,就如同您在命令行提示符下输入 ls 命令的结果一样。如果 !ls 没起
作用,您可以试试 :!dir 看看。
---> 提示∶ 所有的外部命令都可以以这种方式执行。
---> 提示∶ 所有的 : 命令都必须以 <回车> 告终。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲第二节∶关于保存文件的更多信息
** 要将对文件的改动保存到文件中,请输入 :w FILENAME 。**
1. 输入 :!dir 或者 :!ls 获知当前目录的内容。您应当已知道最后还得敲
<回车> 吧。
2. 选择一个尚未存在文件名,比如 TEST 。
3. 接著输入 :w TEST (此处 TEST 是您所选择的文件名。)
4. 该命令会以 TEST 为文件名保存整个文件 (VIM 教程)。为了确保正确保存,
请再次输入 :!dir 查看您的目录列表内容。
---> 请注意∶如果您退出 VIM 然后在以文件名 TEST 为参数进入,那么该文件内
容应该同您保存时的文件内容是完全一样的。
5. 现在您可以通过输入 :!rm TEST 来删除 TEST 文件了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲第三节∶一个具有选择性的保存命令
** 要保存文件的部分内容,请输入 :#,# w FILENAME **
1. 再来执行一次 :!dir 或者 :!ls 获知当前目录的内容,然后选择一个合适的
不重名的文件名,比如 TEST 。
2. 接著将光标移动至本页的最顶端,然后按 CTRL-g 找到该行的行号。别忘了
行号哦。
3. 接著把光标移动至本页的最底端,再按一次 CTRL-g 。也别忘了这个行好哦。
4. 为了只保存文章的某个部分,请输入 :#,# w TEST 。这里的 #,# 就是上面
要求您记住的行号(顶端行号,底端行号),而 TEST 就是选定的文件名。
5. 最后,用 :!dir 确认文件是否正确保存。但是这次先别删除掉。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲第四节∶提取和合并文件
** 要向当前文件中插入另外的文件的内容,请输入 :r FILENAME **
1. 请键入 :!dir 确认您前面创建的 TEST 文件还在。
2. 然后将光标移动至当前页面的顶端。
特别提示∶ 执行步骤3之后您将看到第五讲第三节,请届时再往下移动回到这里来。
3. 接著通过 :r TEST 将前面创建的名为 TEST 的文件提取进来。
特别提示∶您所提取进来的文件将从光标所在位置处开始置入。
4. 为了确认文件已经提取成功,移动光标回到原来的位置就可以注意有两份第
五讲第三节,一份是原本,另外一份是来自文件的副本。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲小结
1. :!command 用于执行一个外部命令 command。
请看一些实际例子∶
:!dir - 用于显示当前目录的内容。
:!rm FILENAME - 用于删除名为 FILENAME 的文件。
2. :w FILENAME 可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文
件中。
3. :#,#w FILENAME 可将当前编辑文件第 # 行至第 # 行的内容保存到文件
FILENAME 中。
4. :r FILENAME 可提取磁盘文件 FILENAME 并将其插入到当前文件的光标位置
后面。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲第一节∶打开类命令
** 输入 o 将在光标的下方打开新的一行并进入插入模式。**
1. 请将光标移动到本节中下面标记有 ---> 的那一行。
2. 接著输入小写的 o 在光标 *下方* 打开新的一行并进入插入模式。
3. 然后复制标记有 ---> 的行并按
---> After typing o the cursor is placed on the open line in Insert mode.
4. 为了在光标 *上方* 打开新的一行,只需要输入大写的 O 而不是小写的 o
就可以了。请在下行测试一下吧。当光标处在在该行上时,按 Shift-O可以
在该行上方新开一行。
Open up a line above this by typing Shift-O while the cursor is on this line.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲第二节∶光标后插入类命令
** 输入 a 将可在光标之后插入文本。 **
1. 请在正常模式下通过输入 $ 将光标移动到本节中下面标记有 ---> 的第一行
的末尾。
2. 接著输入小写的 a 则可在光标之后插入文本了。大写的 A 则可以直接在行
末插入文本。
提示∶输入大写 A 的操作方法可以在行末插入文本,避免了输入 i,光标定位到
最后一个字符,输入的文本,
x 删除当前光标所在位置字符等等诸多繁杂的操作。
3. 操作之后第一行就可以补充完整了。请注意光标后插入文本与插入模式是基
本完全一致的,只是文本插入的位置定位稍有不同罢了。
---> This line will allow you to practice
---> This line will allow you to practice appending text to the end of a line.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲第三节∶另外一个置换类命令的版本
** 输入大写的 R 可连续替换多个字符。**
1. 请将光标移动到本节中下面标记有 ---> 的第一行。
2. 移动光标到第一行中不同于标有 ---> 的第二行的第一个单词的开始,即单
词 last 处。
3. 然后输入大写的 R 开始把第一行中的不同于第二行的剩余字符逐一输入,就
可以全部替换掉原有的字符而使得第一行完全雷同第二行了。
---> To make the first line the same as the last on this page use the keys.
---> To make the first line the same as the second, type R and the new text.
4. 请注意∶如果您按
然保持原状。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲第四节∶设置类命令的选项
** 设置可使查找或者替换可忽略大小写的选项 **
1. 要查找单词 ignore 可在正常模式下输入 /ignore 。要重复查找该词,可以
重复按 n 键。
2. 然后设置 ic 选项(ic就是英文忽略大小写Ignore Case的首字母缩写词),即
输入∶
:set ic
3. 现在可以通过键入 n 键再次查找单词 ignore。重复查找可以重复键入 n 键。
4. 然后设置 hlsearch 和 incsearch 这两个选项,输入以下内容∶
:set hls is
5. 现在可以再次输入查找命令,看看会有什么效果∶
/ignore
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲小结
1. 输入小写的 o 可以在光标下方打开新的一行并将光标置于新开的行首,进入
插入模式。
输入大写的 O 可以在光标上方打开新的一行并将光标置于新开的行首,进入
插入模式。
2. 输入小写的 a 可以在光标所在位置之后插入文本。
输入大写的 A 可以在光标所在行的行末之后插入文本。
3. 输入大写的 R 将进入替换模式,直至按
模式。
4. 输入 :set xxx 可以设置 xxx 选项。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第七讲∶在线帮助命令
** 使用在线帮助系统 **
Vim 拥有一个细致全面的在线帮助系统。要启动该帮助系统,请选择如下三种方
法之一∶
- 按下
- 按下
- 输入 :help <回车>
输入 :q <回车> 可以关闭帮助窗口。
提供一个正确的参数给":help"命令,您可以找到关于该主题的帮助。请试验以
下参数(可别忘了按回车键哦。:)∶
:help w <回车>
:help c_
:help insert-index <回车>
:help user-manual <回车>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第八讲∶创建一个启动脚本
** 启用vim的功能 **
Vim的功能特性要比vi多得多,但大部分功能都没有缺省激活。为了启动更多的
功能,您得创建一个vimrc文件。
1. 开始编辑vimrc文件,这取决于您所使用的操作系统∶
:edit ~/.vimrc 这是Unix系统所使用的命令
:edit $VIM/_vimrc 这是Windows系统所使用的命令
2. 接着导入vimrc范例文件∶
:read $VIMRUNTIME/vimrc_example.vim
3. 保存文件,命令为∶
:write
在下次您启动vim的时候,编辑器就会有了语法高亮的功能。
UNIT 16 Lab
基本网络客户
目标:使用工具在本地和远程计算机传输文件。
实验1 使用lftp
1. 使用ping测试连通性: ping -c 3 stationxx
2. 使用lftp连接到远程计算机
cd
lftp stationxx
cd pub
ls
get getme
exit
3. 检查并修改得到的软件
cat getme
pico getme 存为 getme.xy
cat getme.xy
4. 使用lftp把文件传到用户目录
lftp -u student stationxx
put getme.xy
exit
实验2: 加密通讯 ssh套件
1. 复制getme.xy。
cd
cp getme.bd getme.bd.secure
2. scp getme.bd.secure student@stationxx
3. ssh student@stationxx
实验3: 和远程计算机同步文件
1. cd
rsync - - rsh=ssh student@stationxx:get* .
ls getme*
UNIT 17 Lab
系统工具
实验1:at
1. 使用以下命令在5分钟后执行任务
at now + 5 min
2. 输入以下命令
echo “ This message was automtically sent via the at facility.”
3. 使用ctrl-d 结束命令输入。at将显示任务执行的时间
4. 确认任务已经排序
5. 检查邮件。确认工作完成了
实验2 使用rpm检查包和文件的情况
1. 使用rpm列出安装的包
rpm -qa | less
2. 检查安装了多少个包
rpm -qa | wc -l
3. 检查哪个包提供了vimtutor文件
rpm -qf `which vimtutor`
4. 列出coreutils 提供的文件和相关信息
rpm -qil coreutils
最后,感谢Iknownothing和Sherrie! 还有我的Mandy!
奉献Red Hat Linux 133 实验翻译(KevinZ)
###请转贴时保留以下内容######
Red Hat Linux 133 实验部分
应广大RH爱好者的要求,奉献Red Hat Linux 133 实验翻译
请提出宝贵意见Mail:kissingwolf@hotmail.com
KevinZ(kissingwolf)
2004.1.4
#############################
Lab1 硬件和安装
步骤一:准备计算机
任务: 使用Red Hat Linux光盘启动系统
在启动时进入BIOS界面
设置系统启动顺序为A,CDROM,C
修改其他任何推荐的设置
保存并退出BIOS设置
步骤二:使用Anaconda(图形模式)安装Red Hat Linux
任务: 按照以下要求从光盘安装Red Hat Linux。注意,要初始化图形安装界面可能需要等待一两分钟。
l 使用检测到的鼠标配置(除非老师另有指定)
l 选择全新安装
l 使用定制安装选项
l 选择使用Disk Druid手动分区,删除所有原有的分区
l 使用以下分区方案:
n /boot 100M
n / 256M
n /usr 1000M
n swap 512M
n /var 400M
l 格式化所有分区,但是不选择检查坏块
l 使用默认的启动加载器设置(除非老师另有指定),不创建启动加载器密码
l 为网络设置选择DHCP,选择启动时激活
l 使用默认防火墙配置
l 选择适当的语言支持
l 设置对应的时区,根据老师的指示设置UTC
l 设置根密码为redhat
l 启用MD5和shaow密码模式(默认验证设置)
l 选择安装X window,不选任何其他组件
l 切换到tty5查看文件系统格式化的过程(使用Ctrl-Alt-5,用Alt-7切换回安装向导)
l 创建启动软盘可选
l 使用检测到的显示器和图形卡设置(除非老师另有指定)
l 配置使用图形界面登录
l 在安装结束后重启,完成初始化设置,不注册Red Hat Network
安装结束后启动系统,以root帐号登录,并检查以下文件:
l /var/log/messages
l /var/log/dmesg
以上安装的系统使用twm视窗管理器。通过后续的实验,我们将安装更多的软件包,实现功能的扩展和界面的美观
步骤三:使用NFS,FTP或HTTP安装Red Hat Linux
任务: 破坏现有的系统,重新安装Red Hat Linux。事先准备安装光盘1或从老师那里得到启动的介质。
破坏现有系统:
cat /var/log/messages > /dev/hda; reboot
cat /var/log/messages > /dev/sda; reboot
重启后使用启动介质启动,按照以下要求安装(由于已经覆盖了分区表,系统将警告没有找到分区表,必须重新初始化)
1. 使用CD启动
2. 在boot提示下回车
3. 选择对应的语言(English)
4. 在OK提示下回车
5. 选择对应的键盘(US)
6. 在OK提示下回车
7. 选择对应的安装方式(NFS镜像,FTP,HTTP)
8. 配置TCP/IP,选择“使用动态IP配置(BOOTP/DHCP)”
9. 在OK提示下回车
10. 根据选择的安装方式输入对应的信息:
FTP方式
FTP站点名称:192.168.0.254
Red Hat目录:pub/
HTTP方式
Web站点名称:192.168.0.254
Red Hat目录:pub/
NFS方式
NFS服务器名:192.168.0.254
NFS加载点:/var/ftp/pub
11. 这时Anaconda会读取安装镜像并检测显示器和鼠标的类型,显示欢迎界面
12. 选择定制安装
13. 使用diskdruid分区。使用以下分区方案:
/boot 100M
/ 2000M
swap 512M
/home 3 × 256M RAID0
14. 启动加载器,时区,图形,防火墙和验证方式都是用默认设置,除非教师指定
15. 设置适当的语言
16. 设置root密码为redhat
17. 安装默认的软件包
*指南中的分区方案非常重要,否则可能出现意料外的结果。
Lab2 Linux文件系统
目标:熟悉文件系统相关知识和技能
步骤一:创建和加载文件系统
任务:
1. 使用fdisk -l 得到ev/hda的分区尺寸信息。计算硬盘上没有分区的空间尺寸
2. 使用fdisk新增一个512M的逻辑分区(使用w命令将改动写入磁盘)。这个新分区的设备名是/dev/had_ ?为什么?
3. 重启以确定改动后的分区表被读入
4. 使用mke2fs,在新建的分区上创建一个新的ext2文件系统。创建时使用2k的块,每4k一个inode的设置。可能需要查看mke2fs的man page
5. 创建目录/data,作为该文件系统的加载点
6. 使用mount命令把新文件系统加载到/data。把/etc/passwd复制到/data,检查确认复制成功
7. Umount /data
8. 使用e2label为新分区指定卷标:
e2label /dev/hdax /data x是新创建分区的序号
9. 在/etc/fstab文件中为加载/data加入以下行:
LABEL=/data /data ext2 defaults 1 2
或者
/dev/hdax /data ext2 defaults 1 2
以上两行的实际效果相同。但是,如果更换了硬盘的总线或者是更改了主从的顺序,在fstab中使用卷标仍然可以定位这个设备
10. 加载新的分区
mount /data
11. 复制文件或使用touch 创建文件
步骤二:把ext2转换为ext3
1. 键入sync。这个命令把磁盘缓存信息写入磁盘。通常这个命令是定期执行的,但是以下步骤可能会先占自动同步。
2. 使用reset键重启动,或者使用电源开关关闭再打开(正常情况下不要这样)
3. 如果出现“Repair filesystem”的提示,尝试使用e2fsck /dev/hdx 修复文件系统
4. 成功启动后,通过创建journaling inode日志把ext2文件系统转换为ext3。因为ext3 的数据完整性和文件系统完整性大大增强了,所以可以 把自动预加载(pre-mount)基于时间的定期文件系统检查。
Tune2fs -j -c 0 -i 0 /dev/
5. 检查文件系统的characteristics
tune2fs -l /dev/
6. 编辑/etc/fstab /data的相关行,把文件系统由etx2更改为ext3
7. 卸载并用ext3重新加载文件系统,确认使用了ext3:
umount /data ; mount /data
df -T /data
8.确认/boot下初始的虚拟盘镜像中包含了必要的ext3模块和jbd日志模块。如果/data是你的机器上的第一个ext3文件系统,很可能 initrd中并不包含这些模块。这种情况只当我们需要ext3的支持而在initrd中又不包括相关的模块时非常重要。假设出现了这种情况,我们可以制作一个/boot/initrd-
mkinitrd -f -v /boot/initrd-$(uname -r).img $(uname -r)
9. 键入sync,然后手动重启动系统。
10. 观察启动过程。系统检查了哪个文件系统?在/data文件系统,是否看到了“recovering journal”提示信息?当不正常重启时,使用ext3的日志恢复是否比ext2的fsck快了?
步骤三:使用autofs自动加载系统
1. 确认iptables已经关闭
2. 编辑/etc/auto.master文件,去掉对/misc一行的注释
3. 在/etc/auto.misc文件中增加一行,用于加载server1.example.com的/var/ftp/pub目录到本机的目的/server1. 可以参考ftp.example.com行的示例.
4. 重启autofs服务 service autofs restart
5. 测试/misc/server1目录
Lab 3 管理启动
目标: 定制系统服务的技巧
步骤一: 使用chkconfig禁用服务
1. 使用chkconfig检查系统服务的状态: chkconfig --list
2. 使用以下示例将isdn在所有runlevel关闭
chkconfig --del
3. 使用--help 查看chkconfig语法信息 chkconfig --help. 关闭runlevel3和runlevel5的kudzu服务
4. 观察 on 和 --add 的差异, off 和 --de 的差异
chkconfig isdn --list
chkconfig isdn on
chkconfig isdn --list
chkconfig isdn off
chkconfig isdn --list
chkconfig isdn --del
chkconfig isdn --list
chkconfig isdn --add
chkconfig isdn --list
5. 使用chkconfig查看系统服务的状态和改变状态
步骤二: 更改系统登录标题
1. 我们将设置rc.local脚本用于每次重启时出现登录标题. 打开/etc/rc.local文件找到以下行:
touch /var/lock/subsys/local
2. 在后面插入以下行:
echo “ Welcome to \n” > /etc/issue
echo “All access to this computer is monitored” >> /etc/issue
echo “Unauthorized access is prohibited” >> /etc/issue
echo >> /etc/issue
echo “Last reboot complete at $(/bin/date)” >> /etc/issue
3. 保存文件,把/etc/issue复制为/etc/issue.orig
4. 重启动系统
5. 当系统启动后,切换到虚拟控制台确认登录标题出现了. 打开/etc/issue, 注意mingetty把\n扩展为你的主机名
步骤三: 更改默认runlevel
1. 编辑/etc/inittab文件,将默认runlevel从5改为3,如下:
id:3:initdefault:
2. 重启动系统.发生了什么?
3. 把默认runlevel改为5,重启动系统
步骤四: 增加当天的消息
1. 编辑/etc/motd文件,默认应为空. 增加以下行:
##################################
# Welcome to station xx #
##################################
Expect frequent system downtime.
2. 切换到虚拟控制台登录.
Lab 4 用户和组管理
目标: 用户和组管理的技巧
步骤一: 创建用户和组
1. 使用useradd命令,为以下用户创建帐号:Joshua, alex, dax, bryan, zak, ed, manager. 为每个用户设置一个密码.
2. 使用groupadd命令,增加以下组: 并使用 -g 选项设定对应的GID
group gid
sales 10000
hr 10001
web 10002
为什么不用系统默认的gid?
3. 使用usermod命令把joshua和alex增加到sales组, dax和bryan到hr组, zak和ed到web组. 把manager加入所有组. 使用 -G选项.
4. 用各帐户登录,使用id命令确认组成员身份. 还有什么方法可以确认?
步骤二: 设置共享文件夹
1. 创建/depts目录,在目录下创建sales, hr, web文件夹
mkdir -p /depts./{sales,hr,web}
2. 使用chgrp命令设置对应组拥有对应文件夹
chgrp sales /depts/sales
3. 设置/depts目录的权限为755, 子文件夹的权限为770
4. 设置各部门的子文件夹的sgid, 使得创建的文件所有权为对应的组
shmod g+s /depts/sales
5. 使用各个帐号登录,并在对应位置创建文件,检查效果.只有manager可以进入所有的目录.也可以使用su -命令,但是要加上-,并且su下一个帐户之前要退出前一个帐户.
步骤三: 设置磁盘配额
1. 创建名为filehog的帐户,并设置用户在/home目录有60个inode的软限制和100个inode的硬限制. 使用以下命令测试, 要使用su - 命令,否则会失败.
su - filehog
quota
for I in $(seq 1 100); do echo -n “file$(i)”; touch file$(i) 2 >&1; done | less
quota
quota命令会报告当前的限制和已经使用的inode. 使用循环的目的是创建100个文件. 因为当创建用户filehog的时候需要从/etc/skel复制一些文件,所以创建100个文件的命令将不会成功.
如果quota设置成功,你会看到一系列反馈的数字直到达到软限制的数目. 超过限制后,会看到一个警告,但是命令仍然能够执行.达到硬限制后,将得到出错信息,而且不能再创建任何文件. 可以用
2. 创建一个名为diskhog的用户, 设置用户在/home目录的软限制为4MB, 硬限制为5MB,使用以下命令测试
su - diskhog
quota
dd if=/dev/zero of=bigfile count=3 #将成功
dd if=/dev/zero of=bigfile count=4 #将成功
dd if=/dev/zero of=bigfile count=5 #将失败
观察quota命令的输出. 注意当超出inode软限制和block软限制的输出差别.达到inode软限制时用户得到警告,而达到block软限制时是不同的.
步骤四: 客户端NIS
1. 使用authconfig配置系统为NIS客户. 设置notexample为NIS域名, 服务器为192.168.0.254
2. 试用guest200x为帐号从虚拟控制台登录, x为座位编号.发生了什么? 如果登录失败,检查设置.如果还有问题,确认教师机的设置正确.当验证成功后,你将看到shell的目录为/. 因为没有在本地创建帐号,所以没有主目录. 当用户帐户使用目录服务的时候会出现这种情况,无论是NIS,LDAP还是SMB
3. 使用autofs解决主目录问题.用户主目录位于server1.example.com,我们可以加载基于NFS的共享来提供用户环境.首先编辑/etc/auto.master,增加以下行
/home/guests /etc/auto.guests --timeout=60
这条记录告诉自动加载器(内核模块之一)/home/guests由它控制.所有相关的加载设置保存在/etc/auto.guests文件中,而且如果60秒内没有活动就自动卸载.
4. 创建并编辑/etc/auto.guests文件.增加以下行:
* -rw, soft, intr 192.168.0.254:/home/guests/&
这条记录指明在目录下的所有子目录都配置为从192.168.0.254:/home/guests下的相应目录加载,并且设为:读写,如果加载不成功就返回超时,并且在加载不可用时仍允许进程访问文件.
5. 配置autofs在runlevel3,4,5时运行,并手动启动:
chkconfig autofs on
service autofs start
6. 登录并查看是否主目录自动加载.可以试验登录到附近的其他机器.你将可以在notexample域内的任何一台机器上获得自己的用户环境.
7. 在自己的机器上以root登录,,使用su -guest200x.是否提示输入密码? 这意味着本地root帐号和NIS域之间是什么关系?
配额方案:
1. 编辑/etc/fstab, 用usrquota代替defaults, 然后执行 mount -o remount /home
2. 创建一个用于保存用户配额的数据库(-c 可以在第一次运行quotacheck时隐藏警告)
touch /home/aquots.user
quotacheck -c /home
3. 打开内核强制配额
quotaon /home
4. 设置EDITOR变量为你希望的文本编辑器
5. edquota filehog 设置硬节点限制为100,软节点限制为60
6. edquota diskhog 设置软块限制为4096,硬块限制为5120
Lab 5 静态网络设置
目标: 手动配置网络设置的技巧
步骤一: 设置IP地址
1. 使用ifdown命令关闭网卡
ifdown eth0
2. 用文本编辑器打开/etc/sysconfig/network-scripts/ifcfg-eth0, 按以下内容更改(x为你的座位号)
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.0.x
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
3. 查看/etc/resolv.conf的内容.里面应该包含从DHCP服务器得到的设置.如果没有.改为以下设置:
search example.com
nameserver 192.168.0.254
4. 使用ifup启动配置好的网卡
ifup eth0
5. 使用ping server1 确认网络配置
6. 重启动系统,使用ping server1 确认网络配置
Lab 6 系统管理工具
目标: 掌握系统管理工具的使用以及对CUPS的管理
步骤一: 使用at和cron
1. 设置一个提示,提醒今天中午12:00去吃午餐. 在root提示符下.使用以下命令:
at noon; (回车)
echo “Time for lunch with Joe.” (回车)
2. 使用atq命令检查任务队列,确认
3. 使用at命令在5分钟后运行 df -k命令
4. 设置今天每10分钟检查一次系统状态用于检查性能问题.你怀疑时内存或者IO问题,所以要进行相关的监控. 使用root帐户,并使用crontab -e 命令编辑cron文件
5. 在文件种加入以下行:
*/10 8-17 * * * /usr/bin/free; /usr/bin/iostat
6. 如何把来自cron的输出到一个邮件地址?
7. 以root身份使用pine,mail或mutt检查使用受到了来自at和cron任务的邮件
8. 成功后删除cron任务
步骤二: 日志记录到一个集中的位置
这个实验需要和相邻计算机的配合.
1. 首先设置syslogd接受远程消息. 编辑/etc/sysconfig/syslog文件:
SYSLOGD_OPTIONS=”-R -M 0”
2. 重启动syslogd:
service syslog restart
3. 设置syslogd把消息发向远程机器: 在/etc/syslog.conf文件种增加以下行:
user.* @stationx
4. 重启动syslogd:
service syslog restart
5. 使用logger命令生成syslog消息,测试设置:
logger -i -t yourname “this is a test”
这条消息是否出现在相邻机器的/var/log/messages文件中?
步骤三: 使用dump/restore恢复单个文件
1. 准备用dump备份/boot目录下的文件. 使用df /boot查看/boot所在的设备(以下假设为/dev/hda1)
2. 首先确认备份需要的空间. 查看一个0级备份需要的字节数,使用 -S
# dump -oS /dev/hda1
3. 备份到文件而非磁带. 确认在/var/tmp目录是否有足够的空间,执行
# dump -0u -f /var/tmp/dumpfile /dev/hda1
4. 检查/etc/dumpdates,查看完全备份的时间戳.
5. 使用restore检查备份文件的内容
# restore -tf /var/tmp/dumpfile
6. 我们可以使用restore的互动模式恢复特定文件到一个临时目录.
# mkdir /tmp/restored; cd /tmp/restored
# restore -if /var/tmp/dumpfile
7. 这时会看到一个restore > 提示符. 键入help查看可用命令的列表. 使用ls和cd命令查看备份文件的列表.
8. 使用add,选中/grub.menu.1st和/grub/grub.conf文件.列出所在目录,恢复的文件应该带有星号.
9. 键入extract命令恢复选中的文件.设置下个卷名为1, 不为解压目录设置所有者模式. quit退出restore模式.
10. 在restore运行的目录中应该有一个grub目录,包含恢复的grub.conf和menu.1st文件.
步骤四: 设置打印机,使用CUPS管理打印机.
1. 使用root帐户运行redhat-config-printer
2. 选择新建,回车
3. 在队列名称位置输入lp0
4. 选择队列类型为本地打印设备
5. 选择下一步,回车
6. 选择/dev/lp0,选择下一步
7. 选择postscript printer, 选择下一步
8. 当出现创建新队列:名称和类型画面时,选择结束,回车
9. 选择退出,回车.将询问是否保存.选择是.
10. 键入命令: cd 并键入 lpr < install.log
11. 键入命令: lpq (将会看到一个由root激活的打印任务,任务号为1)
12. 键入命令: lprm 1 删除任务
13. 键入命令: lpq (将会看到任务已经删除)
mu154 于 2007-11-25 11:19:33发表:
(6)m:b (6)m:b (6)m:b 顶起
于 2006-11-08 08:18:30发表:
Your website is just beautiful! I wish you much success in all your endeavours!
Thanks the author for this site,has very much liked! if you have free time, glance to my site female genital herpes picture
Good luck, Dr. Linda Hughes.
于 2006-10-27 19:41:01发表:
See
than can help
-
ink jet printer refill kitand
400 dymo labelwriter printer thermal
于 2006-10-26 17:31:40发表:
It is very necessaryto insure allhas found a site
who triedsite-
insurance-motor Or here
health-insurance
captail 于 2006-10-05 19:52:18发表:
内容多多,得好好消化