Linux Shell之監測磁盤空間
系統管理員的另一個重要任務就是監測系統磁盤的使用情況。不管運行的是簡單Linux台式機還是大型的Linux服務器,我們都要知道還有多少空間可以留給應用程序。事實上,就算你不是系統管理員,開發人員也好,個人用戶也好,你也得知道這些。
一、掛載存儲媒體
Linux文件系統將所有的磁盤都並入一個虛擬目錄下。在使用新的存儲媒體之前,需要把它放到虛擬目錄下。這項工作成為掛載(mounting)。
在今天的圖形化桌面環境里,大多數Linux發行版都能自動掛載特定類型的可移動存儲媒體。可移動存儲媒體指的是可從PC上輕易移除的媒體,比如CD-ROM、軟盤和U盤。
如果用的發行版不支持自動掛載和卸載可移動存儲媒體,就必須手動完成。下面將介紹一些可以幫你管理可移動存儲設備的Linux命令行命令。
1、mount命令
1 xiaoyu@ubuntu:~$ mount
2 sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) 3 proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) 4 udev on /dev type devtmpfs (rw,nosuid,relatime,size=1978072k,nr_inodes=494518,mode=755) 5 devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) 6 tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=401568k,mode=755) 7 /dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered) 8 securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime) 9 tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev) 10 tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k) 11 tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755) 12 cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd) 13 pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime) 14 cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory) 15 cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio) 16 cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer) 17 cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices) 18 cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb) 19 cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids) 20 cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event) 21 cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct) 22 cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio) 23 cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset) 24 cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma) 25 systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=22,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=21940) 26 mqueue on /dev/mqueue type mqueue (rw,relatime) 27 debugfs on /sys/kernel/debug type debugfs (rw,relatime) 28 hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M) 29 fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime) 30 configfs on /sys/kernel/config type configfs (rw,relatime) 31 vmware-vmblock on /run/vmblock-fuse type fuse.vmware-vmblock (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other) 32 vmhgfs-fuse on /mnt/hgfs type fuse.vmhgfs-fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other) 33 tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=401568k,mode=700,uid=1000,gid=1000) 34 gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000) 35 xiaoyu@ubuntu:~$
mount命令提供如下四部分信息:
- 媒體的設備文件名
- 媒體掛載到虛擬目錄的掛載點
- 文件系統類型
- 已掛載媒體的訪問狀態
要手動在虛擬目錄中掛載設備,需要以root用戶身份登錄,或是以root用戶身份運行sudo命令。下面是手動掛載媒體設備的基本命令:
mount -t type device directory
type參數指定了磁盤被格式化的文件系統類型。Linux可以識別非常多的文件系統類型。如果是和Windows PC公用這些存儲設備,通常得使用下列文件系統類型。
- vfat:Windows長文件系統。
- ntfs:Windows NT、XP、Vista以及Windows 7中廣泛使用的高級文件系統。
- iso9660:標准CD-ROM文件系統。
大多數U盤和軟盤會被格式化成vfat文件系統。而數據CD則必須使用iso9660文件系統類型。
后面兩個參數定義了該存儲設備的設備文件的位置以及掛載點在虛擬目錄中的位置。比如說,手動將U盤/dev/sdb1掛載到/media/disk,可用下面的命令:
mount -t vfat /dev/sdb1 /media/disk
媒體設備掛載到了虛擬目錄后,root用戶就有了對該設備的所有訪問權限,而其他用戶的訪問則會被限制。你可以通過目錄權限(將在第7章中介紹)指定用戶對設備的訪問權限。
如果要用到mount命令的一些高級功能,表4-5中列出了可用的參數。
參數 | 描述 |
-a | 掛載/etc/fstab文件中指定的所有文件系統 |
-f | 使mount命令模擬掛載設備,但並不真的掛載 |
-F | 和-a參數一起使用時,會同時掛載所有文件系統 |
-v | 詳細模式,將會說明掛載設備的每一步 |
-I | 不啟用任何/sbin/mount.filesystem下的文件系統幫助文件 |
-l | 給ext2、ext3或XFS文件系統自動添加文件系統標簽 |
-n | 掛載設備,但不注冊到/etc/mtab已掛載設備文件中 |
-p | num 進行加密掛載時,從文件描述符num中獲得密碼短語 |
-s | 忽略該文件系統不支持的掛載選項 |
-r | 將設備掛載為只讀的 |
-w | 將設備掛載為可讀寫的(默認參數) |
-L | label 將設備按指定的label掛載 |
-U | uuid 將設備按指定的uuid掛載 |
-O | 和-a參數一起使用,限制命令只作用到特定的一組文件系統上 |
-o | 給文件系統添加特定的選項 |
-o參數允許在掛載文件系統時添加一些以逗號分隔的額外選項。以下為常用的選項
- ro:以只讀形式掛載。
- rw:以讀寫形式掛載。
- user:允許普通用戶掛載文件系統。
- check=none:掛載文件系統時不進行完整性校驗。
- loop:掛載一個文件。
2、umount命令
從Linux系統上移除一個可移動設備時,不能直接從系統上移除,而應該先卸載。
Linux上不能直接彈出已掛載的CD。如果你在從光驅中移除CD時遇到麻煩,通常是因為該CD還掛載在虛擬目錄里。先卸載它,然后再去嘗試彈出。
umount [directory | device ]
umount命令支持通過設備文件或者是掛載點來指定要卸載的設備。如果有任何程序正在使用設備上的文件,系統就不會允許你卸載它:
如果在卸載設備時,系統提示設備繁忙,無法卸載設備,通常是有進程還在訪問該設備或使用該設備上的文件。這時可用lsof命令獲得使用它的進程信息,然后在應用中停止使用該設備或停止該進程。lsof命令的用法很簡
單:lsof /path/to/device/node,或者lsof /path/to/mount/point。
二、使用df命令
有時我們需要知道在某個設備上還有多少磁盤空間。df命令可以讓你很方便地查看所有已掛載磁盤的使用情況。
1 xiaoyu@ubuntu:~$ df
2 Filesystem 1K-blocks Used Available Use% Mounted on 3 udev 1978072 0 1978072 0% /dev 4 tmpfs 401568 6312 395256 2% /run 5 /dev/sda1 60809268 5392228 52305004 10% /
6 tmpfs 2007832 33480 1974352 2% /dev/shm 7 tmpfs 5120 4 5116 1% /run/lock 8 tmpfs 2007832 0 2007832 0% /sys/fs/cgroup 9 vmhgfs-fuse 105417592 163228 105254364 1% /mnt/hgfs 10 tmpfs 401568 60 401508 1% /run/user/1000
11 xiaoyu@ubuntu:~$
df命令會顯示每個有數據的已掛載文件系統。如你在前例中看到的,有些已掛載設備僅限系統內部使用。命令輸出如下:
- 設備的設備文件位置;
- 能容納多少個1024字節大小的塊;
- 已用了多少個1024字節大小的塊;
- 還有多少個1024字節大小的塊可用;
- 已用空間所占的比例;
- 設備掛載到了哪個掛載點上。
df命令有一些命令行參數可用,但基本上不會用到。一個常用的參數是-h。它會把輸出中的磁盤空間按照用戶易讀的形式顯示,通常用M來替代兆字節,用G替代吉字節。
1 xiaoyu@ubuntu:~$ df -h 2 Filesystem Size Used Avail Use% Mounted on 3 udev 1.9G 0 1.9G 0% /dev 4 tmpfs 393M 6.2M 386M 2% /run 5 /dev/sda1 58G 5.2G 50G 10% /
6 tmpfs 2.0G 33M 1.9G 2% /dev/shm 7 tmpfs 5.0M 4.0K 5.0M 1% /run/lock 8 tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup 9 vmhgfs-fuse 101G 160M 101G 1% /mnt/hgfs 10 tmpfs 393M 60K 393M 1% /run/user/1000
11 xiaoyu@ubuntu:~$
說明 Linux系統后台一直有進程來處理文件或使用文件。df命令的輸出值顯示的是Linux系統認為的當前值。有可能系統上有運行的進程已經創建或刪除了某個文件,但尚未釋放文件。這個值是不會算進閑置空間的。
三、使用du命令
du命令可以顯示某個特定目錄(默認情況下是當前目錄)的磁盤使用情況。這一方法可用來快速判斷系統上某個目錄下是不是有超大文件。默認情況下,du命令會顯示當前目錄下所有的文件、目錄和子目錄的磁盤使用情況,它會以磁盤塊為單位來表明每個文件或目錄占用了多大存儲空間。對標准大小的目錄來說,這個輸出會是一個比較長的列表。下面是du命令的部分輸出:
1 xiaoyu@ubuntu:~$ du
2 4 ./xiaoyu/my_dir 3 12 ./xiaoyu 4 4 ./Pictures 5 4 ./Public 6 4 ./Documents 7 352 ./vmware-tools-distrib/doc 8 64 ./vmware-tools-distrib/installer 9 180 ./vmware-tools-distrib/vgauth/schemas 10 184 ./vmware-tools-distrib/vgauth 11 7768 ./vmware-tools-distrib/caf/usr/lib/vmware-caf/pme/lib 12 496 ./vmware-tools-distrib/caf/usr/lib/vmware-caf/pme/bin 13 8268 ./vmware-tools-distrib/caf/usr/lib/vmware-caf/pme 14 8272 ./vmware-tools-distrib/caf/usr/lib/vmware-caf 15 8276 ./vmware-tools-distrib/caf/usr/lib 16 8280 ./vmware-tools-distrib/caf/usr 17 72 ./vmware-tools-distrib/caf/etc/vmware-caf/pme/config 18 68 ./vmware-tools-distrib/caf/etc/vmware-caf/pme/scripts 19 92 ./vmware-tools-distrib/caf/etc/vmware-caf/pme/install
20 236 ./vmware-tools-distrib/caf/etc/vmware-caf/pme 21 240 ./vmware-tools-distrib/caf/etc/vmware-caf
每行輸出左邊的數值是每個文件或目錄占用的磁盤塊數。注意,這個列表是從目錄層級的最底部開始,然后按文件、子目錄、目錄逐級向上。
這么用du命令(不加參數,用默認參數)作用並不大。我們更想知道每個文件和目錄占用了多大的磁盤空間,但如果還得逐頁查找的話就沒什么意義了。
下面是能讓du命令用起來更方便的幾個命令行參數。
- -c:顯示所有已列出文件總的大小。
- -h:按用戶易讀的格式輸出大小,即用K替代千字節,用M替代兆字節,用G替代吉字節。
- -s:顯示每個輸出參數的總計。