为什么要讲回环设备,下面看下系统的采样情况

上面图有loop0,loop1等设备标记,这些是什么?
看看下面fdisk -l 的结果,乱糟糟的一堆?

什么是回环设备?  上面的loop0, loop1就是。

回环设备( 'loopback device')允许用户以一个普通磁盘文件虚拟成一个块设备。(磁盘文件 --> 块设备)
创建回环设备即我们所说的创建虚拟块设备(虚拟块设备也说仿真块设备,类似模拟一块磁盘)。 我们有时候也叫循环设备。

loop设备(回环设备)是一种伪设备(相对真实的块设备(块设备包括磁盘等)来说),是使用文件来模拟块设备的一种技术(例如:把真实的磁盘文件中某一部分文件,模拟成独立的磁盘使用),文件模拟成块设备后, 就像一个磁盘或光盘一样使用(也有单独的入口,例如:/dev/loop0 这样,而真实的磁盘块文件比如/dev/sda)。在使用之前,一个 loop 设备必须要和一个文件进行连接(例如: 用losetup命令来把常规文件或块设备(/dev/loop0)关联到一个loop文件,loop文件可以是*.iso或者*.img或目录等)。
       例如: $losetup /dev/loop0  /var/lib/my/images/my.img
  如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被mount 起来(mount到根下的某一个目录使用)。之所以叫loop设备(回环),其实是从文件系统这一层来考虑的,因为这种被 mount起来的镜像文件(*.iso或者*.img等)它本身也包含有文件系统,通过loop设备把它mount起来,它就像是文件系统之上再绕了一圈的文件系统,所以称为 loop。

我们看看下面的磁盘情况

我们看到回环设备和块设备情况了,如果你没有安装docker,可能就没有loop0,loop1这样的回环设置
可能就是这样(除非我们明确的在系统中创建了回环设置)

想一下一个磁盘设备,对它的所有读写操作都将被重定向到读写一个名为 disk-image 的普通文件而非操作实际磁盘或分区的轨道和扇区。

(当然,disk-image 必须存在于一个实际的磁盘上,而这个磁盘必须比虚拟的磁盘容量更大。)

回环设备就是允许你这样使用一个普通文件。

回环设备以 /dev/loop0、/dev/loop1 等命名。(注意:只有超级用户才有权限设置回环设备)

回环设备的使用与其它任何块设备相同。特别是,你可以在这个设备上创建文件系统并像普通的磁盘一样将它挂载在系统中。这样的一个将全部内容保存在一个普通文件中的文件系统,被称为虚拟文件系统(virtual file system)。
实例机器采样

如果你想建回环设备,首先确认当前系统是否有在使用回环设备

/dev/loop0 已经存在,你会得到类似上面面的结果。然后你就需要把 /dev/loop0 替换成 /dev/loop1, 或者再把 /dev/loop1替换成/dev/loop2, 并以此类推,
直到找到一个空的回环设备为止。这时你就可以建/dev/loop2回环设备了.

[root@fp-web-130 mnt]#  losetup -f  //查看哪个loop设备是空闲的

我们拿docker实践来说---docker是默认通过devicemapper存储机制创建回环设备(其他存储机制还有OverlayFS,AUFS,Btrfs,Device Mapper,VFS,ZFS等)


同时看下docker info输出

[root@fpvm-DBServer61 storage]# docker info
Containers: 9
Running: 0
Paused: 0
Stopped: 9
Images: 61
Server Version: 18.06.1-ce   #docker的版本信息
Storage Driver: devicemapper  ##采用的存储驱动,这里看到采用的是devicemapper 存储驱动,docker目前支持的存储驱动有:OverlayFS,AUFS,Btrfs,Device Mapper,VFS,ZFS。
                         docker提供了上面几种存储驱动来实现不同的方式存储镜像。有可能会看到一些名字为dm-xx的设备,那么这些设备到底是什么设备呢,跟磁盘有什么关系呢? dm是Device Mapper的缩写,Device Mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略,当前比较流行的 Linux 下的逻辑卷管理器如 LVM2(Linux Volume Manager 2 version)、EVMS(Enterprise Volume Management System)、dmraid(Device Mapper Raid Tool)等都是基于该机制实现的,关于dm我另外章节会讲。插入几个图

Pool Name: docker-253:0-1228875-pool
Pool Blocksize: 65.54kB
Base Device Size: 10.74GB
Backing Filesystem: xfs     ##回环设备的文件格式,对Docker 来说,backing filesystem 就是/var/lib/docker/所在的文件系统
Udev Sync Supported: true
Data file: /dev/loop0   #loop0回环设备给了 data
Metadata file: /dev/loop1  #loop1回环设备给了metadata,这里存的是容器镜像的大小信息,以及该容器镜像所代表的rootfs等
Data loop file: /mnt/docker/storage/devicemapper/devicemapper/data  ###具体挂载,这个目录地址默认是/var/lib/docker ,我已经改变默认的到了/mnt/docker/storage/下
Metadata loop file: /mnt/docker/storage/devicemapper/devicemapper/metadata
Data Space Used: 17.28GB
Data Space Total: 107.4GB   
Data Space Available: 20.9GB
Metadata Space Used: 15.67MB
Metadata Space Total: 2.147GB
Metadata Space Available: 2.132GB
Thin Pool Minimum Free Space: 10.74GB
Deferred Removal Enabled: true
Deferred Deletion Enabled: true
Deferred Deleted Device Count: 0
Library Version: 1.02.146-RHEL7 (2018-01-22)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 468a545b9edcd5932818eb9de8e72413e616e86e
runc version: 69663f0bd4b60df09991c08812a60108003fa340
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-327.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 15.66GiB
Name: fpvm-DBServer61
ID: WJF2:VDH3:GEII:QHMF:RMWB:OTKU:FC2H:BEQC:A7BJ:ANBP:FWWM:HD3M
Docker Root Dir: /mnt/docker/storage
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false

WARNING: devicemapper: usage of loopback devices is strongly discouraged for production use.
Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

device mapper 在构建自己的存储设备的时候是通过下面这个流程

首先会先创建一个空文件 A(Device mapper 驱动默认会创建一个100G的文件包含镜像和容器。每一个容器被限制在10G大小的卷内,可以自己配置调整,
docker 默认创建的是一个 100G 的空文件), 这个文件有 100G 大,但实际上是一个空文件。
    然后创建一个本地回环设备 loopback0, 这个设备的特点是可以关联这个空文件 A,并且可以把这个 loopback0 挂载出一个设备 B。
   这样任何对 B 的改动都会通过 loopback0 保存在这个文件 A 中。

创建一个虚拟块设备例子 

1、检查下哪个回环设备有空闲

[root@fp-web-130 mnt]# losetup -f

/dev/loop2

2、制作img镜像
[root@fp-web-130 src]# dd if=/dev/zero of=my.img count=2000

2000+0 records in

2000+0 records out

1024000 bytes (1.0 MB) copied, 0.00305511 s, 335 MB/s
3、查看生成的镜像

[root@fp-web-130 src]# ll

total 1000

-rw-r--r-- 1 root root 1024000 Feb  9 00:22 my.img
4、格式化镜像

[root@fp-web-130 src]# mkfs.ext3 my.img

mke2fs 1.42.9 (28-Dec-2013)

my.img is not a block special device.

Proceed anyway? (y,n) y  //这里输入y ,继续

Filesystem too small for a journal

Discarding device blocks: done

Filesystem label=

OS type: Linux

Block size=1024 (log=0)

Fragment size=1024 (log=0)

Stride=0 blocks, Stripe width=0 blocks

128 inodes, 1000 blocks

50 blocks (5.00%) reserved for the super user

First data block=1

Maximum filesystem blocks=1048576

1 block group

8192 blocks per group, 8192 fragments per group

128 inodes per group

Allocating group tables: done

Writing inode tables: done

Writing superblocks and filesystem accounting information: done

//查看格式化之后的镜像

[root@fp-web-130 src]# ll

total 144

-rw-r--r-- 1 root root 1024000 Feb  9 00:23 my.img

开始把img文件模拟成设备
[root@fp-web-130 src]#losetup /dev/loop2 my.img

//查看执行后的结果

//创建挂载目录

[root@fp-web-130 src]# mkdir /mnt/loop2test

//挂载
[root@fp-web-130 src]# mount /dev/loop2 /mnt/loop2test

执行卸载
[root@fp-web-130 /]#umount /mnt/loop2test/
//删除回环设备
[root@fp-web-130 /]#losetup -d loop2

查看结果,loop2已经没有了

linux磁盘之回环设备的更多相关文章

  1. centos 安装MATLAB :设置回环设备失败: 没有那个文件或目录

    基本参数:centos 7 x86_64,linux 系统, 安装matlab, 已经下载R2016b_glnxa64.iso 但挂载的时候遇到问题: [root@lf mnt]# mount -o  ...

  2. linux文件系统之loop环设备--新建一个文件系统并挂载

    1.  /dev目录下有所有已经连接到操作系统上的设备,他们能在/dev里出现就表示他们在硬件层面和系统核心层面被识别了.对于stdin.stdout.zero等设备是可以直接用> <这些 ...

  3. 攻城狮在路上(叁)Linux(二十三)--- linux磁盘参数修改(设备代码、设备名)

    一.mknod:设置设备代码 linux中,所有的设备都是用文件来表示,文件通过major与minor数值来判断. major为主设备代码,minor为设备代码(需要查询),示例如下: /dev/hd ...

  4. 关于Linux的本地回环路由lo [127.0.0.1 ]

    最近 打算配开发板的socket通讯,打印环境变量发现却没有 127.0.0.1 / # ifconfig -a eth0 Link encap:Ethernet HWaddr 86:43:C9:A1 ...

  5. Linux回环接口(loop-back/loopback)

    回环接口(loop-back/loopback) Moakap整理 Loopback接口是一个虚拟网络接口,在不同的领域,其含义也大不一样. 1. TCP/IP协议栈中的loopback接口 在TCP ...

  6. Linux回环接口-----(loop-back/loopback)

    回环接口(loop-back/loopback) Moakap整理 Loopback接口是一个虚拟网络接口,在不同的领域,其含义也大不一样. 1. TCP/IP协议栈中的loopback接口 在TCP ...

  7. Linux学习笔记之Linux磁盘及文件系统管理笔记

    Linux磁盘及文件系统管理 CPU,memory(RAM),I/O i/o: disks,ehtercard disks:持久存储数据 接口类型: IDE(ata): 并口,133MB/s;并行总线 ...

  8. linux磁盘分区fdisk命令操作(实践)

    写这篇的目的,还是要把整个过程完整的记录下来,特别是小细节的地方,通常很多情况是一知半解,平时不实践操作只凭看是没有用的,所以做这个行业就是要多动手,多学习,多思考慢慢你的思路也会打开.练就自己的学习 ...

  9. Linux磁盘及文件系统管理4

    文件系统的使用: 首先要“挂载”:mount命令和umount命令 根据文件系统之外的其它文件系统要想能够被访问,都必须通过“关联”到根文件系统上的某个目录来实现,此关联操作即为“挂载”:此目录即为“ ...

随机推荐

  1. LGP6008题解

    题意有点儿绕? 容易发现,题意相当于在说,如果某一格有水,那么 ban 掉上一行后,让与其连同的所有格子被画上水. 所以我们从上到下枚举行,依次 ban 掉每一行,然后数连通块个数即可. 需要注意的是 ...

  2. SP3734题解

    题意: 有 \(n\) 列表格,第 \(i\) 列有 \(a_i\) 个格子,问在 \(n\) 列表格中有多少种放置 \(k\) 个棋子的方法使没有棋子在同一列和同一行.(如果中间有一个"格 ...

  3. VuePress 博客优化之开启 Algolia 全文搜索

    前言 在 <一篇带你用 VuePress + Github Pages 搭建博客>中,我们使用 VuePress 搭建了一个博客,最终的效果查看:TypeScript 中文文档. 由于 V ...

  4. C#序列化和反序列化(json)

    一,什么是Json? json是存储和交换文本信息的方法,类似xml.但是json比xml更小,更快,j更易于解析.并且json采用完全独立于语言的文本格式(即不依赖于各种编程语言),这些特性使jso ...

  5. python 矩阵顺时针旋转90度

    # 4*4矩阵旋转90度 def matrix_transposition(data): for index,row in enumerate(data): for col in range(inde ...

  6. 题解0007:小木棍(P1120)

    (错误记录) 题目链接:https://www.luogu.com.cn/problem/P1120 题目描述:几根同样长的木棍,小冥把它们随意砍成了n段: 然后他又吃饱了撑的想把木棍拼上: 但是这个 ...

  7. 什么是线程组,为什么在 Java 中不推荐使用?

    ThreadGroup 类,可以把线程归属到某一个线程组中,线程组中可以有线程对象, 也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式. 为什么不推荐使用?因为使用有很多的安全隐患吧 ...

  8. Dubbo telnet 命令能做什么?

    dubbo 服务发布之后,我们可以利用 telnet 命令进行调试.管理. Dubbo2.0.5 以上版本服务提供端口支持 telnet 命令 连接服务 telnet localhost 20880 ...

  9. Java 死锁以及如何避免?

    Java 中的死锁是一种编程情况,其中两个或多个线程被永久阻塞,Java 死锁情况 出现至少两个线程和两个或更多资源. Java 发生死锁的根本原因是:在申请锁时发生了交叉闭环申请.

  10. 『忘了再学』Shell基础 — 6、Bash基本功能(输入输出重定向)

    目录 1.Bash的标准输入输出 2.输出重定向 (1)标准输出重定向 (2)标准错误输出重定向 (3)正确输出和错误输出同时保存 3.输入重定向 1.Bash的标准输入输出 我们前边一直在说,在Li ...