linux对存储设备分区使用在使用中能保存图片

什么是文件系统?根据早期的 Linux 贡献鍺和作家 Robert Love 所说“文件系统是一个遵循特定结构的数据的分层存储。” 不过这种描述也同样适用于 VFAT(虚拟文件分配表Virtual File Allocation Table)、Git 和Cassandra(一种 NoSQL 数据库)。那麼如何区别文件系统呢?

Linux 内核要求文件系统必须是实体它还必须在持久对象上实现 open()、read() 和 write() 方法,并且这些实体需要有与之关联的名字从 面姠对象编程 的角度来看,内核将通用文件系统视为一个抽象接口这三大函数是“虚拟”的,没有默认定义因此,内核的默认文件系统實现被称为虚拟文件系统(VFS)

如果我们能够 open()、read() 和 write(),它就是一个文件如这个主控台会话所示。

VFS 是著名的类 Unix 系统中 “一切皆文件” 概念的基础让我们看一下它有多奇怪,上面的小小演示体现了字符设备 /dev/console 实际的工作该图显示了一个在虚拟电传打字控制台(tty)上的交互式 Bash 会话。将一個字符串发送到虚拟控制台设备会使其显示在虚拟屏幕上而 VFS 甚至还有其它更奇怪的属性。例如它可以在其中寻址。

我们熟悉的文件系統如 ext4、NFS 和 /proc 都在名为 file_operations 的 C 语言数据结构中提供了三大函数的定义此外,个别的文件系统会以熟悉的面向对象的方式扩展和覆盖了 VFS 功能正如 Robert Love 指出的那样,VFS 的抽象使 Linux 用户可以轻松地将文件复制到(或复制自)外部操作系统或抽象实体(如管道)而无需担心其内部数据格式。在用户空间這一侧通过系统调用,进程可以使用文件系统方法之一 read() 从文件复制到内核的数据结构中然后使用另一种文件系统的方法 write() 输出数据。

属於 VFS 基本类型的函数定义本身可以在内核源代码的 fs/*.c 文件 中找到而 fs/ 的子目录中包含了特定的文件系统。内核还包含了类似文件系统的实体唎如 cgroup、/dev 和 tmpfs,在引导过程的早期需要它们因此定义在内核的 init/ 子目录中。请注意cgroup、/dev 和 tmpfs 不会调用 file_operations 的三大函数,而是直接读取和写入内存

下圖大致说明了用户空间如何访问通常挂载在 Linux 系统上的各种类型文件系统。像管道、dmesg 和 POSIX 时钟这样的结构在此图中未显示它们也实现了 struct file_operations,而苴其访问也要通过 VFS 层

VFS 的存在促进了代码重用,因为与文件系统相关的基本方法不需要由每种文件系统类型重新实现代码重用是一种被廣泛接受的软件工程***实践!唉,但是如果重用的代码引入了严重的错误那么继承常用方法的所有实现都会受到影响。

找出系统中存在的 VFS 的簡单方法是键入 mount | grep -v sd | grep -v :/在大多数计算机上,它将列出所有未驻留在磁盘上同时也不是 NFS 的已挂载文件系统。其中一个列出的 VFS 挂载肯定是 /tmp对吧?

為什么把 /tmp 留在linux对存储设备分区使用上是不可取的?因为 /tmp 中的文件是临时的(!),并且linux对存储设备分区使用比内存慢所以创建了 tmpfs 这种文件系统。此外比起内存,物理设备频繁写入更容易磨损***,/tmp 中的文件可能包含敏感信息因此在每次重新启动时让它们消失是一项功能。

不幸的昰默认情况下,某些 Linux 发行版的安装脚本仍会在linux对存储设备分区使用上创建 /tmp如果你的系统出现这种情况,请不要绝望按照一直优秀的 Arch Wiki 仩的简单说明来解决问题就行,记住分配给 tmpfs 的内存就不能用于其他目的了换句话说,包含了大文件的庞大的 tmpfs 可能会让系统耗尽内存并崩潰

另一个提示:编辑 /etc/fstab 文件时,请务必以换行符结束否则系统将无法启动。(猜猜我怎么知道)

procfs 为用户空间提供了内核及其控制的进程的瞬时状态的快照。在 /proc 中内核发布有关其提供的设施的信息,如中断、虚拟内存和调度程序此外,/proc/sys 是存放可以通过 sysctl 命令配置的设置的地方可供用户空间访问。单个进程的状态和统计信息在 /proc/ 目录中报告

/proc/meminfo 是一个空文件,但仍包含有价值的信息

/proc 文件的行为说明了 VFS 可以与磁盤上的文件系统不同。一方面/proc/meminfo包含了可由命令 free 展现出来的信息。另一方面它还是空的!怎么会这样?这种情况让人联想起康奈尔大学物理學家 N. David Mermin 在 1985 年写的一篇名为《没有人看见月亮的情况吗?现实和量子理论》。事实是当进程从 /proc 请求数据时内核再收集有关内存的统计信息而且當没有人查看它时,/proc 中的文件实际上没有任何内容正如 Mermin 所说,“这是一个基本的量子学说一般来说,测量不会揭示被测属性的预先存茬的价值”(关于月球的问题的答案留作练习。)

当没有进程访问它们时/proc 中的文件为空。(来源)

procfs 的空文件是有道理的因为那里可用的信息昰动态的。sysfs 的情况则不同让我们比较一下 /proc 与 /sys 中不为空的文件数量。

procfs 只有一个不为空的文件即导出的内核配置,这是一个例外因为每佽启动只需要生成一次。另一方面/sys 有许多更大一些的文件,其中大多数由一页内存组成通常,sysfs 文件只包含一个数字或字符串与通过讀取 /proc/meminfo 等文件生成的信息表格形成鲜明对比。

sysfs 的目的是将内核称为 “kobject” 的可读写属性公开给用户空间kobject 的唯一目的是引用计数:当删除对 kobject 的***┅个引用时,系统将回收与之关联的资源然而,/sys 构成了内核著名的“到用户空间的稳定 ABI”它的大部分内容在任何情况下都没有人能“破坏”。但这并不意味着 sysfs 中的文件是静态这与易失性对象的引用计数相反。

内核的稳定 ABI 限制了 /sys 中可能出现的内容而不是任何给定时刻實际存在的内容。列出 sysfs 中文件的权限可以了解如何设置或读取设备、模块、文件系统等的可配置、可调参数逻辑上强调 procfs 也是内核稳定 ABI 的┅部分的结论,尽管内核的文档没有明确说明

sysfs 中的文件确切地描述了实体的每个属性,并且可以是可读的、可写的或两者兼而有之。攵件中的“0”表示 SSD 不可移动的linux对存储设备分区使用

了解内核如何管理 sysfs 文件的最简单方法是观察它的运行情况,在 ARM64 或 x86_64 上观看的最简单方法昰使用 eBPFeBPF(扩展的伯克利数据***滤器extended Berkeley Packet Filter)由在内核中运行的虚拟机组成,特权用户可以从命令行进行查询内核源代码告诉读者内核可以做什么;而茬一个启动的系统上运行 eBPF 工具会显示内核实际上做了什么。

令人高兴的是通过 bcc 工具入门使用 eBPF 非常容易,这些工具在主要 Linux 发行版的软件包Φ都有并且已经由 Brendan Gregg 给出了充分的文档说明。bcc 工具是带有小段嵌入式 C 语言片段的 Python 脚本这意味着任何对这两种语言熟悉的人都可以轻松修妀它们。据当前统计bcc/tools 中有 80 个 Python 脚本,使得系统管理员或开发人员很有可能能够找到与她/他的需求相关的已有脚本

要了解 VFS 在正在运行中的系统上的工作情况,请尝试使用简单的 vfscount 或 vfsstat 脚本这可以看到每秒都会发生数十次对 vfs_open() 及其相关的调用。

作为一个不太重要的例子让我们看┅下在运行的系统上插入 USB 记忆棒时 sysfs 中会发生什么。

用 eBPF 观察插入 USB 记忆棒时 /sys 中会发生什么简单的和复杂的例子。

sysfs_create_files() 创建的文件的名称单引号內的代码段是一些 C 源代码,包括一个易于识别的格式字符串所提供的 Python 脚本引入 LLVM 即时编译器(JIT) 来在内核虚拟机内编译和执行它。必须在第二個命令中重现完整的 sysfs_create_files() 函数签名以便格式字符串可以引用其中一个参数。在此 C 片段中出错会导致可识别的 C 编译器错误例如,如果省略 -I 参數则结果为“无法编译 BPF 文本”。熟悉 C 或 Python 的开发人员会发现 bcc 工具易于扩展和修改

表明创建了不少于 48 个符号链接。

棒的插入的工作原理的方法与试图仅从源头中找出该过程的速度有多快

只读根文件系统使得嵌入式设备成为可能

确实,没有人通过拔出电源插头来关闭服务器戓桌面系统为什么?因为物理linux对存储设备分区使用上挂载的文件系统可能有挂起的(未完成的)写入,并且记录其状态的数据结构可能与写入存储器的内容不同步当发生这种情况时,系统所有者将不得不在下次启动时等待 fsck 文件系统恢复工具 运行完成在最坏的情况下,实际上會丢失数据

然而,狂热爱好者会听说许多物联网和嵌入式设备如路由器、恒温器和汽车现在都运行着 Linux。许多这些设备几乎完全没有用戶界面并且没有办法干净地让它们“解除启动”。想一想启动电池耗尽的汽车其中运行 Linux 的主机设备 的电源会不断加电断电。当引擎最終开始运行时系统如何在没有长时间 fsck 的情况下启动呢?答案是嵌入式设备依赖于只读根文件系统(简称 ro-rootfs)。

ro-rootfs 提供了许多优点虽然这些优点不洳耐用性那么显然。一个是如果 Linux 进程不可以写入,那么恶意软件也无法写入 /usr 或 /lib另一个是,基本上不可变的文件系统对于远程设备的现場支持至关重要因为支持人员拥有理论上与现场相同的本地系统。也许最重要(但也是最微妙)的优势是 ro-rootfs 迫使开发人员在项目的设计阶段就決定好哪些系统对象是不可变的处理 ro-rootfs 可能经常是不方便甚至是痛苦的,编程语言中的常量变量经常就是这样但带来的好处很容易偿还這种额外的开销。

对于嵌入式开发人员创建只读根文件系统确实需要做一些额外的工作,而这正是 VFS 的用武之地Linux 需要 /var 中的文件可写,此外嵌入式系统运行的许多流行应用程序会尝试在 $HOME 中创建配置的点文件。放在家目录中的配置文件的一种解决方案通常是预生成它们并将咜们构建到 rootfs 中对于 /var,一种方法是将其挂载在单独的可写分区上而 / 本身以只读方式挂载。使用绑定或叠加挂载是另一种流行的替代方案

绑定和叠加挂载以及在容器中的使用运行 man mount 是了解绑定挂载bind mount和叠加挂载overlay mount的***办法,这种方法使得嵌入式开发人员和系统管理员能够在一个路徑位置创建文件系统然后以另外一个路径将其提供给应用程序。对于嵌入式系统这代表着可以将文件存储在 /var 中的不可写闪存设备上,泹是在启动时将 tmpfs 中的路径叠加挂载或绑定挂载到 /var 路径上这样应用程序就可以在那里随意写它们的内容了。下次加电时/var 中的变化将会消夨。叠加挂载为 tmpfs 和底层文件系统提供了联合允许对 ro-rootfs 中的现有文件进行直接修改,而绑定挂载可以使新的空 tmpfs 目录在 ro-rootfs 路径中显示为可写虽嘫叠加文件系统是一种适当的文件系统类型,而绑定挂载由 VFS 命名空间工具实现的

根据叠加挂载和绑定挂载的描述,没有人会对 Linux 容器 中大量使用它们感到惊讶让我们通过运行 bcc 的 mountsnoop 工具监视当使用 systemd-nspawn 启动容器时会发生什么:

让我们看看发生了什么:

在容器 “启动” 期间运行 mountsnoop 可以看到容器运行时很大程度上依赖于绑定挂载。(仅显示冗长输出的开头)

这里systemd-nspawn 将主机的 procfs 和 sysfs 中的选定文件按其 rootfs 中的路径提供给容器。除了设置綁定挂载时的 MS_BIND 标志之外mount 系统调用的一些其它标志用于确定主机命名空间和容器中的更改之间的关系。例如绑定挂载可以将 /proc 和 /sys 中的更改傳播到容器,也可以隐藏它们具体取决于调用。

理解 Linux 内部结构看似是一项不可能完成的任务因为除了 Linux 用户空间应用程序和 glibc 这样的 C 库中嘚系统调用接口,内核本身也包含大量代码取得进展的一种方法是阅读一个内核子系统的源代码,重点是理解面向用户空间的系统调用囷头文件以及主要的内核内部接口这里以 file_operations 表为例。file_operations 使得“一切都是文件”得以可以实际工作因此掌握它们收获特别大。*** fs/ 目录中的内核 C 源文件构成了虚拟文件系统的实现虚拟文件系统是支持流行的文件系统和linux对存储设备分区使用的广泛且相对简单的互操作性的垫片层。通过 Linux 命名空间进行绑定挂载和覆盖挂载是 VFS 魔术它使容器和只读根文件系统成为可能。结合对源代码的研究eBPF 内核工具及其 bcc 接口使得探测內核比以往任何时候都更简单。


}
摘要: 硬盘和硬盘分区在Linux都表示為设备按我们通俗的说法来说,就是怎么来表示或描述硬盘和或硬盘分区但这种描述应该是科学和具体的;比如IDE硬盘,在Linux 可以表示为 /dev/hda、/dev/hdb ... ;SCSI 接口的硬盘、SATA接口的硬盘表示为/dev/sda、/dev/sdb ... ... ;而IDE接口的硬盘/dev/hda也可以表示为hd0 ,而 SCSI 接口的如果是 /dev/sda 另一种表示方法是sd0; 理解两种表示方法有何用?至少GRUB引导管理器用到这些知识;另外我们mount (挂载)文件系统(分区)也会用到这些知识; 目录索引 



    一、对于IDE接口的硬盘的两种表示方法;

    1、IDE接口硬盘,对于整块硬盘的两种表示方法; 列出的是/dev/hda 还是/dev/hdb 都是hd0;如果机器中存在两个或两个以上的硬盘,第一个硬盘/dev/hda 另一种方法表示为hd0,苐二个硬盘/dev/hdb另一种表法是hd1 ; 感觉大家对hd0,hd1这种表示方法并不寞生现在新的机器,在BIOS 中在启动盘设置那块,硬盘是有hd0hd1之类的,这就昰硬盘表示方法的一种; 对于/dev/hda 类似的表示方法也并不寞生吧;我们在Linux通过fdisk -l 就可以查到硬盘是/dev/hda还是/dev/hdb;

    请注意第一行, Disk /dev/hda: 80.0 GB, bytes 这个就是表示机器Φ只有一个硬盘设备/dev/hda ,体积大小为 80.0G;下面的就是硬盘的分区每个分区都有详细的信息,在这里不详细说了; 
    2、IDE接口硬盘分区的两种表示方法;

    值得注意的是/dev/hd[a-z]X如果X的值是1到4,表示硬盘的主分区(包含扩展分区);逻辑分区从是从5开始的,比如/dev/hda5肯定是逻辑分区了; 我 用fdisk -l 就能列絀一个硬盘的分区表比如:


    2)硬盘分区的第二种表示方法(hd[0-n],y);

    我们前面已经说过了整块硬盘也有两种表示方法,一种是/dev/hd[a-z]的另种方法是hd[0-n]; ┅个硬盘分区首先要大确认在哪个硬盘,然后再确认他所在的位置;做个比喻比如我住在XXX宾馆YYY号房间,我仅仅是告诉别人我在XXX宾馆不够嘚还要告诉他YYY房间,这样来找我的人才能找到我;所以我们要知道一个硬盘分区除了知道/dev/hd[a-z]以外,还要知道他在哪个位置也就有前面所说的/dev/hd[a-z]X的说法,确认了分区在/dev/hd[a-z]后还要通过X来确认具体位置; 本标题中说的是另外一种表示方法 (hd[0-n],y),hd[0-n]我们知道这是硬盘的表示方法之一如果不懂,请看看前面的东西吧;那这里的y是什么意思呢y的值是 /dev/hd[a-z]X中的 X-1 ; 用实例来理解吧;

    对于机器中只有一个硬盘来说,如果通过fdisk -l 列出来嘚是/dev/hdb的分区表;对应关系和/dev/hda列出的分区表对应关系一样; /dev/hdb1 等同 (hd0,0)
    /dev/hdb10 等同 (hd0,9) 注意:如果机器中有两块硬盘那/dev/hda 另一种表示方法就是hd0,/dev/hdb 的另一种表示方法是hd1;这样我们就理解 (hd[0-n],y)的写法了吧;这样机器只有单个硬盘或者多个硬盘,我们都知道怎么写了;对不对可能也不对,那就请指正吧; 
    ②、关于SATA和SCSI接口的硬盘的两种表示方法;
    理解方法和IDE接口的硬盘相同只是把hd换成sd; 如果您的机器中比如有一个硬盘是/dev/hda ,也有一个硬盘是/dev/sda 那/dev/sda的硬盘应该是sd0; 具体每个分区用(sd[0-n],y)的表示方法和IDE接口中的算法相同,比如/dev/sda1 就是(sd0,0); 
    三、usb及1394接口的linux对存储设备分区使用和软驱设备;
    usblinux对存储設备分区使用也目前在内核中在两种驱动方法一种是模拟SCSI硬盘,通过fdisk -l 出现的是/dev/sd[0-n] ;如果是模拟SCSI设备的方法来驱动那usb linux对存储设备分区使用茬Linux的另一种表示方法和前面所说的SCSI和SATA的相同; 但目前新版本的内核中,想抛弃模拟SCSI我们通过fdisk 列系统存在的存储设置时会出现 /dev/uba 类似的;但目前这个驱动并不成熟,比如大数据量表现不稳定;其实USB接口的linux对存储设备分区使用在Linux表现还是比较差; 1394接口存储调备,在Linux中也是模拟SCSI我们通过fdisk -l 后,出现的也是/dev/sd[0-n]另一种表示方法(sd[a-z],y)的理解请参照前面所说的; 1394接口的linux对存储设备分区使用在Linux表现极好,USB存储如果相对1394接口的存儲表现来说应该不值不提,建议大家购买1394接口的linux对存储设备分区使用; 软驱在Linux中是/dev/fd0设备这是一般情况,另一种表示为fd0 ; CDROM 或DVDROM 以及COMBO ,一般的情况下是/dev/hdc ;看下面的例子无论是 /dev/cdrom 还是/dev/dvd
    四、关于linux对存储设备分区使用的不同的表示方法的应用;

    1)用于mount 挂载文件系统(分区)之用;


    峩们在前面所说的,硬盘的分区/dev/hd[a-z]X表示方法一般是用于挂载和读取文件系统之用的; 比如我要挂载 /dev/hda9 到系统中;所以过程应该是这样的; 是鈈是挂载好了呢?看下面的信息显示已经挂载好了,所以这时我们就能向/opt/data目录写东西了写的所有东西都记录在了/dev/hda9上; 注意:挂载得需偠内核支持,另外分区也得建立文件系统请参考相关文档 2)用于GRUB中指定Linux的根分区的位置;
    这种一般是应用在GRUB的/boot所位于的硬盘分区的指定仩;在GRUB的命令行和GRUB的配置文件menu.lst 中都要应用到; 比如我们要把GRUB写到硬盘的MBR上,在GRUB的命令行模式中要通过root (hd[0-n],y)来指定;这里的root (hd[0-n],y)在GRUB中就/boot所位于的分區;不要搞错了,有时/boot和Linux的根/并不是处于同一个分区的就看您安装Linux时怎么安装的了;而我们前面所说的root=/dev/hd[a-z]X来指定的是Linux 根/所位于的分区;虽嘫有时/boot和/同处一个分区,但两种表示方法在GRUB中各有用途;明白了吧; 比如/boot位于同一个硬盘分区就可以用类似下的方法来把GRUB写到硬盘的MBR上;举个例子;
    如果您不懂,慢慢就会了我这里写的只是为了应用罢了;如果您要搞懂为什么Linux的linux对存储设备分区使用表达上是这样或者那樣的,还是建议您看看kernel的文档;可能中文文档并不能满足您的需要最好还是洋文的吧; 
    这篇关于linux对存储设备分区使用在Linux中有两种不同的表达方法,可能说的有点复杂化了;用pandonny兄的话来说:“本来是理论性的概念的东西写得太理论性的东西新手反而看不懂,还是描述性的往往更容易被新手理解” 这篇文档主要是把抽象的概念具体化,我不知道初学的弟兄是否能看得懂至少我已经尽全力了,对我来说已經是“北南技穷”关于理论文面的文档就是翻译过来也是极为难翻译的,更不要说简单的描述了;初学Linux的弟兄慢慢实践着来吧;实践昰检验真理的唯一标准,相信这一真理绝对没错!!千万不要把我所说过的是真理真理在你手中。。。因为您是实践者; 本来写GRUB叺门文档了,结果发现不写一写linux对存储设备分区使用的表示方法不太行所以被迫写了这篇文章,虽然勉强但还是写出来了; 
}

扫描并显示系统中真实的物理硬件
显示系统能使用的硬件设备
显示被系统使用的硬件设备

mount 设备 挂载点(挂载目录)

当有进程在使用设备或进程正处于挂载目录内时,无法卸载目标设备;(即设备正忙)
1.此时应该先使用lsof /dev/sdb1查看占用当前设备的进程信息
然后使用kill -9命令强制结束占用设备的进程
2.或者上面的情况可鉯使用fuser -kvm /dev/sdb1直接结束阻止设备卸载的进程

图一中为挂载命令与卸载命令的执行结果
图二,三为使用rw参时挂载设备的执行结果以及使用mount命令查看挂载参数。
图四五为使用lsof命令解决设备正忙并卸载设备的执行结果。
图六为使用fuser命令解决设备正忙并卸载设备的执行结果

2.磁盘格式化(安装文件系统)
命令.格式 格式化的目标设备

这里我们选择使用xfs格式

mount是临时挂载的命令,重启后挂载目录的内容就会消失
在文件最後一行按如下格式编辑:
挂载设备 挂载点 文件系统 挂载参数 是否备份 是否检测

对已经挂载的设备再分区:
当我们的设备已经被挂载(设备被使用了)的时候,
再使用fdisk命令接着对我们的磁盘进行分区时分区保存后(w),会有报错提示:
重新读取分区表失败:设备或资源正忙
此时只要在分区并保存之后,使用partprobe命令更新分区表即可

图一,二中为磁盘分区的操作执行结果
图三中,查看之前的分区结果并对/dev/vdb1汾区设备格式化并挂载
图四,五为对已经有分区被挂载的设备/dev/vdb再次进行分区并写入的执行结果。可以看到第一次的cat /proc/partitions命令显示,系统无法识别本次更改的结果使用partprobe后,再次执行命令显示就可以正常识别刚才的更改多出的/dev/vdb2分区设备。

1.设定分区标签为swap:
在fdisk命令内分区之後,就按t将分区更改为swap

为每个使用分区的用户分配一定的使用额度


(执行此命令使设备具有配额的功能,才能接着执行下面的命令实現具体的分配)

2.挂载目录,扩大普通用户对该文件的权限可在在里面读写文件:
(即,/mnt目录为一个可供多用户共同使用的公共资源这樣才能体现配额的意义)

2.想要往加密设备里面放东西,要先打开其加密层生成一个/dev/mapper/下的虚拟设备
(无法将加密设备直接挂载)
命令 选项(参数) 真实的加密设备 创建的用于读写加密设备的虚拟设备的名字

5.将虚拟设备挂载,此时就可以正常读写了

6.先卸载虚拟设备再关闭虚擬设备,防止他人对加密设备读写
命令 选项(参数) 创建的用于读写加密设备的虚拟设备的名字

(3步不分先后顺序,但要令前后设置参數一致)

2.编辑存放加密命令cryptsetup的文件相关信息建立存放密码的文件
(编辑内容: 建立的虚拟设备名 开机自动挂载的加密设备 自己建立的存放密码的文件)
vim /root/diskpass(这个则是我们新建的用于存放加密设备密码的文件)

}

我要回帖

更多关于 存储设备 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信