本節討論設備級別的數據處理。對於諸如硬盤之類的物理存儲器、網絡存儲器以及像RAID(獨立冗餘磁盤陳列)和LVM(邏輯卷管理)之類的虛擬存儲器,Linux都有驚人的處理能力。
本節主要用到以下命令
- mount: 掛載文件系統
- umount: 卸載文件系統
- fdisk: 硬盤分區命令
- mkfs:創建文件系統
0.參考文獻
《Linux命令行大全》 [美] William E. Shotts. Jr 著 郭光偉 郝記生 譯, 人民郵電出版社
更多有用的Linux知識詳解,可參加博主的Linux學習導航頁
1.掛載、卸載存儲設備
Linux圖形界面操作在多數情況下,設備只要連接上系統就能運行。由於像服務器這類的非圖形界面操作系統通常都有一些極致的存儲需求和複雜的配置要求,所以這類系統中管理存儲設備很大程度上還是靠手動操作。
管理存儲設備首先要做的就是將該設備添加到文件系統樹中,從而允許操作系統可以操作該設備,這個過程稱之爲掛載。
注意,類Unix操作系統,與Linux相似,都只有一個文件系統樹,設備則都連接到樹的不同點上。這與Windows不同,它對於每個設備都有獨立的樹(如C:\、D:\等)。
/etc/fstab
文件內容列出了系統啓動時掛載的設備(通常是硬盤分區)。例如,博主的TX2上文件內容爲
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/root / ext4 defaults 0 1
表1 /etc/fatab文件6個參數含義
字段 | 內容 | 描述 |
---|---|---|
1 | 設備 | 通常,該字段表示的是與物理設備相關的設備文件的真實名稱。比如/dev/hda1就表示第一個IDE通道上的主設備的第一塊分區。但是如今的計算機有很多可熱拔插的設備(像USB驅動器),所以許多較新的Linux發行版用文本標籤來關聯設備。當設備與系統連接後,該標籤(格式化後就會加到存儲介質中)就會被操作系統識別。通過這樣的方式,不管實際的物理設備被分配到哪個設備文件,它仍然能被正確識別。 |
2 | 掛載節點 | 設備附加到文件系統樹的的目錄 |
3 | 文件系統類型 | Linux可以掛載很多文件系統類型,最常見的原始文件系統是ext3,但也支持許多其它系統如FAT16(msdos)、FAT32(vfat)、NTFS(ntfs)、CD-ROM(iso9660)等 |
4 | 選項 | 文件系統掛載時可以使用許多選項參數,比如,可以設置文件系統以只讀的方式掛載或者阻止任何程序修改它們(對於可移動設備是一個很有用的維護安全性的方法) |
5 | 頻率 | 此數值被dump命令用來決定是否對該文件系統進行備份以及多久備份一次 |
6 | 優先級 | 此數值被fsck命令用來決定在啓動時需要被掃描的文件系統的順序 |
1.1 查看已掛在的文件系統列表
mount命令用於文件系統掛載。不帶任何參數輸入該命令將會調出目前已經掛載的文件系統列表。
$ mount
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
none on /dev type devtmpfs (rw,relatime,size=3984564k,nr_inodes=996141,mode=755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/debug type cgroup (rw,nosuid,nodev,noexec,relatime,debug)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=26,pgrp=1,timeout=0,minproto=5,maxproto=5,direct)
mqueue on /dev/mqueue type mqueue (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
sunrpc on /run/rpc_pipefs type rpc_pipefs (rw,relatime)
configfs on /sys/kernel/config type configfs (rw,relatime)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=804864k,mode=700,uid=1000,gid=1000)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
列表的格式爲:
device on mount_point type filesystem_type(options)
當我們爲TX2(ubuntu 18.04)插入一個移動硬盤(我的硬盤分了兩個區)的時候,最後一行多出如下:
/dev/sda2 on /media/deeid-2/生活娛樂 type fuseblk (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096,uhelper=udisks2)
/dev/sda1 on /media/deeid-2/I type fuseblk (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096,uhelper=udisks2)
以第二個條目來說,表示名爲/dev/sda1的設備已經掛載了/media/deeid-2/I目錄下,並且是fuseblk類型。
獲取設備名後,便可以卸載該設備,然後將其掛載到系統樹的另外一個節點上。進行此操作,必須首先獲得超級用戶權限,再使用umount
命令卸載設備。
$ sudo umount /dev/sda1
接下來,爲其創建一個新的掛載節點。掛載節點僅僅是文件系統上的某個目錄,並沒有什麼特別之處。甚至不需要是空目錄。儘管在非空目錄上掛載設備,該目錄下原有內容將不可見直到此設備被卸載。
例如,創建一個新目錄
$ mkdir ~/test/
$ sudo mount -t fuseblk /dev/sda1 ~/test/
之後,就可以通過新建的掛載節點訪問移動硬盤的內容:
$ cd ~/test/
$ ls
注意,此時如果想卸載移動硬盤會出現報錯
$ sudo umount /dev/sda1
umount: /dev/sda1: device is busy
這是由於設備正在被某人或是某程序使用時是不能被卸載的。當下工作目錄是移動硬盤的掛載節點,所以導致了錯誤警告。退出該工作目錄即可。
1.2 確定設備名稱
如果操作的是一臺服務器或者不支持自動掛載的情況,如何確定設備名稱?
首先了解系統是如何命名設備的
$ ls /dev
發現輸出大量設備,ls命令輸出的表單揭示了設備命的一些固定模式,部分如表2。
表2 Linux存儲設備名稱
模式 | 設備 |
---|---|
/dev/fd* | 軟盤驅動器 |
/dev/hd* | 較舊系統上的IDE(或PATA)硬盤 |
/dev/lp* | 打印機設備 |
/dev/sd* | SCSI硬盤,在最近的Linux系統上,內核把所有的類硬盤設備(包括PATA/SATA硬盤、閃存、USB海量存儲設備比如便攜式音樂播放器或數碼相機等)都當做SCSI硬盤 |
/dev/sr* | 光驅(CD/DV播放機和刻錄機) |
2.創建新的文件系統
將一個使用FAT32文件系統的閃存驅動器重新格式化爲Linux本地文件系統。需要兩個步驟:
- Step1: (可選)在對現有分區不滿意的情況下創建一個新的分區佈局
- Step2: 在驅動器上創建一個新的空文件系統
2.1 用fdisk命令進行磁盤分區
fdisk
命令實現用戶和磁盤設備(比如硬盤驅動器和閃存驅動器)進行較低層次的直接交互。該工具用來編輯、刪除以及創建設備分區。使用閃存前,我們必須將其卸載,然後再啓動fdisk程序。
$ sudo umount /dev/sda1
$ sudo fdisk /dev/sda1
注意,設備名稱要根據你的實際情況來。
程序啓動後,會出現下面的指定信息:
Command (m for help):
輸入m後顯示如下菜單:
DOS (MBR)
a toggle a bootable flag
b edit nested BSD disklabel
c toggle the dos compatibility flag
Generic
d delete a partition
F list free unpartitioned space
l list known partition types
n add a new partition
p print the partition table
t change a partition type
v verify the partition table
i print information about a partition
Misc
m print this menu
u change display/entry units
x extra functionality (experts only)
Script
I load disk layout from sfdisk script file
O dump disk layout to sfdisk script file
Save & Exit
w write table to disk and exit
q quit without saving changes
Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty DOS partition table
s create a new empty Sun partition table
首先,查看現有的磁盤分區佈局,可以通過輸入字母p
打印顯示設備的分區表:
Command (m for help): p
Disk /dev/sda1: 115.5 GiB, 124016132096 bytes, 242219008 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x73736572
Device Boot Start End Sectors Size Id Type
/dev/sda1p1 1920221984 3736432267 1816210284 866G 72 unknown
/dev/sda1p2 1936028192 3889681299 1953653108 931.6G 6c unknown
/dev/sda1p3 0 0 0 0B 0 Empty
/dev/sda1p4 27722122 27722568 447 223.5K 0 Empty
然後輸入l
,一張包含所有可能分區類型的對照表便顯示出來。查表,可以看到Linux分區類型用83表示。
回到程序菜單,會看到用來改變區分ID的菜單選項
t change a partition type
在提示框輸入t和新的ID:
Command (m for help): t
Partition number (1-4, default 4): 1
Hex code (type L to list all codes): 83
Changed type of partition 'unknown' to 'Linux'.
完成了分區ID的修改,到目前爲止,設備一直處於未開發狀態(所有的變化都存儲在了內存中而非物理設備上),所以下一步我們就該向設備寫入修改後的分區表,然後退出。
Command (m for help): w
The partition table has been altered.
Syncing disks.
2.2 用mkfs命令創建新的文件系統
在編輯分區結束後,mkfs
(make filesystem)命令可以來創建各種類型的文件系統。例如如果我們想在設備上創建ext4文件系統,可以
sudo mkfs -t ext4 /dev/sda1
mke2fs 1.44.1 (24-Mar-2018)
/dev/sda1 contains a ntfs file system
Proceed anyway? (y,N) y
Creating filesystem with 30277376 4k blocks and 7569408 inodes
Filesystem UUID: 2ac43b2e-7f84-4832-85bb-ef71809b8785
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872
Allocating group tables: done
Writing inode tables: done
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information:
20:47:15 up 2:08, 2 users, load average: 3.90, 2.87, 1.90
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
deeid-2 :0 :0 18:39 ?xdm? 7:55 0.01s /usr/lib/gdm3/gdm-x-session --run-script /usr/lib/gnome-session/run-systemd-se
deeid-2 pts/2 192.168.31.209 19:20 0.00s 1.29s 0.04s w
deeid-2@deepid2-desktop:~$ e
-bash: e: command not found
deeid-2@deepid2-desktop:~$
deeid-2@deepid2-desktop:~$ r
-bash: r: command not found
deeid-2@deepid2-desktop:~$ w
20:47:15 up 2:08, 2 users, load average: 3.90, 2.87, 1.90
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
deeid-2 :0 :0 18:39 ?xdm? 7:56 0.01s /usr/lib/gdm3/gdm-x-session --run-script /usr/lib/gnome-session/run-systemd-se
deeid-2 pts/2 192.168.31.209 19:20 0.00s 1.28s 0.03s w
這種分區及格式化過程適用於任何有額外存儲設備插入系統的時候。