一.掛載和卸載文件系統
將額外文件系統與根文件系統某現存的目錄建立起關聯關系。進而使得此目錄做為其它文件訪問入口的行為稱之為掛載
根文件系統之外的其它文件系統要想能夠被訪問,都必須通過“關聯”至根文件系統上的某個目錄來實現,此關聯操作即為“掛載”;此目錄即為“掛載點”;
掛載點:mount_point,用於作為另一個文件系統的訪問入口;
(1) 事先存在;
(2) 應該使用未被或不會被其它進程使用到的目錄;
(3) 掛載點下原有的文件將會被隱藏;
注意:1、一個掛載點同一時間只能掛一個設備!
2、一個設備可以掛載在多個文件夾下,只不過看到的內容都是一樣的
3、掛載點最好是空文件夾,否則原來的文件會被暫時隱藏,直到被卸載后才會顯現出來。
1.1 mount
mount [-fnrsvw] [-t vfstype] [-o options] device dir
- device:指明要掛載的設備;
- (1) 設備文件:例如/dev/sda5
- (2) 卷標:-L 'LABEL', 例如 -L 'MYDATA'
- (3) UUID, -U 'UUID':例如 -U '0c50523c-43f1-45e7-85c0-a126711d406e'
- (4) 偽文件系統名稱:proc, sysfs, devtmpfs, configfs
- dir:掛載點
- 事先存在;建議使用空目錄
- 進程正在使用中的設備無法被卸載
補充:
如何在不重啟的情況下在虛擬機識別新增的硬盤echo "- - -" > /sys/class/scsi_host/host0/scan
mount # 通過查看/etc/mtab文件顯示當前已掛載的所有設備,該文件自動更新,記載設備掛載情況
mount label=name /data/mnt # 用卷標掛載 mount UUID="e206a05c-e04e-400c-8081-01fa18e079d4" /data/mnt # 用UUID掛載,由於uuid穩定唯一,所以盡量用uuid去掛載 # option: -t vsftype:指定要掛載的設備上的文件系統類型 -r: readonly,只讀掛載 -w: read and write, 讀寫掛載 -n: 不更新/etc/mtab,mount不可見 (cat /proc/mounts可見) -a:自動掛載所有支持自動掛載的設備(定義在了/etc/fstab文件中,且掛載選項中有auto功能) -L 'LABEL': 以卷標指定掛載設備 -U 'UUID': 以UUID指定要掛載的設備 -B, --bind: 綁定目錄到另一個目錄上; 注:查看內核追蹤到的已掛載的所有設備:cat /proc/mounts
# -o options:(掛載文件系統的選項),多個選項使用逗號分隔 (啟用和禁用的特性) async:異步模式,默認 sync:同步模式,內存更改時,同時寫磁盤 atime/noatime:包含目錄和文件 diratime/nodiratime:目錄的訪問時間戳 auto/noauto:是否支持自動掛載,是否支持-a選項 exec/noexec:是否支持將文件系統上運行應用程序
dev/nodev:是否支持在此文件系統上使用設備文件 suid/nosuid:是否支持suid和sgid權限 remount:重新掛載,不影響其他正在使用設備的用戶 ro:只讀 rw:讀寫 user/nouser:是否允許普通用戶掛載此設備,/etc/fstab使用 禁止普通用戶掛載 acl:啟用此文件系統上的acl功能 noacl:關閉acl功能 mount -o noacl,remount /dev/sdb1 /data/mnt loop: 使用loop設備 defaults:相當於rw, suid, dev, exec, auto, nouser, async findmnt MOUNT_POINT|device # 查看掛載情況,已經掛載顯示相應掛載情況,無掛載則無輸出;可用於寫腳本 findmnt /data/mnt &> /dev/dull || mount /dev/sdb2 /data/mnt lsof MOUNT_POINT fuser -v MOUNT_POINT # 查看正在訪問指定文件系統的進程 fuser -km MOUNT_POINT # 終止所有在正訪問指定的文件系統的進程
卸載
umount DEVICE umount MOUNT_POINT # 卸載
因此,mount命令可將將分區、文件夾(-B)、文件(loop) 都可以掛載在空文件夾上
補充:loop設備,可以在文件系統中創建一個設備文件,該設備文件可以分區,可以掛載
centos6 最多只能掛8個loop設備
ls /dev/loop*
但是,可以創建mknod /dev/loop8 b 7 8
centos6上創建第8個loop設備
dd if=/dev/zero of=/data/test_loop bs=1M count=500 # 創建loop設備
mkfs.ext4 test_loop # 格式化
mount -o loop test_loop /data/mnt # 掛載,centos6上需加-o loop選項,即我們實現了將一個文件掛載在文件夾上。
二、 /etc/fstab
fstab文件包含了你的電腦上的存儲設備及其文件系統的信息。它是決定一個硬盤(分區)被怎樣使用或者說整合到整個系統中的文件。具體來說:用fstab可以自動掛載各種文件系統格式的硬盤、分區、可移動設備和遠程設備等。對於Windows與Linux雙操作系統用戶,用fstab掛載FAT格式和NTFS格式的分區,可以在Linux中共享windows系統下的資源。
這個文件的全路徑是/etc/fstab。它只是一個文本文件,你能夠用你喜歡的編輯器打開它,但是必須是root用戶才能編輯它。同時fsck、mount、umount的等命令都利用該程序。
/etc/fstab 是啟動時的配置文件,不過,實際 filesystem 的掛載是記錄到 /etc/mtab 與 /proc/mounts 這兩個文件當中的。每次我們在更動 filesystem 的掛載時,也會同時更動這兩個文件喔!
系統掛載的一些限制: •根目錄 / 是必須掛載的﹐而且一定要先於其它 mount point 被掛載進來。 •其它 mount point 必須為已創建的目錄﹐可任意指定﹐但一定要遵守必須的系統目錄架構原則 •所有 mount point 在同一時間之內﹐只能掛載一次。 •所有 partition 在同一時間之內﹐只能掛載一次。 •如若進行卸除﹐您必須先將工作目錄移到 mount point(及其子目錄) 之外。
我們掛載的命令執行結束后僅僅只是在內存在結束,一旦重啟原來的掛載關系都不存在,所以我們要修改配置文件/etc/fstab來保存修改,這樣才永久掛載
該文件很重要,最好備份。
如果出現故障
要掛載的設備或偽文件系統
1.設備文件
LABEL:LABEL=""
UUID:UUID=""
偽文件系統名稱:proc, sysfs
2.掛載點
3.文件系統類型
4.掛載選項:defaults
5.轉儲頻率:0:不做備份 1:每天轉儲 2:每隔一天轉儲
6.自檢次序: 0:不自檢 1:首先自檢;一般只有rootfs才用1
mount -a
無需重啟,掛載/etc/fstab中的所有文件系統
注意:對於loop、光盤、文件夾、一般在fatab中寫設備名
一些特殊掛載在/etc/fatab:
補充:
mknod - make block or character special files # 創建特殊文件
mknod [OPTION]... NAME TYPE [MAJOR MINOR] # type: b # create a block (buffered) special file c, u # create a character (unbuffered) special file mknod zero c 1 5 在 當前設備里創建zero文件,類似/dev/zero文件;注意,要提前cd至該設備的掛載目錄里。 ll /dev/zero /data/zero crw-r--r--. 1 root root 1, 5 Dec 12 17:31 /data/zero crw-rw-rw-. 1 root root 1, 5 Dec 12 14:54 /dev/zero
dd 命令:convert and copy a file
用法:
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
bs=#: block size 復制單元大小
count=# : 復制多少個bs
補充:
簡單刪除一塊磁盤的分區
dd if=/dev/zero of=/dev/sdb bs=1 count=512
備份MBR
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
破壞MBR中的bootloader:
dd if=/dev/zero of=/dev/sda bs=256 count=1
兩個特殊設備:
/dev/null:數據黑洞
/dev/zero:吐零機
三、swap分區一般為內存的2倍
交換文件、交換分區,也叫虛擬內存,是系統RAM的補充 swapon -s # 查看swap信息
創建swap分區;
第一步:fidisk 一個單獨的分區,注意將分區類型改為82!
第二步:makeswap 格式化
第三步:修改/etc/fatab配置文件
第四步:swapon -a 激活全部swap
swapon [OPTION]... [DEVICE] # 啟用swap -a:激活所有的交換分區; -p PRIORITY:指定優先級 禁用 :swapoff [OPTION]... [DEVICE] # 禁用swap /etc/fstab文件中,可以在defaults后面跟pri=value 設置優先級,值越高優先級越高
練習:
1、根據掛載文件名查出該設備名稱。
blkid -U `grep /data /etc/fstab | sed -r "s/UUID=([^ ]*) .*/\1/" `
findfs `grep /data /etc/fstab | cut -d" " -f1 `
實驗1:修改/etc/fstab 中的uuid,可能導致無法啟動,怎么修復
1.根據提示,輸入root的密碼進入bash;
2.在修改/etc/fstab 文件時會提示我們該文件為只讀文件,無法修改。
3.重新掛載/目錄 mount -o rw,remount /dev/sda2 /
重新掛載根目錄
4.再 vim /etc/fstab 修改配置文件,將最后兩位修改為0 0即可。
5.正常重啟
實驗2:將一個文件夾遷移至一個新的磁盤分區,如將/home目錄遷移至新的分區/dev/sdc1。
為避免在cp過程中別的用戶在修改/home,我們可以在操作cp前這么操作init 1
切換至單用戶,也就是說別的終端不允許訪問,只允許單用戶終端訪問,結束操作后再切回至init 5
1 建立新分區
2 建立文件系統
3 mkdir /mnt/home
mount /dev/sda6 /mnt/home
4 cp -av /home/* /mnt/home
5 tar cvf /app/home.tar /home
scp remote
6 init 1 斷開網絡,在遠程不要執行
7 rm -rf /home/*
8 vim /etc/fstab
UUID=b0421d9a-8072-4be5-9526-070535ac0a8e /home ext4 defaults 0 0
9 mount -a
umount /mnt/home
10 init 5 還到原有模式
注意:跟 “/” 目錄無法遷移
3.將CentOS6的CentOS-6.9-x86_64-bin-DVD1.iso和CentOS-6.9-x86_64-bin-DVD2.iso兩個文件,合並成一個CentOS-6.9-x86_64-Everything.iso文件,並將其配置為yum源.
首先現將兩個光盤合成一個
mkdir /data/centos6.9 創建一個空文件夾 cp -av /misc/cd/* /data/centos6.9 # 將正在掛載這的光盤dvd1的內容復制進剛剛創建的centos6.9的空文件夾 eject #將dvd1彈出 再放入dvd2 \cp -av /misc/cd/* /data/centos6.9 # 因為dvd1與dvd2有很多相同的文件,所以在cp前加\表示使用cp的原命令,否則復制過程中每一個相同的文件都會提醒是否覆蓋 mkisofs -r -o CentOS-6.9-x86_64-Everything.iso /data/centos6.9 # 制作iso 注意:制作的這個iso文件只能當yum源使用,無法作為系統啟動光盤,如果要作為系統啟動盤使用還需要去官網下載mkdvdiso腳本制作。 然后掛載 mount -o loop /data/ CentOS-6.9-x86_64-Everything.iso /data/mnt 修改配置文件/etc/yum.repo.d/base.repo 最后 yum clean all yum repolist
4.創建一個2G的文件系統,塊大小為2048byte,預留1%可用空間,文件系統ext4,卷標為TEST,要求此分區開機后自動掛載至/test目錄,且默認有acl掛載選項.
fdisk /dev/sdb # 先分出一個2G的分區 mke2fs -t ext4 -m 1 -b 2048 -L test /dev/sdb1 # 創建文件系統,塊大小為2048byte,預留1%可用空間,文件系統ext4,卷標為TEST vim /etc/fstab # 修改配置文件 UUID=cb17acad-ad9c-40b1-bab1-aa11a9ff9741 /test ext4 defaults,acl 0 0 #添加此條 mount -a
5.寫一個腳本,完成如下功能:
(1) 列出當前系統識別到的所有磁盤設備
(2) 如磁盤數量為1,則顯示其空間使用信息
否則,則顯示最后一個磁盤上的空間使用信息
#!/bin/bash a=`lsblk -l | grep "sd[a-z]\>" |wc -l` b=`lsblk -l | grep "sd[a-z]\>" |cut -d" " -f1 |head -n1` c=`lsblk -l | grep "sd[a-z]\>" |cut -d" " -f1 |tail -n1` [ $a -eq 1 ] && echo "`fdisk -l /dev/$b`" || echo "`fdisk -l /dev/$c`"
注意:跟 “/” 目錄無法遷移