本节讨论设备级别的数据处理。对于诸如硬盘之类的物理存储器、网络存储器以及像RAID(独立冗余磁盘陈列)和LVM(逻辑卷管理)之类的虚拟存储器,Linux都有惊人的处理能力。
本节主要用到以下命令
《Linux命令行大全》 [美] William E. Shotts. Jr 著 郭光伟 郝记生 译, 人民邮电出版社
更多有用的Linux知识详解,可参加博主的Linux学习导航页
Linux图形界面操作在多数情况下,设备只要连接上系统就能运行。由于像服务器这类的非图形界面操作系统通常都有一些极致的存储需求和复杂的配置要求,所以这类系统中管理存储设备很大程度上还是靠手动操作。
管理存储设备首先要做的就是将该设备添加到文件系统树中,从而允许操作系统可以操作该设备,这个过程称之为挂载。
注意,类Unix操作系统,与Linux相似,都只有一个文件系统树,设备则都连接到树的不同点上。这与Windows不同,它对于每个设备都有独立的树(如C:\、D:\等)。
/etc/fstab
文件内容列出了系统启动时挂载的设备(通常是硬盘分区)。例如,博主的TX2上文件内容为
#
/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命令用来决定在启动时需要被扫描的文件系统的顺序 |
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
这是由于设备正在被某人或是某程序使用时是不能被卸载的。当下工作目录是移动硬盘的挂载节点,所以导致了错误警告。退出该工作目录即可。
如果操作的是一台服务器或者不支持自动挂载的情况,如何确定设备名称?
首先了解系统是如何命名设备的
$ 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播放机和刻录机) |
将一个使用FAT32文件系统的闪存驱动器重新格式化为Linux本地文件系统。需要两个步骤:
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.
在编辑分区结束后,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
这种分区及格式化过程适用于任何有额外存储设备插入系统的时候。