磁盘检测和挂载

本文介绍了Linux系统中的磁盘检测和挂载管理,包括设备文件、磁盘和分区、文件系统类型,以及挂载点的显示。详细讲解了挂载命令`mount`的使用,如显示挂载信息、挂载设备到指定目录、挂载选项等,并提到了卸载设备的`umount`命令。此外,还讨论了`df`和`du`命令用于查看磁盘使用情况。最后,探讨了挂载和卸载文件系统的系统调用及其相关标志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基础知识

1、 设备专用文件(设备文件)
  • 字符型设备,如键盘和显示器
  • 块设备,如磁盘磁带等存储设备
  • 设备文件总会出现在文件系统中,通常位于 /etc下,超级用户可以通过使用mknod命令来创建设备文件。
  • 每个设备都有主、辅ID各一个,可以通过ls -l来显示。
2、 磁盘和分区

磁盘通常包含以下三种类型的文件之一:

  • 文件系统:用来存储常规文件;
  • 数据区域:可以作为裸设备对其进行访问(也就是不通过内核缓存来访问),一些数据库管理系统会使用该技术。
  • 交换区域,供内核的内存管理所用。
3、文件系统
  • ext4 Linux目前主流的文件系统,继承自ext2和ext3.
  • 如果与Windows PC共用,会使用如下文件系统
    • vfat:Windows长文件系统
    • ntfs:Windows中广泛使用的高级文件系统
    • iso9660:标准CD-ROM文件系统
  • 大多数U盘会被格式化成vfat文件系统,而CD必须使用iso9660文件系统。
  • Linux系统中支持的文件系统会被列在文件 /proc/filesystems中(Linux专有);cat /proc/filesystems显示如下:
nodev	sysfs
nodev	rootfs
nodev	ramfs
nodev	bdev
nodev	proc
nodev	cpuset
nodev	cgroup
nodev	cgroup2
nodev	tmpfs
nodev	devtmpfs
nodev	configfs
nodev	debugfs
nodev	tracefs
nodev	securityfs
nodev	sockfs
nodev	dax
nodev	bpf
nodev	pipefs
nodev	hugetlbfs
nodev	devpts
   		ext3
   		ext2
   		ext4
   		squashfs
   		vfat
nodev	ecryptfs
   		fuseblk
nodev	fuse
nodev	fusectl
nodev	efivarfs
nodev	mqueue
nodev	pstore
nodev	autofs
nodev	binfmt_misc

** 其中nodev表示不允许访问设备**

4、文件系统挂载点的显示
  • /proc/mounts文件中,每个进程都有自己的挂载设备在 /proc/self/mounts
  • /etc/mtab 文件中,mount 和 umount命令会自动维护此文件,但系统调用mount()和umount()不会更新此文件。
  • /etc/fstab 文件中,由系统管理员手工维护,该文件供mount、umount及fsck命令使用。

二、挂载管理命令

1、mount命令
  • mount [-l] [-t type]显示挂载信息
#设备文件名on 虚拟目录的挂载点 type 文件系统类型 (已挂载媒体的访问状态)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=1934456k,nr_inodes=483614,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=391728k,mode=755)
/dev/sda2 on / type ext4 (rw,relatime,errors=remount-ro)
  • mount [-t type] device directory 将设备挂载到指定目录
    • 可以将一个dev挂载到多个dir挂载点;两个挂载点共享挂载的dev中的内容
    • 可以在一个dir挂载点挂载多个dev;采用出入栈的方式管理dev,显示栈顶的dev
  • 绑定挂载,绑定挂载类似与硬链接,但存在两方面的区别
    • 绑定挂载可以跨越多个文件系统的挂载点,甚至不拘于chroot临禁区(jail)。
    • 可针对目录绑定挂载
  • 其他mount命令选项
    • -a 挂载/etc/fstab文件中指定的所有文件系统;
    • -o 给文件挂载添加对应的选项,如ro只读、rw读写、loop挂载一个文件、user允许普通用户挂载、check=none挂载文件时不进行完整性校验
  • mount的man手册描述
MOUNT(8)                                                                                 System Administration                                                                                MOUNT(8)

NAME
       mount - mount a filesystem

SYNOPSIS
       mount [-l|-h|-V]

       mount -a [-fFnrsvw] [-t fstype] [-O optlist]

       mount [-fnrsvw] [-o options] device|dir

       mount [-fnrsvw] [-t fstype] [-o options] device dir

DESCRIPTION
       All  files  accessible in a Unix system are arranged in one big tree, the file hierarchy, rooted at /.  These files can be spread out over several devices.  The mount command serves to attach
       the filesystem found on some device to the big file tree.  Conversely, the umount(8) command will detach it again.  The filesystem is used to control how data is stored on the device or  pro‐
       vided in a virtual way by network or another services.

       The standard form of the mount command is:

              mount -t type device dir

       This  tells  the  kernel to attach the filesystem found on device (which is of type type) at the directory dir.  The option -t type is optional.  The mount command is usually able to detect a
       filesystem.  The root permissions are necessary to mount a filesystem by default.  See section "Non-superuser mounts" below for more details.  The previous contents (if  any)  and  owner  and
       mode of dir become invisible, and as long as this filesystem remains mounted, the pathname dir refers to the root of the filesystem on device.

       If only the directory or the device is given, for example:

              mount /dir

       then mount looks for a mountpoint (and if not found then for a device) in the /etc/fstab file.  It is possible to use the --target or --source options to avoid ambivalent interpretation of the
       given argument.  For example:

              mount --target /mountpoint

       The same filesystem may be mounted more than once, and in some cases (e.g.  network filesystems) the same filesystem maybe be mounted on the same mountpoint more times. The mount command does
       not  implement  any policy to control this behavior. All behavior is controlled by kernel and it is usually specific to filesystem driver. The exception is --all, in this case already mounted
       filesystems are ignored (see --all below for more details).

   Listing the mounts
       The listing mode is maintained for backward compatibility only.

       For more robust and customizable output use findmnt(8), especially in your scripts.  Note that control characters in the mountpoint name are replaced with '?'.

       The following command lists all mounted filesystems (of type type):

              mount [-l] [-t type]

       The option -l adds labels to this listing.  See below.

   Indicating the device and filesystem
       Most devices are indicated by a filename (of a block special device), like /dev/sda1, but there are other possibilities.  For example, in the case of  an  NFS  mount,  device  may  look  like
       knuth.cwi.nl:/dir.   It  is  also  possible to indicate a block special device using its filesystem label or UUID (see the -L and -U options below), or its partition label or UUID.  Partition
       identifiers are supported for example for GUID Partition Tables (GPT).
        The device name of disk partitions are unstable; hardware reconfiguration, adding or removing a device can cause change in names. This is reason why it is strongly recommended to use  filesys‐
       tem or partition identificators like UUID or LABEL.

       The  command  lsblk --fs provides overview of filesystems, LABELs and UUIDs on available block devices.  The command blkid -p <device> provides details about a filesystem on the specified de‐
       vice.

       Do not forget that there is no guarantee that UUIDs and labels are really unique, especially if you move, share or copy the device.  Use lsblk -o +UUID,PARTUUID to verify that  the  UUIDs  are
       really unique in your system.

       The recommended setup is to use tags (e.g. UUID=uuid) rather than /dev/disk/by-{label,uuid,partuuid,partlabel} udev symlinks in the /etc/fstab file.  Tags are more readable, robust and porta‐
       ble.  The mount(8) command internally uses udev symlinks, so the use of symlinks in /etc/fstab has no advantage over tags.  For more details see libblkid(3).

       Note that mount(8) uses UUIDs as strings.  The UUIDs from the command line or from fstab(5) are not converted to internal binary representation.  The string representation of the UUID  should
       be based on lower case characters.

       The  proc  filesystem  is  not associated with a special device, and when mounting it, an arbitrary keyword, such as proc can be used instead of a device specification.  (The customary choice
       none is less fortunate: the error message 'none already mounted' from mount can be confusing.)

   The files /etc/fstab, /etc/mtab and /proc/mounts
       The file /etc/fstab (see fstab(5)), may contain lines describing what devices are usually mounted where, using which options.  The default location of the fstab(5) file can be overridden with
       the --fstab path command-line option (see below for more details).

       The command

              mount -a [-t type] [-O optlist]

       (usually  given  in  a  bootscript)  causes all filesystems mentioned in fstab (of the proper type and/or having or not having the proper options) to be mounted as indicated, except for those
       whose line contains the noauto keyword.  Adding the -F option will make mount fork, so that the filesystems are mounted simultaneously.

       When mounting a filesystem mentioned in fstab or mtab, it suffices to specify on the command line only the device, or only the mount point.

       The programs mount and umount traditionally maintained a list of currently mounted filesystems in the file /etc/mtab.  The support for regular classic /etc/mtab is completely disabled in com‐
       pile time by default, because on current Linux systems it is better to make it a symlink to /proc/mounts instead. The regular mtab file maintained in userspace cannot reliably work with name‐
       spaces, containers and other advanced Linux features.  If the regular mtab support is enabled than it is possible to use the file as well as the symlink.

       If no arguments are given to mount, the list of mounted filesystems is printed.

       If you want to override mount options from /etc/fstab you have to use the -o option:

              mount device|dir -o options

       and then the mount options from the command line will be appended to the list of options from /etc/fstab.  This default behaviour is possible to change by command line option  --options-mode.
       The usual behavior is that the last option wins if there are conflicting ones.

       The mount program does not read the /etc/fstab file if both device (or LABEL, UUID, PARTUUID or PARTLABEL) and dir are specified.  For example, to mount device foo at /dir:

              mount /dev/foo /dir

       This default behaviour is possible to change by command line option --options-source-force to always read configuration from fstab. For non-root users mount always read fstab configuration.

   Non-superuser mounts
       Normally, only the superuser can mount filesystems.  However, when fstab contains the user option on a line, anybody can mount the corresponding filesystem.

       Thus, given a line
       /dev/cdrom  /cd  iso9660  ro,user,noauto,unhide

       any user can mount the iso9660 filesystem found on an inserted CDROM using the command:
              mount /cd

       Note  that  mount is very strict about non-root users and all paths specified on command line are verified before fstab is parsed or a helper program is executed. It is strongly recommended to
       use a valid mountpoint to specify filesystem, otherwise mount may fail. For example it is bad idea to use NFS or CIFS source on command line.

       For more details, see fstab(5).  Only the user that mounted a filesystem can unmount it again.  If any user should be able to unmount it, then use users instead of user  in  the  fstab  line.
       The owner option is similar to the user option, with the restriction that the user must be the owner of the special file.  This may be useful e.g. for /dev/fd if a login script makes the con‐
       sole user owner of this device.  The group option is similar, with the restriction that the user must be member of the group of the special file.

   Bind mount operation
       Remount part of the file hierarchy somewhere else.  The call is:

              mount --bind olddir newdir

       or by using this fstab entry:

              /olddir /newdir none bind

       After this call the same contents are accessible in two places.

       It is important to understand that "bind" does not to create any second-class or special node in the kernel VFS. The "bind" is just another operation to attach a filesystem. There is  nowhere
       stored information that the filesystem has been attached by "bind" operation. The olddir and newdir are independent and the olddir maybe be umounted.

       One can also remount a single file (on a single file).  It is also possible to use the bind mount to create a mountpoint from a regular directory, for example:

              mount --bind foo foo

       The bind mount call attaches only (part of) a single filesystem, not possible submounts.  The entire file hierarchy including submounts is attached a second place by using:

              mount --rbind olddir newdir

       Note  that  the  filesystem  mount  options  maintained  by kernel will remain the same as those on the original mount point.  The userspace mount options (e.g. _netdev) will not be copied by
       mount(8) and it is necessary explicitly specify the options on mount command line.

       mount(8) since v2.27 allows to change the mount options by passing the relevant options along with --bind.  For example:

              mount -o bind,ro foo foo

       This feature is not supported by the Linux kernel; it is implemented in userspace by an additional mount(2) remounting system call.  This solution is not atomic.

       The alternative (classic) way to create a read-only bind mount is to use the remount operation, for example:

              mount --bind olddir newdir
              mount -o remount,bind,ro olddir newdir

       Note that a read-only bind will create a read-only mountpoint (VFS entry), but the original filesystem superblock will still be writable, meaning that the olddir will  be  writable,  but  the
       newdir will be read-only.

       It is  also  possible  to  change  nosuid, nodev, noexec, noatime, nodiratime and relatime VFS entry flags by "remount,bind" operation.  The another (for example filesystem specific flags) are
       silently ignored.  It's impossible to change mount options recursively (for example with -o rbind,ro).
 mount(8) since v2.31 ignores the bind flag from /etc/fstab on remount operation (if "-o remount" specified on command line). This is necessary to fully control mount  options  on  remount  by
       command  line. In the previous versions the bind flag has been always applied and it was impossible to re-define mount options without interaction with the bind semantic. This mount(8) behav‐
       ior does not affect situations when "remount,bind" is specified in the /etc/fstab file.

   The move operation
       Move a mounted tree to another place (atomically).  The call is:

              mount --move olddir newdir

       This will cause the contents which previously appeared under olddir to now be accessible under newdir.  The physical location of the files is not changed.  Note that olddir has to be a mount‐
       point.

       Note also that moving a mount residing under a shared mount is invalid and unsupported.  Use findmnt -o TARGET,PROPAGATION to see the current propagation flags.

   Shared subtree operations
       Since  Linux  2.6.15  it  is possible to mark a mount and its submounts as shared, private, slave or unbindable.  A shared mount provides the ability to create mirrors of that mount such that
       mounts and unmounts within any of the mirrors propagate to the other mirror.  A slave mount receives propagation from its master, but not vice versa.  A private mount carries  no  propagation
       abilities.   An unbindable mount is a private mount which cannot be cloned through a bind operation.  The detailed semantics are documented in Documentation/filesystems/sharedsubtree.txt file
       in the kernel source tree.

       Supported operations are:

              mount --make-shared mountpoint
              mount --make-slave mountpoint
              mount --make-private mountpoint
              mount --make-unbindable mountpoint

       The following commands allow one to recursively change the type of all the mounts under a given mountpoint.

              mount --make-rshared mountpoint
              mount --make-rslave mountpoint
              mount --make-rprivate mountpoint
              mount --make-runbindable mountpoint

       mount(8) does not read fstab(5) when a --make-* operation is requested.  All necessary information has to be specified on the command line.

       Note that the Linux kernel does not allow to change multiple propagation flags with a single mount(2) system call, and the flags cannot be mixed with other mount options and operations.

       Since util-linux 2.23 the mount command allows to do more propagation (topology) changes by one mount(8) call and do it also together with other mount operations.  This feature is  EXPERIMEN‐
       TAL.   The  propagation  flags  are applied by additional mount(2) system calls when the preceding mount operations were successful.  Note that this use case is not atomic.  It is possible to
       specify the propagation flags in fstab(5) as mount options (private, slave, shared, unbindable, rprivate, rslave, rshared, runbindable).

       For example:

              mount --make-private --make-unbindable /dev/sda1 /foo

       is the same as:

              mount /dev/sda1 /foox
              mount --make-private /foo
              mount --make-unbindable /foo
2、卸载设备的命令umount
  • umount [directory | device] 如果设备正在使用,则不能卸载
3、df命令
  • df 及df -h命令的显示如下
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.9G   0% /dev
tmpfs           383M  1.8M  381M   1% /run
/dev/sda2       219G   10G  198G   5% /
tmpfs           1.9G  250M  1.7G  14% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/loop1      1.0M  1.0M     0 100% /snap/gnome-logs/61
/dev/loop2       15M   15M     0 100% /snap/gnome-characters/254
4、du命令

显示当前目录下,各文件目录的大小,文件目录相当于 ls -R那么多。默认单位时kb,可以使用-h显示单位;使用-c会显示所有已列出文件的总大小。-s显示每个输出参数的总计;显示如下:

anfengchen@anfengchen-ThinkPad-T460:~/afc$ du -c
4	./hello/build/CMakeFiles/CMakeTmp
44	./hello/build/CMakeFiles/hello.dir
4	./hello/build/CMakeFiles/3.13.4/CompilerIdC/tmp
48	./hello/build/CMakeFiles/3.13.4/CompilerIdC
4	./hello/build/CMakeFiles/3.13.4/CompilerIdCXX/tmp
48	./hello/build/CMakeFiles/3.13.4/CompilerIdCXX
156	./hello/build/CMakeFiles/3.13.4
316	./hello/build/CMakeFiles
368	./hello/build
412	./hello
416	.
416	total
5、挂载文件系统的系统调用
#include<sys/mount.h>
int mount(const char *source, const char *target, const char * fstype,
			unsigned long mountflags, const void *data);
			//Return 0 on success, or -1 on error

其中:

  • mountflags 为以为掩码,如 MS_BIND、MS_MOVE、MS_NODEV、MS_NOATIME等,在mount命令中有其选项。
  • fstype是代表文件系统的字符串
  • data是指向信息缓冲区的指针,其信息解释则取决与文件系统。
6、卸载文件系统的系统调用
#include<sys/mount.h>
int umount(const char *target);
int umount2(const char *target, int flags);
		//Return 0 on success, or -1 on error.

其中:

  • target 是待卸载文件系统的挂载点
  • 如果卸载正在使用的文件系统,会返回EBUSY错误。
  • flags由零个或多个下面的标志位组合而成
    • MNT_DETACH 执行lazy卸载;等待正在使用的结束,不允许新的访问。
    • MNT_EXPIRE 将挂载点标志为到期(expired),不可与DETACH和FORCE一起使用。首次,空闲标记为到期,返回EAGAIN错误;运行,返回EBUSY错误,不标记为到期。标记为到期,第二次可以卸载。
    • MNT_FORCE 即使文件系统在用,也强制卸载,支队NFS文件系统有用
    • UMOUNT_NOFOLLOW若target为符号引用,不对其进行解析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值