一、實驗介紹
1.1 實驗內容
本節(jié)實驗的文件系統(tǒng)操作的內容十分簡單亚脆,只會包含幾個命令的幾個參數(shù)的講解,但掌握這些也將對你在學習 Linux 和實驗樓后續(xù)其他課程的過程中有極大幫助抵屿。
因為本課程的定位為入門基礎摹恰,盡快上手,故沒有打算涉及太多理論內容硼婿,前面省略了關于 Linux 文件系統(tǒng)的一些基本知識锌半,也因為我們是在線實驗環(huán)境,所以也避開了很少一部分但又十分重要的關于硬件的內容寇漫,我們只能期待用戶能夠抱著提高自學能力的心態(tài)自己去補充相關的知識刊殉。
1.2 實驗知識點
df,du州胳,mount
命令的使用
磁盤相關知識學習
二记焊、基本操作
2.1 查看磁盤和目錄的容量
使用 df 命令查看磁盤的容量
$ df
在虛擬云主機的環(huán)境中你將看到如下的輸出內容:
但在實際的物理主機上會更像這樣:
一般使用情況下,我們更多只是關心第一行的內容也就是環(huán)境中的rootfs或者物理主機上的/dev/sda2
"rootfs" : (Root File System)它是 Ramfs(Ramfs 是一個非常簡單的 Linux 文件系統(tǒng)用于實現(xiàn)磁盤緩存機制作為動態(tài)可調整大小的基于 ram 的文件系統(tǒng))或者 tmpfs 的一個特殊實例栓撞,它作為系統(tǒng)啟動時內核載入內存之后遍膜,在掛載真正的磁盤之前的一個臨時文件系統(tǒng)碗硬。通常的主機會在系統(tǒng)啟動后用磁盤上的文件系統(tǒng)替換,只是在一些嵌入式系統(tǒng)中會只存在一個 rootfs 瓢颅,或者像我們目前遇到的情況運行在虛擬環(huán)境中共享主機資源的系統(tǒng)也可能會采用這種方式恩尾。
物理主機上的 /dev/sda2 是對應著主機硬盤的分區(qū),后面的數(shù)字表示分區(qū)號惜索,數(shù)字前面的字母 a 表示第幾塊硬盤(也可能是可移動磁盤)特笋,你如果主機上有多塊硬盤則可能還會出現(xiàn) /dev/sdb,/dev/sdc 這些磁盤設備都會在 /dev 目錄下以文件的存在形式巾兆。
接著你還會看到"1k-blocks"這個陌生的東西猎物,它表示以磁盤塊大小的方式顯示容量,后面為相應的以塊大小表示的已用和可用容量角塑,在你了解 Linux 的文件系統(tǒng)之前這個就先不管吧蔫磨,我們以一種你應該看得懂的方式展示:
$ df -h
現(xiàn)在你就可以使用命令查看你主機磁盤的使用情況了。
使用 du 命令查看目錄的容量
這個命令前面其實已經用了很多次了:
# 默認同樣以 blocks 的大小展示
$ du
# 加上`-h`參數(shù)圃伶,以更易讀的方式展示
$ du -h
-d參數(shù)指定查看目錄的深度
# 只查看1級目錄的信息
$ du -h -d 0 ~
# 查看2級
$ du -h -d 1 ~
常用參數(shù)
du -h #同--human-readable 以K堤如,M,G為單位窒朋,提高信息的可讀性搀罢。
du -a #同--all 顯示目錄中所有文件的大小。
du -s #同--summarize 僅顯示總計侥猩,只列出最后加總的值榔至。
來自: http://man.linuxde.net/du
du查看目錄大小,df查看磁盤使用情況欺劳。
du(estimate file space usage)命令與df(report file system disk space usage)只用一字只差唧取,首先就希望注意不要弄混淆了,以可以像我這樣從man手冊中獲取命令的完整描述,記全稱就不會搞混了划提。
三枫弟、簡單的磁盤管理
下面涉及的命令具有一定的危險性,操作不當可能會丟失你的個人數(shù)據(jù)鹏往,初學者建議在虛擬環(huán)境中進行操作
通常情況下淡诗,這一小節(jié)應該直接將如何掛載卸載磁盤,如何格式化磁盤伊履,如何分區(qū)袜漩,但如你所見,我們的環(huán)境中沒東西給你掛湾碎,也沒東西給你分宙攻,所以首先我們會先創(chuàng)建一個虛擬磁盤來進行后續(xù)的練習操作
3.1 創(chuàng)建虛擬磁盤
dd 命令簡介
dd命令用于轉換和復制文件,不過它的復制不同于cp介褥。之前提到過關于 Linux 的很重要的一點座掘,一切即文件递惋,在 Linux 上,硬件的設備驅動(如硬盤)和特殊設備文件(如/dev/zero和/dev/random)都像普通文件一樣溢陪,只要在各自的驅動程序中實現(xiàn)了對應的功能萍虽,dd 也可以讀取自和/或寫入到這些文件。這樣形真,dd也可以用在備份硬件的引導扇區(qū)杉编、獲取一定數(shù)量的隨機數(shù)據(jù)或者空數(shù)據(jù)等任務。dd程序也可以在復制時處理數(shù)據(jù)咆霜,例如轉換字節(jié)序邓馒、或在 ASCII 與 EBCDIC 編碼間互換。
dd的命令行語句與其他的 Linux 程序不同蛾坯,因為它的命令行選項格式為選項=值光酣,而不是更標準的--選項 值
或-選項=值
。dd默認從標準輸入中讀取脉课,并寫入到標準輸出中救军,但可以用選項if(input file胀蛮,輸入文件)和of(output file莹妒,輸出文件)改變。
我們先來試試用dd命令從標準輸入讀入用戶輸入到標準輸出或者一個文件:
# 輸出到文件
$ dd of=test bs=10 count=1 # 或者 dd if=/dev/stdin of=test bs=10 count=1
# 輸出到標準輸出
$ dd if=/dev/stdin of=/dev/stdout bs=10 count=1
# 注在打完了這個命令后兜畸,繼續(xù)在終端打字呈驶,作為你的輸入
上述命令從標準輸入設備讀入用戶輸入(缺省值拷泽,所以可省略)然后輸出到 test 文件,bs(block size)用于指定塊大小(缺省單位為 Byte俐东,也可為其指定如'K','M'订晌,'G'等單位)虏辫,count用于指定塊數(shù)量。如上圖所示锈拨,指定只讀取總共 10 個字節(jié)的數(shù)據(jù)砌庄,當我輸入了“hello my lod”之后加上空格回車總共 12個字節(jié)(一個英文字符占一個字節(jié))內容,顯然超過了設定大小奕枢。
使用du和cat命令看到的寫入完成文件實際內容確實只有 10 個字節(jié)
(有的情況會出現(xiàn)黑百分號娄昆,那個黑底百分號表示這里沒有換行符),而其他的多余輸入將被截取并保留在標準輸入。
前面說到dd在拷貝的同時還可以實現(xiàn)數(shù)據(jù)轉換缝彬,那下面就舉一個簡單的例子:將輸出的英文字符轉換為大寫再寫入文件:
$ dd if=/dev/stdin of=test bs=10 count=1 conv=ucase
你可以在man文檔中查看其他所有轉換參數(shù)萌焰。使用 dd 命令創(chuàng)建虛擬鏡像文件通過上面一小節(jié),你應該掌握了dd的基本使用谷浅,下面就來使用dd命令來完成創(chuàng)建虛擬磁盤的第一步扒俯。
從/dev/zero設備創(chuàng)建一個容量為 256M 的空文件:
$ dd if=/dev/zero of=virtual.img bs=1M count=256$ du -h virtual.img
然后我們要將這個文件格式化(寫入文件系統(tǒng))奶卓,這里我們要學到一個(準確的說是一組)新的命令來完成這個需求。
使用 mkfs 命令格式化磁盤(我們這里是自己創(chuàng)建的虛擬磁盤鏡像)你可以在命令行輸入 sudo mkfs 然后按下Tab鍵撼玄,你可以看到很多個以 mkfs 為前綴的命令夺姑,這些不同的后綴其實就是表示著不同的文件系統(tǒng),可以用 mkfs 格式化成的文件系統(tǒng)掌猛。我們可以簡單的使用下面的命令來將我們的虛擬磁盤鏡像格式化為ext4文件系統(tǒng):
$ sudo mkfs.ext4 virtual.img
可以看到實際 mkfs.ext4 是使用 mke2fs 來完成格式化工作的盏浙。mke2fs 的參數(shù)很多,不過我們也不會經常格式化磁盤來玩荔茬,所以就掌握這基本用法吧废膘,等你有特殊需求時,再查看 man 文檔解決兔院。
更多關于文件系統(tǒng)的知識殖卑,請查看wiki:文件系統(tǒng)ext3,ext4
如果你想知道 Linux 支持哪些文件系統(tǒng)你可以輸入
ls -l /lib/modules/$(uname -r)/kernel/fs
uname -r查看系統(tǒng)信息命令
使用 mount 命令掛載磁盤到目錄樹用戶在 Linux/UNIX 的機器上打開一個文件以前,包含該文件的文件系統(tǒng)必須先進行掛載的動作坊萝,此時用戶要對該文件系統(tǒng)執(zhí)行 mount 的指令以進行掛載孵稽。該指令通常是使用在 USB 或其他可移除存儲設備上,而根目錄則需要始終保持掛載的狀態(tài)十偶。又因為 Linux/UNIX 文件系統(tǒng)可以對應一個文件而不一定要是硬件設備菩鲜,所以可以掛載一個包含文件系統(tǒng)的文件到目錄樹。
Linux/UNIX 命令行的 mount 指令是告訴操作系統(tǒng)惦积,對應的文件系統(tǒng)已經準備好接校,可以使用了,而該文件系統(tǒng)會對應到一個特定的點(稱為掛載點)狮崩。掛載好的文件蛛勉、目錄、設備以及特殊文件即可提供用戶使用睦柴。
我們先來使用mount來查看下主機已經掛載的文件系統(tǒng):
mount
輸出的結果中每一行表示一個設備或虛擬設備,每一行最前面是設備名诽凌,然后是 on 后面是掛載點,type 后面表示文件系統(tǒng)類型坦敌,再后面是掛載選項(比如可以在掛載時設定以只讀方式掛載等等)侣诵。
那么我們如何掛載真正的磁盤到目錄樹呢,mount命令的一般格式如下:mount [options] [source] [directory]
一些常用操作:
mount [-o [操作選項]] [-t 文件系統(tǒng)類型] [-w|--rw|--ro] [文件系統(tǒng)源] [掛載點]
我們現(xiàn)在直接來掛載我們創(chuàng)建的虛擬磁盤鏡像到/mnt目錄:
mount -o loop -t ext4 virtual.img /mnt # 也可以省略掛載類型狱窘,很多時候 mount 會自動識別
# 以只讀方式掛載
mount -o loop --ro virtual.img /mnt
# 或者mount -o loop,ro virtual.img /mnt
使用 umount 命令卸載已掛載磁盤
# 命令格式 sudo umount 已掛載設備名或者掛載點杜顺,
umount /mnt
另外關于 loop 設備,你可能會有諸多疑問,那么請看下面來自維基百科/dev/loop的說明:
在類 UNIX 系統(tǒng)中蘸炸,/dev/loop(或稱vnd (vnode disk)躬络、lofi(循環(huán)文件接口))是一種偽設備,這種設備使得文件可以如同塊設備一般被訪問搭儒。
在使用之前洗鸵,循環(huán)設備必須與現(xiàn)存文件系統(tǒng)上的文件相關聯(lián)越锈。這種關聯(lián)將提供給用戶一個應用程序接口,接口將允許文件視為塊特殊文件(參見設備文件系統(tǒng))使用膘滨。因此甘凭,如果文件中包含一個完整的文件系統(tǒng),那么這個文件就能如同磁盤設備一般被掛載火邓。
這種設備文件經常被用于光盤或是磁盤鏡像丹弱。通過循環(huán)掛載來掛載包含文件系統(tǒng)的文件,便使處在這個文件系統(tǒng)中的文件得以被訪問铲咨。這些文件將出現(xiàn)在掛載點目錄躲胳。如果掛載目錄中本身有文件,這些文件在掛載后將被禁止使用纤勒。
使用 fdisk 為磁盤分區(qū)(關于分區(qū)的一些概念不清楚的用戶請參看主引導記錄)
# 查看硬盤分區(qū)表信息
fdisk -l
輸出結果中開頭顯示了主機上的磁盤的一些信息坯苹,包括容量扇區(qū)數(shù),扇區(qū)大小摇天,I/O 大小等信息粹湃。
我們重點看一下中間的分區(qū)信息,/dev/sda1泉坐,/dev/sda2 為主分區(qū)分別安裝了 Linux 操作系統(tǒng) linux擴展为鳄,/dev/sda3 為交換分區(qū)(可以理解為虛擬內存)
# 進入磁盤分區(qū)模式
fdisk virtual.img
在進行操作前我們首先應先規(guī)劃好我們的分區(qū)方案,這里我將在使用 128M(可用 127M 左右)的虛擬磁盤鏡像創(chuàng)建一個 30M 的主分區(qū)剩余部分為擴展分區(qū)包含 2 個大約 45M 的邏輯分區(qū)腕让。操作完成后輸入p查看結果如下:
最后不要忘記輸入w寫入分區(qū)表孤钦。使用 losetup 命令建立鏡像與回環(huán)設備的關聯(lián)同樣因為環(huán)境原因中沒有物理磁盤,也沒有 loop device 的原因我們就無法實驗練習使用該命令了纯丸,下面我將以我的物理主機為例講解偏形。
$ sudo losetup /dev/loop0 virtual.img
# 如果提示設備忙你也可以使用其它的回環(huán)設備,"ls /dev/loop*"參看所有回環(huán)設備# 解除設備關聯(lián)
$ sudo losetup -d /dev/loop0
然后再使用mkfs格式化各分區(qū)(前面我們是格式化整個虛擬磁盤鏡像文件或磁盤)觉鼻,不過格式化之前俊扭,我們還要為各分區(qū)建立虛擬設備的映射,用到kpartx工具滑凉,需要先安裝:
$ sudo apt-get install kpartx
$ sudo kpartx -av /dev/loop0# 取消映射
$ sudo kpartx -dv /dev/loop0
接著再是格式化统扳,我們將其全部格式化為 ext4:
$ sudo mkfs.ext4 -q /dev/mapper/loop0p1
$ sudo mkfs.ext4 -q /dev/mapper/loop0p5
$ sudo mkfs.ext4 -q /dev/mapper/loop0p6
格式化完成后在/media目錄下新建四個空目錄用于掛載虛擬磁盤:
$ mkdir -p /media/virtualdisk_{1..3}
# 掛載磁盤分區(qū)
$ sudo mount /dev/mapper/loop0p1 /media/virtualdisk_1
$ sudo mount /dev/mapper/loop0p5 /media/virtualdisk_2
$ sudo mount /dev/mapper/loop0p6 /media/virtualdisk_3# 卸載磁盤分區(qū)
$ sudo umount /dev/mapper/loop0p1
$ sudo umount /dev/mapper/loop0p5
$ sudo umount /dev/mapper/loop0p6
然后:
$ df -h
輕松一下cowsay命令喘帚,可以讓你在終端里以一種動物說話的形式打印出一段話畅姊。
我這邊用的centos 將apt-get install換成yum install
# 安裝
$ sudo apt-get install cowsay # 默認是一只牛
$ cowsay hello shiyanlou
# 加上'-l'參數(shù)打印所有支持的動物(其實不只是動物)種類
$ cowsay -l # 使用'-f'參數(shù)選擇動物種類
$ cowsay -f elephant hello shiyanlou
# 此外它還可以結合我們之前的作業(yè)講過的 fortune 命令一起使用
$ cowsay -f dragon-and-cow I want to eat you
四、作業(yè)
小明在管理服務器的時候發(fā)現(xiàn)空間不足了吹由,他找到了一個目錄若未,這個目錄占用的空間異常的大,他需要找到這個目錄中占用最大的前10個文件倾鲫,但是這個目錄下面的內容太多了粗合,或許一條命令就能夠幫助到他萍嬉,這條命令該怎么寫呢?
簡而言之 找出當前目錄下面占用最大的前十個文件
目前沒有單個命令來完成查找的工作隙疚,通橙雷罚可以使用一些命令的組合來幫助您找出磁盤上比較占用空間的文件或者文件夾。主要用到下面的三個命令:
du : 計算出單個文件或者文件夾的磁盤空間占用.
sort : 對文件行或者標準輸出行記錄排序后輸出.
head : 輸出文件內容的前面部分.
用下面的命令組合就可以完成上述查找工作:
1 # du -a -h /var | sort -n -r | head -n 10
head用法
用法:head [選項]... [文件]...
將每個指定文件的頭10 行顯示到標準輸出供屉。
如果指定了多于一個文件行冰,在每一段輸出前會給出文件名作為文件頭。
如果不指定文件伶丐,或者文件為"-"悼做,則從標準輸入讀取數(shù)據(jù)。
長選項必須使用的參數(shù)對于短選項時也是必需使用的哗魂。
-c, --bytes=[-]K 顯示每個文件的前K 字節(jié)內容肛走;
如果附加"-"參數(shù),則除了每個文件的最后K字節(jié)數(shù)據(jù)外
顯示剩余全部內容
-n, --lines=[-]K 顯示每個文件的前K 行內容录别;
如果附加"-"參數(shù)朽色,則除了每個文件的最后K 行外顯示
剩余全部內容
-q, --quiet, --silent 不顯示包含給定文件名的文件頭
-v, --verbose 總是顯示包含給定文件名的文件頭
--help 顯示此幫助信息并退出
--version 顯示版本信息并退出
K 后面可以跟乘號:
b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,
GB 1000*1000*1000, G 1024*1024*1024, 對于T, P, E, Z, Y 同樣適用。
sort(選項)(參數(shù)) 選項
-b:忽略每行前面開始出的空格字符庶灿;
-c:檢查文件是否已經按照順序排序纵搁;
-d:排序時,處理英文字母往踢、數(shù)字及空格字符外腾誉,忽略其他的字符;
-f:排序時峻呕,將小寫字母視為大寫字母利职;
-i:排序時,除了040至176之間的ASCII字符外瘦癌,忽略其他的字符猪贪;
-m:將幾個排序號的文件進行合并;
-M:將前面3個字母依照月份的縮寫進行排序讯私;
-n:依照數(shù)值的大小排序热押;
-o<輸出文件>:將排序后的結果存入制定的文件;
-r:以相反的順序來排序斤寇;
-t<分隔字符>:指定排序時所用的欄位分隔字符桶癣;
+<起始欄位>-<結束欄位>:以指定的欄位來排序,范圍由起始欄位到結束欄位的前一欄位娘锁。
如果需要輸出可讀性高的內容牙寞,請使用如下命令:
1 du -hsx * | sort -rh | head -10