Linux mount命令访问文件系统,ISO镜像,USB,网络驱动器

时间:2020-01-09 10:41:48  来源:igfitidea点击:

在本文中,我将介绍使用Linux mount命令执行临时和永久挂载的各种主题。
我们将尝试使用Linux mount命令访问文件系统,U盘,ISO镜像,网络驱动器,并使用带有示例的umount命令来卸载它们。
使用Linux mount命令安装U盘之前,必须知道如何列出U盘并检查Linux中的USB端口,以便知道Linux中已连接的U盘。
我还将分享一些fstab示例,说明fstab选项和使用Linux挂载命令永久挂载的语法。

我已使用RHEL/CentOS 7/8来演示本文中有关Linux安装命令及其用法的示例。

Linux挂载命令场景和示例

下面,我将通过示例介绍使用Linux mount命令临时和永久访问文件系统的各种方案。

挂载文件系统(ext3,ext4,xfs等)

使用Linux mount命令,我们可以挂载各种类型的系统文件系统。
但这仅对当前会话有效(不适用于永久重启)。
对于这种要求,我们可以将/mnt挂载点与Linux挂载命令一起使用。

挂载文件系统的语法

# mount [-t fstype] DEVICE DIR

其中

-t		The argument following the -t is used to indicate the filesystem type.
DEVICE	Here DEVICE is our File System /dev/sdb1
DIR		Here DIR is our target mount point

说明:

如果没有给出-t选项,或者如果指定了自动类型,mount将尝试猜测所需的类型。
Mount使用blkid库来猜测文件系统类型。
如果那没有打开任何看起来很熟悉的东西,mount将尝试读取文件/etc/filesystems,或者如果文件不存在,则读取/proc/filesystems

因此我们可以挂载/dev/sdb1而不指定文件系统类型

# mount /dev/sdb1 /mnt

或者带有-t选项

# mount -t xfs /dev/sdb1 /mnt

要永久地挂载文件系统,必须在/etc/fstab中添加设备和挂载点条目。

我将创建一个新的挂载点目录

# mkdir /mydata

现在我们可以将xfs文件系统/dev/sdb1挂载在/mydata挂载点上。

# mount -t xfs /dev/sdb1 /mydata

但这又是暂时的,要永久挂载文件系统,我们必须以以下fstab格式更新/etc/fstab
我的设置中的fstab示例:

# echo "UUID=2c566ef5-fe73-4e1c-aa71-9a8cd77c0b31       /mydata         xfs     defaults        0 0"  >> /etc/fstab

如何获取UUID和文件系统类型?

使用blkid获取文件系统的UUID

# blkid /dev/sdb1
/dev/sdb1: UUID="2c566ef5-fe73-4e1c-aa71-9a8cd77c0b31" TYPE="xfs" PARTUUID="09181a39-01"

在同一输出中,我们可以看到文件系统类型为XFS

fstab选项有哪些不同?

/etc/fstab中,每列有6个不同的部分,并具有不同的可能选项。
每行分为六个数据字段,用空格隔开。
以下是不同的fstab选项

  • 要挂载的设备(这里我们使用了UUID,或者我们也可以使用/dev/sdb1)。

  • 挂载点(/mydata)。

  • 文件系统类型(xfs)。

  • 挂载选项(默认)。

  • 转储级别(" 0")。
    此字段与转储命令相关,很少使用。

  • fsck传递字段(" 0")。
    值为0表示"在系统引导期间不要在此文件系统上运行fsck",而值为1或者更高的含义是"在系统引导期间在此文件系统上运行fsck"。

挂载ISO文件

挂载ISO文件有两种可能的方案:

  • 从虚拟介质挂载ISO文件

  • 挂载ISO文件DVD

在任何一种情况下,要挂载ISO文件,我们都必须使用iso9660作为文件系统类型以及Linux mount命令。

说明:

在运行GUI的Linux发行版中,当自动安装可移动媒体(例如CD-ROM或者DVD)时,通常会在/media目录下提供它们。
在没有正在运行的GUI的系统上,不会发生此自动挂载过程。
我们可以配置系统,以便普通用户可以使用/etc/fstab条目挂载可移动设备:

虚拟媒体ISO镜像

在RHEL/CentOS 7上,/dev/srX文件系统下的虚拟介质上的任何ISO文件都可用。
例如,我的ISO文件位于/dev/sr0/dev/sr1下。

# lsscsi
[0:0:0:0]    cd/dvd  VBOX     CD-ROM           1.0   /dev/sr0
[1:0:0:0]    cd/dvd  VBOX     CD-ROM           1.0   /dev/sr1
[2:0:0:0]    disk    ATA      VBOX HARDDISK    1.0   /dev/sda

要使用Linux mount命令从虚拟媒体在/media上装载ISO文件,请执行以下操作:

# mount -t iso9660 /dev/sr0 /media
mount: /media: WARNING: device write-protected, mounted read-only.

要使用/etc/fstab永久挂载ISO文件,我们使用类似于fstab格式的语法,就像我们以前用来挂载文件系统一样。
我的设置中的fstab示例

# echo "/dev/sr0        /media         iso9660         defaults        0 0"  >> /etc/fstab

ISO DVD镜像

如果Linux系统上有可用的ISO DVD镜像文件,则可以使用Linux mount命令再次使用iso9660作为文件系统类型来挂载ISO文件DVD:

# mount -t iso9660 -o loop /root/rhel-8.1-x86_64-dvd.iso /media/
mount: /media: WARNING: device write-protected, mounted read-only.

再次使用/etc/fstab永久挂载ISO DVD文件,我们使用类似的fstab格式。
下面是我安装ISO镜像的fstab示例

# echo "/root/rhel-8.1-x86_64-dvd.iso        /media         iso9660         defaults        0 0"  >> /etc/fstab

挂载U盘

在我分享安装U盘的步骤之前,我们必须熟悉检查并列出连接到Linux主机的USB设备并检查USB端口。
有多种方法和命令可用于列出USB设备并检查USB端口,我将尝试在此处共享其中一些:

6条列出USB设备并检查USB端口的命令

下面,将介绍我们可以在Linux中使用的各种命令,以查看和列出连接到Linux主机的USB设备并检查USB端口。

1. Journalctl或者/var/log/messages

我们可以使用journalctl或者/var/log/messages来检查连接到Linux机器的USB端口和列出USB设备。

以下是我在RHEL/CentOS 7/8节点上的/var/log/messages的摘要。
观察突出显示的部分以列出已连接的USB设备。

Nov 20 22:27:33 centos-8 kernel: usb 1-1: new full-speed USB device number 2 using ohci-pci
Nov 20 22:27:33 centos-8 kernel: usb 1-1: config 1 interface 0 altsetting 0 endpoint 0x81 has invalid maxpacket 512, setting to 64
Nov 20 22:27:33 centos-8 kernel: usb 1-1: config 1 interface 0 altsetting 0 endpoint 0x2 has invalid maxpacket 512, setting to 64
Nov 20 22:27:33 centos-8 kernel: usb 1-1: New USB device found, idVendor=0781, idProduct=5567, bcdDevice= 1.00
Nov 20 22:27:33 centos-8 kernel: usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Nov 20 22:27:33 centos-8 kernel: usb 1-1: Product: Cruzer Blade
Nov 20 22:27:33 centos-8 kernel: usb 1-1: Manufacturer: SanDisk
Nov 20 22:27:33 centos-8 kernel: usb 1-1: SerialNumber: 4C531001480518118400
Nov 20 22:27:33 centos-8 kernel: usb-storage 1-1:1.0: USB Mass Storage device detected
Nov 20 22:27:33 centos-8 kernel: scsi host4: usb-storage 1-1:1.0
Nov 20 22:27:33 centos-8 kernel: usbcore: registered new interface driver usb-storage
Nov 20 22:27:33 centos-8 kernel: usbcore: registered new interface driver uas
Nov 20 22:27:34 centos-8 kernel: scsi 4:0:0:0: Direct-Access     SanDisk  Cruzer Blade     1.00 PQ: 0 ANSI: 6
Nov 20 22:27:34 centos-8 kernel: sd 4:0:0:0: Attached scsi generic sg4 type 0
Nov 20 22:27:34 centos-8 kernel: sd 4:0:0:0: [sdc] 30595072 512-byte logical blocks: (15.7 GB/14.6 GiB)
Nov 20 22:27:34 centos-8 kernel: sd 4:0:0:0: [sdc] Write Protect is off
Nov 20 22:27:34 centos-8 kernel: sd 4:0:0:0: [sdc] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
Nov 20 22:27:34 centos-8 kernel: sdc: sdc1
Nov 20 22:27:34 centos-8 kernel: sd 4:0:0:0: [sdc] Attached SCSI removable disk

2. lsusb

我们可以使用lsusb在Linux中检查USB端口。

lsusb工具是" usbutils" rpm的一部分。
因此,请安装usbutils来检查Linux中的USB端口。

例如,我在端口1上连接了一个USB:

# lsusb -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/12p, 12M
    |__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 12M

3. lsscsi

我们可以列出使用lsscsi连接到Linux的所有设备。

因此,要列出USB设备,我们也可以在Linux中使用lsscsi命令。
其中我的U盘安装在/dev/sdc

# lsscsi
[0:0:0:0]    cd/dvd  VBOX     CD-ROM           1.0   /dev/sr0
[1:0:0:0]    cd/dvd  VBOX     CD-ROM           1.0   /dev/sr1
[2:0:0:0]    disk    ATA      VBOX HARDDISK    1.0   /dev/sda
[3:0:0:0]    disk    ATA      VBOX HARDDISK    1.0   /dev/sdb
[4:0:0:0]    disk    SanDisk  Cruzer Blade     1.00  /dev/sdc

4. lsblk

使用lsblk显示和列出连接到Linux机器的USB设备和分区。

# lsblk  /dev/sdc
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdc      8:32   1 14.6G  0 disk
└─sdc1   8:33   1 14.6G  0 part

5. blkid

使用blkid列出USB设备和所有必需的详细信息。

如我们所见,我的U盘是NTFS文件系统。
如果执行不带任何参数的blkid,它将列出所有连接到Linux主机的设备。

# blkid /dev/sdc1
/dev/sdc1: LABEL="hynman-16G" UUID="B48646258645E886" TYPE="ntfs" PARTUUID="2633de4d-01"

6. fdisk

使用fdisk可以列出所有连接的存储设备。
我们将使用fdisk列出USB设备。
如果我们有多个驱动器连接到Linux机器,则列表可能会很长,例如,我们可以查看fdisk -l输出的末尾。

Disk /dev/sdc: 14.6 GiB, 15664676864 bytes, 30595072 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: 0x2633de4d
Device     Boot Start      End  Sectors  Size Id Type
/dev/sdc1  *     2048 30595071 30593024 14.6G  7 HPFS/NTFS/exFAT

如我们所见,这是一块大小为14.6 GB的dos磁盘,类型为HPFS/NTFS/exFAT,因此这很可能是我们的U盘,我们可以再次使用lsscsi或者以上列表中的任何其他命令进行确认。

带有NTFS文件系统的U盘

现在我们可以列出USB设备并检查USB端口,使用Linux mount命令以NTFS文件系统类型安装U盘,我们在Linux中需要ntfs-3g驱动程序。
如果我们尝试在没有ntfs-3g驱动程序的情况下挂载U盘,则挂载将失败

# mount -t ntfs-3g /dev/sdc1 /mnt
mount: /mnt: unknown filesystem type 'ntfs'.

说明:

默认情况下,NTFS在RHEL中是不支持的,因此我们必须在RHEL节点上安装EPEL repo才能访问ntfs-3g驱动程序。

ntfs-3g是NTFS驱动程序,NTFS支持几种文件名名称空间:DOS,Win32和POSIX。
尽管ntfs-3g驱动程序可以处理所有这些驱动程序,但出于最大的可移植性和互操作性原因,它总是在POSIX名称空间中创建新文件。

# yum -y install ntfs-3g.x86_64

创建一个挂载点

# mkdir /mnt/usb

现在尝试使用Linux挂载命令挂载U盘

# mount -t ntfs /dev/sdc1 /mnt/usb

挂载成功

# df -h /mnt/
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc1        15G  364M   15G   3% /mnt/usb

使用与上述示例类似的fstab格式,以ntfs文件系统类型永久安装U盘。
下面是" fstab"示例,用于将U盘与ntfs文件系统一起挂载。

# echo "UUID="B48646258645E886"       /mnt/usb        ntfs    defaults        0 0" >> /etc/fstab

提示:

建议使用blkid进行永久安装,而不要使用驱动器名称。
使用blkid来获取U盘的UUID。

具有FAT32或者vFAT文件系统的U盘

我们将列出USB设备,检查USB端口并使用blkid检查文件系统类型,因为我们看到此U盘的文件系统类型为vFAT。
要使用Linux mount命令挂载具有vfat文件系统类型的U盘,我们需要使用vfat模块。

# blkid /dev/sdc1
/dev/sdc1: LABEL="hynman-16G" UUID="5E92CAC292CA9E41" TYPE="vfat" PARTUUID="2633de4d-01"

检查vfat模块是否已在系统上加载:

# lsmod | grep vfat 
vfat                   17411  0
fat                    65913  1 vfat

如果未加载vfat,请运行以下命令加载:

# modprobe vfat

提示:

我们必须安装dosfstools rpm来加载与vfat相关的模块和工具,才能将U盘安装到vfat文件系统中。

下一步,使用Linux mount命令将U盘与FAT32或者vFAT文件系统一起安装:

# mount -t vfat /dev/sdc1 /mnt

与NTFS文件系统类型类似,使用相同的fstab格式,在fstab下面的示例中使用/etc/fstab永久安装U盘。

# echo "UUID="5E92CAC292CA9E41"       /mnt/usb        vfat    defaults        0 0" >> /etc/fstab

提示:

建议使用blkid进行永久安装,而不要使用驱动器名称。
使用blkid来获取U盘的UUID。

挂载网络驱动器

我有一个位于192.168.0.121的NFS服务器,并在该服务器上共享了/mydata目录。
从NFS挂载网络驱动器

语法:

mount -t <fstype> -o vers=<version> <nfs_server>:<shared_path_on_nfs_server> <mount_point_on_localhost>

使用NFSv4挂载NFS网络驱动器

# mount -t nfs -o vers=4  192.168.0.121:/mydata /mnt

使用NFSv3挂载NFS网络驱动器

# mount -t nfs -o vers=3  192.168.0.121:/mydata /mnt

提示:

我们需要在NFS服务器和客户端节点上安装nfs-utilsrpm,才能使用NFS挂载网络驱动器。

要永久使用/etc/fstab挂载网络驱动器,fstab格式将保持不变,除了第一列中必须提供NFS服务器详细信息和源路径。
下面是我的NFS共享(/mydata)在192.168.0.121上的fstab示例

# echo "192.168.0.121:/mydata   /mnt    nfs   defaults    0 0" >> /etc/fstab

如何卸载文件系统和其他可移动设备?

使用umount命令来卸载任何类型的文件系统,U盘,网络驱动器或者ISO镜像。

umount <mount_point>

因此,如果我的文件系统挂载在/mnt上

# umount /mnt

我们可能会遇到错误umount:/mnt/usb:在尝试卸载umount文件系统时,目标有时很忙。
这意味着文件系统正在使用中,该错误类似于我们在尝试弹出U盘时在Windows中看到的错误"设备正在使用中"。

在这种情况下,我们可以使用-l来使用lazy umount

# umount -l /mnt/usb

这意味着一旦其他进程不使用/mnt/usb,它将自动卸载

或者,我们也可以使用lsof查找正在使用/usb/mnt的进程。

# lsof /mnt/usb/
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash     7033 root  cwd    DIR   8,49     4096    5 /mnt/usb
lsof    12636 root  cwd    DIR   8,49     4096    5 /mnt/usb
lsof    12637 root  cwd    DIR   8,49     4096    5 /mnt/usb

然后,我们可以决定杀死这些进程(杀死-9 <PID>),但要记住,这样做会杀死所有正在进行的任务或者操作。

警告:

不要在没有知识的情况下终止任何过程,因为这在生产环境中可能是危险的。