奉献Red Hat Linux 033 实验翻译(KevinZ)(转)

奉献Red Hat Linux 033 实验翻译(KevinZ)(转)[@more@]首先进去linux的rescue的模式!
然后使用如下的命令:
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
$ ^message^window-demo

2. 重复执行上一个包含字符串ig的命令:
$ 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/cat __________
catalog __________
concatenate __________
polecat __________
Cat __________
4. sed 's/[Cc]at>/dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________

5. sed 's//dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________

6. sed 's//& 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,按下,shell会告诉你进程停止了,告诉你job号码为1,切换回控制台2,你会看到文件不变了。

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上看是否进程真的结束了,然后按结束tail进程,注销。

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),直到出现光标重复下行。

---&gt 现在您应该已经学会如何移动到下一讲吧。

3. 现在请使用下行键,将光标移动到第二讲。

提示∶如果您不敢确定您所按下的字母,请按下键回到正常(Normal)模式。
然后再次从键盘输入您想要的命令。

提示∶光标键应当也能正常工作的。但是使用hjkl键,在习惯之后您就能够快速
地在屏幕内四处移动光标了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲第二节∶VIM的进入和退出


!! 特别提示∶敬请阅读完整本一节的内容,然后才能执行以下所讲解的命令。

1. 请按键(这是为了确保您处在正常模式)。

2. 然后输入∶ :q!

---&gt 这种方式的退出编辑器绝不会保存您进入编辑器以来所做的改动。
如果您想保存更改再退出,请输入∶
:wq

3. 如果您看到了命令行提示符,请输入能够带您回到本教程的命令,那就是∶

vimtutor

通常情况下您也可以用这种方式∶

vim tutor

---&gt 这里的 'vim' 表示进入vim编辑器,而 'tutor'则是您准备要编辑的文件。

4. 如果您自信已经牢牢记住了这些步骤的话,请从步骤1执行到步骤3退出,然
后再次进入编辑器。接著将光标移动到第一讲第三节来继续我们的教程讲解。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲第三节∶文本编辑之删除


** 在正常(Normal)模式下,可以按下 x 键来删除光标所在位置的字符。**

1. 请将光标移动到本节中下面标记有 ---&gt 的那一行。

2. 为了修正输入错误,请将光标移至准备删除的字符的位置处。

3. 然后按下 x 键将错误字符删除掉。

4. 重复步骤2到步骤4,直到句子修正为止。

---&gt The ccow jumpedd ovverr thhe mooon.

5. 好了,该行已经

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10617542/viewspace-958985/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10617542/viewspace-958985/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值