1. 程式人生 > >細說linux掛載——mount,及其他……(2)

細說linux掛載——mount,及其他……(2)

OK,現在咱們再具體一點,用我的ubuntu的啟動過程來做個例項,看看linux是怎麼逐步種出這顆大 樹的。
首先還是說一句,你必需知道UUID是啥玩意兒,或者至少要明白hda、sdc這些編號是啥意思。否則肯定是雞同鴨講了。
不想自己 google的話,請移步這裡看3樓。


grub_______________________________________________________________________________________
:idea: 系統啟動當然是從grub開始了,請開啟你的/boot/grub/grub.cfg檔案,找到類似下面這一段(以下以grub2的選單為樣 本,grub0.97的menu.lst其實也類似)。
程式碼: menuentry "Ubuntu 9.10, kernel 2.6.31-17-generic" {
search --no-floppy --fs-uuid --set f1bafdd4-73c2-44b2-9a62-d50a2da4d019
linux /boot/vmlinuz-2.6.31-17-generic root=UUID=f1bafdd4-73c2-44b2-9a62-d50a2da4d019 ro splash
initrd /boot/initrd.img-2.6.31-17-generic
}
也可能是這個樣子
程式碼:
menuentry "Ubuntu 9.10, kernel 2.6.31-17-generic" {
set root=(hd2,6)
linux /boot/vmlinuz-2.6.31-17-generic root=/dev/sdc5 ro splash
initrd /boot/initrd.img-2.6.31-17-generic
}
這是一個標準的ubuntu引導菜 單,menuentry那一行僅僅顯示了該專案的名稱(包括了後面被花括號圍住的所有語句),不必管它;
第二行開始,才真正進入linux系統的 引導過程,search顧名思義就是要尋找嘍,找什麼呢?找核心。
開啟你的/boot目錄,看看是不是有一個名為vmlinuz-xxxxx的文 件,大小一般在10M以內,這就是有名的linux核心。
有了核心,你就有了半個linux作業系統,可以開始引導系統了。
第三行的 linux /boot/vmlinuz-2.6.31-17-generic 這部分,linux是一個指令,它告訴grub程式:“請使用後面給出的這個核心”,於是名為“/boot/vmlinuz-2.6.31-17- generic”的核心將被載入記憶體,並讀取“root=UUID=f1bafdd4-73c2-44b2-9a62- d50a2da4d019(sdc5)”這個分割槽的一些必需的檔案。
第三行的意思是:用名為“/boot/initrd.img- 2.6.31-17-generic”的檔案先在記憶體中構造一個“虛擬”的根檔案系統,以便於核心檢測完硬體資訊後載入必需的模組等等,其實這個 initrd也可以認為是核心的一部分,只是為了保持vmlinuz的簡潔而分離出來的,有的核心甚至根本不需要這個咚咚。
OK,grub的工作 到此結束,下面將由linux核心這“半個”系統接管電腦的控制權,開始初始化階段。
:idea:
注意,到目前為止還沒有開始掛載根分割槽,所以你可以看到root=xxxxxxxx(sdc5)這個分割槽是隻讀(ro)掛載的。

如果你去 掉了第三行裡的“quiet”引數的話,就可以在螢幕上看到核心初始化中整個兒過程的輸出,當然,螢幕滾動會很快,而且內容很多,主要有檢測硬體環境、載 入相應模組、啟動服務等等……。嗯,要啟動一臺電腦可不是件容易的事是不?
好在目前你只需要關心一件事——掛載 。請注意在大約中間階段將會出現的一行字——Mounting Locale Filesystem
如果你的 linux剛裝好的話,因為掛載項不多,可能一閃而過。而如果需要掛載的分割槽很多,特別是pass引數為1或者2的時候,你就能看見逐一列出的掛載情況 了。



fstab_______________________________________________________________________________________

:idea:YEAH! 真正的分割槽掛載就此開始。

這個時候linux將會讀取一個名為fstab 的檔案,並按照其中的指令逐行執行,直到讀完所有內容,進入系統後快開啟看看吧,他位於/etc/fstab 。以下是我的(不要以為我說“指令”就怕怕,其實裡 面的內容很簡單,地球人都能看懂)。
程式碼: # /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc   /proc   proc   defaults   0   0
# / was on /dev/sda5 during installation
UUID=ce8493a2-73a2-46d3-ac32-fe28ac9ec860   /   ext4   errors=remount-ro   0   0
# /home was on /dev/sda6 during installation
UUID=5ae0aea4-f7bb-4504-bf0c-f3dbffc8fa0f   /home   ext4   defaults   0   0
# swap was on /dev/sda7 during installation
UUID=db44da00-1b52-4d25-a870-57d36a6a2a85   none   swap   sw   0   0
或者也可能被寫成了這樣
程式碼: # /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc   /proc   proc   defaults   0   0
# / was on /dev/sda5 during installation
/dev/sdc6   /   ext4   errors=remount-ro   0   0
# /home was on /dev/sda6 during installation
/dev/sdc5   /home   ext4   defaults   0   0
# swap was on /dev/sda7 during installation
/dev/sdc4   none   swap   sw   0   0
1. 請忽略所有以#開頭的行,這是註釋,給自己看的,linux不會執行它,就算是一行完整的命令也一樣,它將被完全的無視。
2. 請記住,每一行就是一條完整命令,不能有換行符。或者說換行符(回車)的作用相當於文章中的句號。
3. 每行中的每個空格或TAB符號是引數分割符號,起作用相當於文章中的逗號。多個相連的空格或TAB將被視為一個。
4. linux掛載分割槽的時候將自上而下,順序執行

第一個起作用的行(第8行)是proc,1樓已經解釋過了,咱們不管它;
第二個起 作用的行(第10行)是/dev/sdc6那裡,這就是linux最先被掛載的根分割槽了;
再下來(第12行)將繼續把sdc5掛載到/home, 也就是說,sdc5這個本來關係平等的分割槽,現在感覺上成了sdc6的一個下級目錄;
最後(第14行)將“掛載”swap分割槽,之所以打上引號, 是因為這個交換分割槽有點特殊,因為他並沒有被“附屬”於/,而是獨立使用的,至少你從根目錄開始是找不到它的(所以掛載點並沒有被寫成/swap),總 之,它被系統“霸佔”了,你不能直接在這個分割槽讀寫任何資料。

:idea: 到此為止,一個真正“可用”的linux系統建立完畢,可以交付你使用了。



DIY_______________________________________________________________________________________
引用: 等等,你說了半天,可 我的D盤E盤F盤到底在哪裡啊?
額……,那你也等等,我費勁說了這麼多,又打字又貼圖的,容易嗎我?怎麼就是擰不過來你對分割槽的錯誤稱呼方式呢? 回1樓再去看看帖呀,請學會用正確的方法表達你的訴求——“等等,你說了半天,我的第二分割槽、第三分割槽……到底在哪裡啊?”好不好?
這 樣才乖喔,蜀黍這就帶你去找。

前面說了,如果你的電腦只有一塊硬碟的話,那麼所有分割槽都將被編號為sda,SCSI(IDE、SATA、 USB disk) DISK A的意思,有兩個的話就是sdb嘍,而sda上的分割槽將繼續被從1開始按物理順序編號,所以你那個“D盤”,一般來說就是sda2了,請自己開啟/etc /fstab(用sudo),在檔案的最後加入一行(看不懂這些引數的乖仔請再次移步這裡看3樓 ):
程式碼: /dev/sda2   <掛載點>   <分割槽格式>   <掛載引數>   0   0
然後……,不用重啟電腦!再說一遍,不要總是用windows思維來套linux!請執 行
程式碼: sudo mount -a
就可以在<掛載點>看到你要的東西了。
引 用: 哎哎哎,再等等,我怎麼知道分割槽編號是幾啊,總不至於還要拆硬碟來看吧?
嗯, 當然不至於啦,輸入一個命令就好
程式碼: sudo fdisk -l
根據分割槽特徵、大小等等資訊,總該知道了吧?
這樣還不 行?那就開啟gparted程式,有示意圖就肯定沒問題了。

有多個硬碟的口口(此處被EE遮蔽),建議使用UUID掛載分割槽以免混淆,獲 取UUID請使用blkid命令,看我的
程式碼: blkid
/dev/sda1: UUID="4028B77B28B76F12" LABEL="WINXP" TYPE="ntfs"
/dev/sda5: LABEL="YEAR" UUID="0000-0000" TYPE="vfat"
/dev/sda6: UUID="E4F018CFF018A9B6" LABEL="ST80PE" TYPE="ntfs"
/dev/sda7: UUID="2A58D7CE58D796C3" LABEL="Program" TYPE="ntfs"
/dev/sda8: UUID="E46CE5006CE4CDFC" LABEL="Fonts" TYPE="ntfs"
/dev/sdb1: UUID="B6A4A454A4A4193F" LABEL="320A" TYPE="ntfs"
/dev/sdb3: LABEL="DEBIAN" UUID="5d1dda14-04e7-42e2-9db9-82e5a1c71d30" TYPE="ext4"
/dev/sdb5: LABEL="HOME" UUID="f63bf91f-38af-4c0f-92c2-22f57650ef85" TYPE="ext4"
/dev/sdb6: UUID="84c7f174-fd5c-4872-9be8-f6afddca2b14" TYPE="ext4" LABEL="ARCH"
/dev/sdb7: LABEL="P2P" UUID="36223d45-f7e2-4b23-a845-7e9fc4a9c5ab" TYPE="ext4"
/dev/sdb8: LABEL="MUSIC" UUID="068a59a0-d30b-4d9a-896c-233794facfb1" TYPE="ext4"
/dev/sdb9: LABEL="MOVIE" UUID="a4a14993-8675-4905-ae31-f2ca3a89e6ef" TYPE="ext4"
/dev/sdc1: UUID="4444961844960CB4" LABEL="Windows7" TYPE="ntfs"
/dev/sdc2: UUID="C634795434794907" LABEL="WD2" TYPE="ntfs"
/dev/sdc3: UUID="24288C6C288C3F34" LABEL="WD3" TYPE="ntfs"
/dev/sdc5: UUID="30BCB1D9BCB19A34" LABEL="WD5" TYPE="ntfs"
/dev/sdc6: UUID="5C1CC4F61CC4CBE8" LABEL="WD6.Lib" TYPE="ntfs"
/dev/sdc7: UUID="5E98D85F98D836ED" LABEL="WD7" TYPE="ntfs"
/dev/sdd1: UUID="1E7CCB1E7CCAEF97" LABEL="ST160SYS" TYPE="ntfs"
/dev/sdd5: UUID="C628FB7028FB5E3D" LABEL="ST160NT1" TYPE="ntfs"
/dev/sdd6: UUID="DC607A20607A0196" LABEL="ST160NT2" TYPE="ntfs"
很清楚吧?根據分割槽 編號、卷標和分割槽格式,很容易就能找到你需要的UUID,用這個替代/dev/sda2即可。

:idea: 這是我的fstab最後的樣子,沒辦法,硬碟太多。
程式碼: # /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc   /proc   proc   defaults   0   0
# / was on /dev/sda5 during installation
UUID=ce8493a2-73a2-46d3-ac32-fe28ac9ec860   /   ext4   errors=remount-ro   0   0
# /home was on /dev/sda6 during installation
UUID=5ae0aea4-f7bb-4504-bf0c-f3dbffc8fa0f   /home   ext4   defaults   0   0

#Seagat 320G
UUID=B6A4A454A4A4193F    /home/MNT/ST320G/320A   ntfs-3g    defaults,utf8,umask=000,uid=adagio,gid=users       0       0
UUID=36223d45-f7e2-4b23-a845-7e9fc4a9c5ab   /home/MNT/ST320G/P2P   ext4   defaults   0   1
UUID=068a59a0-d30b-4d9a-896c-233794facfb1   /home/MNT/ST320G/MUSIC   ext4   defaults   0   1
UUID=a4a14993-8675-4905-ae31-f2ca3a89e6ef   /home/MNT/ST320G/MOVIE   ext4   defaults   0   1

#Seagat 80G
UUID=E46CE5006CE4CDFC    /home/MNT/ST80G/FONTS   ntfs-3g    defaults,utf8,umask=000,uid=adagio,gid=users       0       0
LABEL=YEAR   /home/MNT/ST80G/YEAR   vfat    defaults,utf8,umask=000      0       0
UUID=2A58D7CE58D796C3    /home/MNT/ST80G/PROGRAM   ntfs-3g    defaults,utf8,umask=000,uid=adagio,gid=users       0       0

#Seagat 160G
UUID=C628FB7028FB5E3D    /home/MNT/ST160NT1   ntfs-3g    defaults,utf8,umask=000,uid=adagio,gid=users       0       0
UUID=DC607A20607A0196    /home/MNT/ST160NT2   ntfs-3g    defaults,utf8,umask=000,uid=adagio,gid=users       0       0

#WestDigital 1000G
UUID=C634795434794907    /home/MNT/WD1000/WD2   ntfs-3g    defaults,utf8,umask=000,uid=adagio,gid=users       0       0
UUID=24288C6C288C3F34    /home/MNT/WD1000/WD3   ntfs-3g    defaults,utf8,umask=000,uid=adagio,gid=users       0       0
UUID=30BCB1D9BCB19A34    /home/MNT/WD1000/WD5   ntfs-3g    defaults,utf8,umask=000,uid=adagio,gid=users       0       0
UUID=5C1CC4F61CC4CBE8    /home/MNT/WD1000/WD6.Lib   ntfs-3g    defaults,utf8,umask=000,uid=adagio,gid=users       0       0
UUID=5E98D85F98D836ED    /home/MNT/WD1000/WD7   ntfs-3g    defaults,utf8,umask=000,uid=adagio,gid=users       0       0
這是 我畫的掛載示意圖(只畫出單個硬碟,如果四個全畫上,這圖就成蜘蛛網了),請看:
附件: mount01.jpg



OVER_______________________________________________________________________________________
:idea: 搞好了這些,你這輩子再也不用為掛載發愁了,安心用吧。

:idea: 我曾經看到有人發帖說,設定好了的桌布,一旦重啟就沒了,變成光板桌面 。這是怎麼搞的呢?
其實問題很簡單,就是——他不懂 mount is what玩意!

我們的ubuntu使用的視窗管理器是gnome套件,用於管理檔案的程式(相當於windows的資 源管理器)是nautilus(鸚鵡螺)。
這個程式為了方便你的使用,精心打造了一種“點選掛載”方式,要說明的是,這種方式完全與fstab文 件無關,它由另一個程式控制。
每次啟動gnome以後,nautilus會根據核心檢測到的分割槽資訊,逐一把所有未掛載的分割槽羅列出來,並顯示在 左側的“Places”欄裡(下圖滑鼠處)
附件: N1.jpg
當你要使用這個分割槽的 時候,只需“點選”一下,就會在右側顯示出來。
其實這時候gnome執行了幾個動作:
1. 根據使用者點選的分割槽,在/media目錄建立一個子目錄,並使用分割槽卷標(沒有卷標則使用分割槽容量)命名;
2. mount該分割槽到此目錄;
3. 重啟後就解除安裝,並刪除此目錄;
於是點選之後你就可以讀寫該分割槽了。

這種方式……,有好有不好。
好處是不用去編輯 fstab檔案,敲大堆的程式碼,隨點隨用,不用了右鍵即可解除安裝;
不好的地方呢?如同上面的那個桌布“莫名消失”的困惑一樣嘍。
因為這種方 式需要你每次啟動後都要“點選”一下,也就是說它不會“記住”你曾經掛載過的分割槽,或者說它不是像fstab一樣是自動的,頂多算半自動吧。

搞 清楚了道理,那桌布“莫名消失”的問題,也就不“莫名”了?
因為他設定的桌布儲存在“點選掛載”的某個分割槽,而剛進入桌面的時候你還沒有“點 擊”,所以這張桌布是“不存在的”,當然就只能看見一個光板桌面了。
很正常是不?

解決這個問題的辦法只有一個,就是把桌布放在fstab掛載的管轄範圍之內。


:idea: 還有人經常問一個問題——我用fstab掛載的分割槽,為什麼不出現在左側“Places”裡了?
是的,這樣的確令人感覺不便。
不過解決辦 法也是一樣的簡單——加入“書籤”
首先開啟 nautilus,進入你掛載好的目錄(掛載點),按“CTRL+D” (呵 呵,跟大多數web瀏覽器一樣喔),或者選單--->書籤--->加入書籤,然後就可以在Places的最下面看見它了(下圖滑鼠處),滿意 了吧?
附件: N2.jpg



題外話 _______________________________________________________________________________________
我 的分割槽,如果在windows裡就是醬紫:
本來應該是D盤的WD2,現在被他安排到了P盤,最重要的是這期間根本沒有請示過我想不想這樣!
當 然我可以手動調整,不過我討厭這樣,我的電腦我做主,一個小小OS也敢來隨意處置,它好大的膽!
附件: 7.JPG


介 紹兩個自動掛載分割槽的軟體,ntfs-config和ivman,由於這不符合“我的電腦我做主”的精神,我本人從來不用,也強烈反對新手使用,所以具體 情況請自己google,殺了你我也不說。 :lol: