奉獻Red Hat Linux 033 實驗翻譯(KevinZ)(轉)

BSDLite發表於2007-08-15
奉獻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的分割槽機構》
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學習筆記
宣告:本筆記並非原創,只是我個人的學習筆記!
很多的內容來自
非常感謝以上網站對我的學習提供的莫大的幫助,本著學習和分享的原則我貼出我的學習筆記,更希望兄弟們能給我指出其中錯誤的地方.謝謝!!!
學習這部分知識,首先要學到問題的思路,其次你還要記住一些東西,是死記硬背下來!你會發現這點東東的確是很有用的!
儘管如此,本文件歸屬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 安裝
你可以從 下載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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章