470 likes | 668 Views
Dir 的 size 並不是這個 dir 所有檔案總 size 和 而是該 dir 建立時 , 分配到的 block 總量的 size, 建該 Dir 時 , 即會分配一個 inode & 一個 block 給該 dir, 若該 dir 持續長大 , 會變成 2 個 blocks, 依此類推 … 這就是為什麼 dir size 都是 block size (1k, 2k, or 4k) 的倍數 . Dir block(s) 中就放著 該 dir files 的 inode number & file names 的 mapping
E N D
Dir的size並不是這個dir所有檔案總size和 而是該dir建立時,分配到的block總量的size, 建該Dir時,即會分配一個inode & 一個block 給該dir,若該dir持續長大, 會變成2個blocks,依此類推…這就是為什麼dir size都是block size (1k, 2k, or 4k)的倍數. Dir block(s) 中就放著 該dir files 的 inode number & file names 的 mapping 記住,是inode number,不是inode contents Linux基礎--vi 文書處理器
inode 與 block 都有編號 • inode:記錄檔案的屬性,一個檔案佔用一個inode,同時記錄此檔案的資料所在的 data block 號碼重點 • 只要能找到檔案的 inode#,就可以從該inode內容讀取這個檔案的 block#, 當然也就能夠讀出該檔案的實際資料! (檔案的inode#在dir的data block中的FileInode# (or DirInode#)<>FileName(or DirName)Mapping table中
ext234: Format時一個partition會切成多個Block Group除了第一個BG有6區塊,之後每個BG都會有5個區塊 512bytes: mbr 446 + p-table 64 之後有某些BG有:Backup superblock 這圖有錯,這裡應為BG 0,裡面有superblock 在dumpe2fs中為GDT test: dumpe2fs some-device ext2檔案系統示意圖
(6) data block • 是用來放置檔案內容資料地 • Ext234 檔案系統支援的 block size有 1K, 2K 及 4K 三種-format時 block size就固定了 • 每個 block 都有編號,以方便 inode 的記錄 • block 大小的差異,會導致該檔案系統能夠支援的最大磁碟容量與最大單一檔案容量並不相同。
data block 限制 • block 的大小與數量在格式化完就不能夠再改變了(除非重新格式化); • 每個 block 內最多只能夠放置一個檔案的資料 • 如果檔案大於 block 的大小,則一個檔案會佔用多個 block • 若檔案小於 block ,則該 block 的剩餘容量就不能夠再被使用了(磁碟空間會浪費)。 • 很多小檔的part最好用1k-data block,反之用4k-data block,否則會有浪費or access performance問題
(5) inode table • 該檔案的存取模式(read/write/excute); • 該檔案的擁有者與群組(owner/group); • 該檔案的容量; • 該檔案建立或狀態改變的時間(ctime); • 最近一次的讀取時間(atime); • 最近修改的時間(mtime); • 定義檔案特性的旗標(flag),如 SetUID...; • 該檔案真正內容的指向 (pointer),即data block#
inode table • (bird) size: 128 bytes 真的嗎? • dumpe2fs /dev/sda1 | grep "node size" Inode size: 128 • dumpe2fs /dev/sda2 | grep "node size" • Inode size: 256 • dumpe2fs /dev/sda3 | grep "node size" • Inode size: 256 • 1個檔案都僅會佔用一個 inode 而已 • 因此檔案系統能夠建立的檔案數量與 inode 的數量有關; • 系統讀取檔案時需要 • 先找到 inode# inode內容 並分析 inode 所記錄的權限與使用者是否符合,若符合才能夠開始實際讀取 data block 的內容
inode / block 與檔案大小的關係 • inode 要記錄的資料非常多,但只有 128bytes 而已 • 屬性,權限,各種時間,suid ...等等用掉68 bytes, • 剩下的60 bytes用來記錄data block number • inode 記錄一個 block 號碼要花掉 4byte,假設有一個檔案有 400MB 且每個 block 為 4K 時, 那麼至少也要十萬筆 block 號碼的記錄呢 • 也就是說inode size除了屬性,權限... 之外, 記錄此檔案的 data block #,還需要40萬 bytes,inode 哪有這麼大? • EXT234很聰明的將 inode 記錄 block 號碼的區域定義為 • 12個直接 (direct) • 一個間接 (indirect) • 一個雙間接 (double indirect) • 一個三間接記錄區 (triple indirect)如下頁 (檔案持續長大時 ,從12k變到13k,從256k變到257k,....)
inode table fs < 256k fs < 256*256*256k fs < 256*256k fs < 12k 拿一個block來記錄 inode#, 就好像是inode中的 data block# pointer 一樣 • data block inode 結構示意圖
8.1 認識 EXT2 檔案系統 • data block (資料區塊) [12 + (256) + (256*256) + (256*256*256) ] * 1024 自己算看看 = 16GB
Superblock (超級區塊) • block 與 inode 的總量; • 未使用與已使用的 inode / block 數量; • block 與 inode 的大小 (block 為 1, 2, 4K,inode 為 128 bytes) • filesystem 的掛載時間、最近一次寫入資料的時間、最近一次檢驗磁碟 (fsck) 的時間等檔案系統的相關資訊; • 一個 valid bit 數值,若此檔案系統已被掛載,則 valid bit 為 0 ,若未被掛載,則 valid bit 為 1 。 • Filesystem Description (檔案系統描述說明, GDT) • 每個 block group 的開始與結束的 block 號碼 • (superblock, bitmap, inodemap, data block) 分別介於哪一個 block 號碼之間 • block bitmap (區塊對照表): • 新增檔案要使用哪個 data block 來記錄呢空的data block • block bitmap記錄哪些 block 是空的available,哪些 block 被用掉(occupied) • inode bitmap (inode 對照表) • 同上,找空的 inode
dumpe2fs /dev/hdc2 (就是/) • -h :僅列出 superblock 的資料,不會列出其他的區段內容! • df check mounted devices & see disk free
824, p1, mimia • 建一個dir時的處理方式 • 分配一個inode (inode number) • 分配一個data block (1k or 2k or 4k) • EXT2 與目錄樹的關係 FileName or DirName • 目錄 目錄佔用的 block 記錄的資料示意圖 • 檔案 • 目錄樹讀取 ll -i or ll -id [root@www ~]# ll -di / /etc /etc/passwd 2 drwxr-xr-x 23 root root 4096 Sep 22 12:09 / 1912545 drwxr-xr-x 105 root root 12288 Oct 14 04:02 /etc 1914888 -rw-r--r-- 1 root root 1945 Sep 29 02:21 /etc/passwd
想要讀取 /etc/passwd 這個檔案時,系統是如何讀取的呢? [root@www ~]# ll -di / /etc /etc/passwd 2 drwxr-xr-x 23 root root 4096 Sep 22 12:09 / 1912545 drwxr-xr-x 105 root root 12288 Oct 14 04:02 /etc 1914888 -rw-r--r-- 1 root root 1945 Sep 29 02:21 /etc/passwd 在鳥哥的系統上面與 /etc/passwd 有關的目錄與檔案資料如上表所示,該檔案的讀取流程為(假設讀取者身份為 vbird 這個一般身份使用者): • / 的 inode: • 透過掛載點的資訊找到 /dev/hdc2 的 inode 號碼為 2 的根目錄 inode,且 inode 規範的權限讓我們可以讀取該 block 的內容(有 r 與 x) • / 的 block: • 經過上個步驟取得 block 的號碼,並找到該內容有 etc/ 目錄的 inode 號碼 (1912545) • etc/ 的 inode: • 讀取 1912545 號 inode 得知 vbird 具有 r 與 x 的權限,因此可以讀取 etc/ 的 block 內容; • etc/ 的 block: • 經過上個步驟取得 block 號碼,並找到該內容有 passwd 檔案的 inode 號碼 (1914888); • passwd 的 inode: • 讀取 1914888 號 inode 得知 vbird 具有 r 的權限,因此可以讀取 passwd 的 block 內容; passwd 的 block: • 最後將該 block 內容的資料讀出來。
df & du (disk free & disk usage) • 8.2.1 磁碟與目錄的容量 df & du 預設均為kb • df:列出檔案系統的整體磁碟使用量; • du:評估檔案系統的磁碟使用量(常用在推估目錄所佔容量) [root@www ~]# df [-ahikHTm] [目錄或檔名] 選項與參數: -a :列出所有的檔案系統,包括系統特有的 /proc 等檔案系統; -k :以 KBytes 的容量顯示各檔案系統; -m :以 MBytes 的容量顯示各檔案系統; -h :以人們較易閱讀的 GBytes, MBytes, KBytes 等格式自行顯示; -H :以 M=1000K 取代 M=1024K 的進位方式; -T :連同該 partition 的 filesystem 名稱 (例如 ext3) 也列出; -i :不用硬碟容量,而以 inode 的數量來顯示df -h df -h /etc (會自動去執行 此 dir 所在的 filesystem的 df -h) [因為沒有人會查 dir 的 available space] • df
du [root@www ~]# du [-ahskm] 檔案或目錄名稱 (查 dir & files 所佔 disk space) 選項與參數: -a :列出所有的檔案與目錄容量,因為預設僅統計目錄底下的檔案量而已。 -h :以人們較易讀的容量格式 (G/M) 顯示;(M or G) -s :列出總量而已,而不列出每個各別的目錄佔用容量; -S :不包括子目錄下的總計,與 -s 有點差別。 -k :以 KBytes 列出容量顯示;(預設就 是k) -m :以 MBytes 列出容量顯示;(強制M顯示) 只要先學會:du -sm /home/jj 查某資料夾 所佔 disk space du -sm /* 即可 上述 du -sm /* 的 * 指的是 所有dir, 不含 files 另外 ll看到的 dir 大小,並不是 該 dir所有內容files&dir的 disk space,而是 記錄該 dir 的 block的大小(常為 1k, 2k , 4k, 8k, 12k ..) • du
建dir, 產生5個小檔(不可以是空的)du為 24k (因為含 自己的 dir size 4k) Linux基礎--vi 文書處理器
Hard & Symbolic link • Hard Link (實體連結, 硬式連結或實際連結)多檔名對應到同一個 link 實體連結的檔案讀取示意圖 hard link 進行『檔案的連結』+1
錯,應為另一個新的inode number Linux基礎--vi 文書處理器
8.2 檔案系統的簡單操作 • Symbolic Link (符號連結,亦即是捷徑) 符號連結的檔案讀取示意圖
link count (即 dir中的mapping table有幾筆records) • ll -d /tmp link count 5 • mkdir dir link count 6 • file不會響 dir link count • 關於目錄的 link 數量 • /tmp/testing • /tmp/testing/. (與上同, 連同下一個,所以 dir link count剛建好=2) • /tmp/testing/..
建立(新增) partition • 1-4 號尚有剩餘,且系統未有 extended: • 出現讓你挑選 Primary / Extended 的項目,且你可以指定 1~4 號間的號碼; • 若無建os需求,P or E均可,但E需再續建L才可使用,原則上先把pri用完(安裝os需要Pri partition) • 原則上順號,除非已有mount計畫,或要空出某個partition#給未來的mount計畫 • 1-4 號尚有剩餘,且系統有 extended: • 此時會出現讓你挑選 Primary / Logical 的項目(同上,若無建os需求,P or E均可...) • 若選擇 p 則你還需要指定 1~4 號間的號碼(同上,原則上順號...) • 若選擇 l(L的小寫) 則不需要設定號碼,因為系統會自動指定邏輯分割槽的檔名號碼; • 原則上先把pri用完 • 1-4 沒有剩餘,且系統有 extended • 此時不會讓你挑選分割槽類型,直接會進入 logical 的分割槽形式
同學可以試試看,在vm裡即便該 disk不含”無法umount的/,執行 partprobe仍然無效”,所以在fdisk改過 partition table(就是執行w之後),還是得reboot Linux基礎--vi 文書處理器
8.3 磁碟的分割、格式化、檢驗與掛載 • 刪除磁碟分割槽 • 1.fdisk /dev/hdc :先進入 fdisk 畫面; • 2.p :先看一下分割槽的資訊,假設要殺掉 /dev/hdc1; • 3.d :這個時候會要你選擇一個 partition ,就選 1 囉! • 4.w (or) q :按 w 可儲存到磁碟資料表中,並離開 fdisk ; Linux基礎--Linux磁碟與檔案系統管理
8.3 磁碟的分割、格式化、檢驗與掛載 • 8.3.2 磁碟格式化 • mkfs [root@www ~]# mkfs [-t 檔案系統格式] 裝置檔名 選項與參數: -t :可以接檔案系統格式,例如 ext3, ext2, vfat 等(系統有支援才會生效) Linux基礎--Linux磁碟與檔案系統管理
fsck 執行 fsck 時, 被檢查的 partition 務必不可掛載到系統上!亦即是需要在卸載的狀態喔 練習: 新建的 fsck -C -f -t ext4 4 /dev/sda6要建個很大的 partition (35G test), 才看得到-C的bar 效果 • 8.3.3 磁碟檢驗: fsck, badblocks • fsck [root@www ~]# fsck [-t 檔案系統] [-ACay] 裝置名稱 選項與參數: -t :如同 mkfs 一樣,fsck 也是個綜合軟體而已!因此我們同樣需要指定檔案系統。 不過由於現今的 Linux 太聰明了,它會自動的透過 superblock 去分辨檔案系統, 因此通常可以不需要這個選項的囉!請看後續的範例說明。 -A :依據 /etc/fstab 的內容,將需要的裝置掃瞄一次。/etc/fstab 於下一小節說明, 通常開機過程中就會執行此一指令了。 -a :自動修復檢查到的有問題的磁區,所以你不用一直按 y 囉! -y :與 -a 類似,但是某些 filesystem 僅支援 -y 這個參數! -C :可以在檢驗的過程當中,使用一個長條圖來顯示目前的進度! EXT2/EXT3 的額外選項功能:(e2fsck 這支指令所提供) -f :強制檢查!一般來說,如果 fsck 沒有發現任何 unclean 的旗標,不會主動進入 細部檢查的,如果你想要強制 fsck 進入細部檢查,就得加上 -f 旗標囉! -D :針對檔案系統下的目錄進行最佳化配置。
mount 3點注意事項 • (1) 單一檔案系統不應該被重複掛載在不同的掛載點(目錄)中; • mount -t ext4 /dev/sda6 /mnt/part61 • mount -t ext4 /dev/sda6 /mnt/part62 >>雖然可以,但不要這麼做,!! • cd /mnt/part61; touch abc; ll -i /mnt/part61/abc /mnt/part62/abc • mkdir /mnt/part62/dir; ll -id /mnt/part61/dir /mnt/part62/dir inode相同,兩者file & dir 完全互為hard-link backup,但實際的硬碟空間卻是完全一 樣(ll -id /mnt/part61 /mnt/part62 同,也就在同一實體位置 dir的FileName(or DirName)<>inode# 建一模一樣的 mapping,若該位置毀損,完全沒有備份效果 ** 請回想 真正hard-link backup的意義: touch /root/abc ln /root/abc /tmp/abc; ll -i /root/abc /tmp/abc檢視輸出得到 >> 不同檔案指向同inode 但是 ll -id /root /tmp 檢視輸出得到 >> /root 與 /tmp 在硬碟中是不同的位置可是上述 ll -id /mnt/part61/dir /mnt/part62/dir 檢視輸出得到 >> /mnt/part61/dir 與 /mnt/part62/dir 在硬碟中根本就是相同的位置,這種備份有什麼意義?任一file or dir剛好遇上壞軌,根本就是兩個file or dir都壞(同一實體硬碟空間)
(2) 單一目錄不應該重複掛載多個檔案系統(多個檔案系統重複掛載在單一目錄)fdisk 新增/dev/sda6 & /dev/sda7mkdir /mnt/part67mount -t ext4 /dev/sda6 /mnt/part67mount -t ext4 /dev/sda7 /mnt/part67df -h.../dev/sda6 1020M 34M 935M 4% /mnt/part67/dev/sda7 1020M 34M 935M 4% /mnt/part67>> 竟然也可以,但是後面看看問題很大touch /mnt/part67/abc; ll -i /mnt/part67/abc12 -rw-r--r--. 1 root root 0 2013-08-17 00:31 /mnt/part67/abc請問這個檔案實際上是放在 第6 or第7個partition??答案是第7個partition,你可以試試 :umount /dev/sda7; ll -i /mnt/part67/ 看不到abc(所以,別以為可以用這種方法做備份,沒有那麼方便!!)而且/dev/sda6 也無法umount 結論是: 不要把(多個檔案系統重複掛載在單一目錄)
(3) 要作為掛載點的目錄,理論上應該都是空目錄才是 • 請好好想想(一般dir)與(dir被拿來當mount point的不同處) • 一般dir裡的file or dir就存放在該dir所在的partition • 被拿來當mount point的dir是指向另一個 partition但是這個"被拿來當mount point的dir"在剛剛建好之後也是個一般dir哦!! 若接下來此dir要被拿來當mount point,你當然不要在此dir裡放任何東西進來!!啊不然mount後, 該dir裡東西不就"暫時"看不見了! Linux基礎--vi 文書處理器
mount -o • 所有參數以","隔開,不可以有空格 • single user mode: • mount -o rw,remount /(比如,要修改/etc/fstab) • 掛載iso • mount -o loop /tmp/centos6.4.iso /mnt/iso Linux基礎--vi 文書處理器
掛載 CD 或 DVD 光碟 • 掛載 CD 或 DVD 光碟 mount 實體光碟: mount -t iso9660 /dev/cdrom /media/cdrom [root@www ~]# mount /dev/cdrom /media/cdrom # 你可以指定 -t iso9660 這個光碟片的格式來掛載,也可以讓系統自己去測試掛載!
Floppy (略) • 格式化與掛載軟碟
8.3 磁碟的分割、格式化、檢驗與掛載 • umount (將裝置檔案卸載)
8.3 磁碟的分割、格式化、檢驗與掛載 • 使用 Label name 進行掛載的方法
8.3 磁碟的分割、格式化、檢驗與掛載 • mknod
8.3 磁碟的分割、格式化、檢驗與掛載 • e2label
轉 ext2 > ext3,轉 ext3 > ext4 • tune2fs -j /dev/sda6 • (要先umount,轉 ext2 > ext3) • // • 建一個 /dev/sda6; mkfs -t ext3 /dev/sda6 • mount -t ext3 /dev/sda6 /mnt/part6 • umount /dev/sda6; 轉為ext4 • tune2fs -O extents,uninit_bg,dir_index /dev/sda6 • (要先umount,轉 ext3 > ext4) • 可能要e2fsck /dev/sda6一下 • mount -t ext3 /dev/sda6 /mnt/part6 不行,必 須mount -t ext4 /dev/sda6 /mnt/part6
對 sata hd 無用的指令(略) • hdparm
8.4 設定開機掛載 • 8.4.1 開機掛載 /etc/fstab 及 /etc/mtab • 根目錄 / 是必須掛載的﹐而且一定要先於其它 mount point 被掛載進來。 • 其它 mount point 必須為已建立的目錄﹐可任意指定﹐但一定要遵守必須的系統目錄架構原則 • 所有 mount point 在同一時間之內﹐只能掛載一次。 • 所有 partition 在同一時間之內﹐只能掛載一次。 • 如若進行卸載﹐你必須先將工作目錄移到 mount point(及其子目錄) 之外。
8.4 設定開機掛載 • 第一欄:磁碟裝置檔名或該裝置的 Label • 第二欄:掛載點 (mount point) • 第三欄:磁碟分割槽的檔案系統 • 第四欄:檔案系統參數 • 第五欄:能否被 dump 備份指令作用
8.4 設定開機掛載 • 8.4.2 特殊裝置 loop 掛載 (映象檔不燒錄就掛載使用) • 建立大檔案以製作 loop 裝置檔案 • 建立大型檔案
8.4 設定開機掛載 • 格式化
8.4 設定開機掛載 • 掛載
8.5 記憶體置換空間(swap)之建置 • 8.5.2 使用檔案建置swap 1. 使用 dd 這個指令來新增一個 128MB 的檔案在 /tmp 底下 2. 使用 mkswap 將 /tmp/swap 這個檔案格式化為 swap 的檔案格式 3. 使用 swapon 來將 /tmp/swap 啟動囉! 4. 使用 swapoff 關掉 swap file • 建一 swap partition ... (記得 toggle partition filesystem# >> 82) swap /dev/sdaX free swapon -s 開機 swap 不見了 • 不需 mount,將下兩行寫入 /etc/rc.local 即可 開機自動執行swapon /dev/sdaXswapon /SWAPFILE reboot 檢查 free, swapon -s (有 priority)
mount Linux基礎--vi 文書處理器