稀疏文件系统解析


dm.fs

参数 dm.fs 可以指定容器的 rootfs 的文件系统,但只支持 ext4/xfs,源码如下 funcNewDeviceSet(root string, doInit bool, options []string) (*DeviceSet, error) {

...

case"dm.fs":

if val !="ext4" && val != "xfs" {

return nil,fmt.Errorf("Unsupported filesystem %s\n", val)

}

devices.filesystem =va

参考: http://blogs.gnome.org/alexl/2013/10/15/adventures-in-docker-land/

一句话,因为 ext4/xfs 支持 DISCARD。这样,如果容器中删除了文件,空间就会马上还给 Thin pool,

因为 Thin provisioning 是支持 DISCARD 操作的。但是,默认情况下 Thin pool 是底层是稀疏文件 /var/lib/docker/devicemapper/devicemapper/data,所以,只有 Host 的文件系统支持 DISCARD,才

能保证稀疏文件空间释放。

Host 为 ext3

  

# docker images

REPOSITORY

TAG

IMAGE ID

CREATED

VIRTUAL SIZE

dbyin/tlinux1.2

latest

8297f05d459f

41 hours ago

399.6 MB

dbyin/httpd

latest

93e711fab1c1

7 weeks ago

412.7 MB

centos

latest

61038e6e3195

3 months ago

236.4 MB

我们可以查看稀疏文件的真正大小:

# ls -lsh/var/lib/docker/devicemapper/devicemapper/data

1.6G -rw------- 1root root 200G Nov 12 11:52 /var/lib/docker/devicemapper/devicemapper/data

# dmsetup status

yy_pool: 0 409600 thin-pool 0 13/65536 0/3200 - rw no_discard_passdowndocker-8:1-696417-base: 0 41943040 thin 928768 41943039

docker-8:1-696417-pool:0 419430400 thin-pool 73 633/524288 26115/3276800 - rw no_discard_passdown

我们删除一个 image

# docker rmidbyin/httpd

可以看到稀疏文件并没有变小:

# ls -lsh/var/lib/docker/devicemapper/devicemapper/data

1.6G -rw------- 1root root 200G Nov 12 11:52 /var/lib/docker/devicemapper/devicemapper/data

# dmsetup status

docker-8:1-696417-base:0 41943040 thin 928768 41943039

docker-8:1-696417-pool:0 419430400 thin-pool 73 490/524288 18758/3276800 - rw no_discard_passdown

no_discard_passdown 表示 dm层不会将 DISCARD传给底层的设备(loopback device),只删除映 射关系。

file:///C:/Users/WANGLI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif

Host 为 ext4

# dmsetup status

docker-253:1-8790943-pool:0 209715200 thin-pool 339 876/524288 32432/1638400 - rw discard_passdownqueue_if_no_space

可以看到这里为

discard_passdown,表示 dm会将 DISCARD传给底层设备(loopback device) queue_if_no_space 表示如果 thin pool没有空闲空间后,IO请求会被排队 error_if_no_space 表示如果 thin pool没有空闲空间后,直接报错。

# ls -slh/var/lib/docker/devicemapper/devicemapper/data

2.5G -rw-------. 1root root 100G Nov 12 06:14 /var/lib/docker/devicemapper/devicemapper/data

# docker rmi dbyin/httpd

# ls -slh/var/lib/docker/devicemapper/devicemapper/data

2.0G -rw-------. 1root root 100G Nov 12 06:15 /var/lib/docker/devicemapper/devicemapper/data

可以看到删除 image 前后,稀疏文件大小的变化。

dm.blkdiscard

docker 还提供这个参数,默认值为 true,即删除 image 后,会调用 DISCARD,真正释放 HOST 上空

间。

func (devices *DeviceSet) deleteDevice(info*DevInfo) error { if devices.doBlkDiscard {

// This is a workaround for the kernel notdiscarding block so

// on the thin pool when we remove a thinpdevice, so we do it

// manually

iferr := devices.activateDeviceIfNeeded(info); err == nil {

if err := BlockDeviceDiscard(info.DevName()); err!= nil { log.Debugf("Error discarding block on device: %s(ignoring)", err)

}

}

}

...

}

funcBlockDeviceDiscard(path string) error {

...

if err := ioctlBlkDiscard(file.Fd(), 0, size); err!= nil { return err

}

...

}

func ioctlBlkDiscard(fd uintptr, offset, lengthuint64) error { var r [2]uint64

r[0]= offset r[1] = length

if_, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, BlkDiscard,uintptr(unsafe.Pointer(&r[0]))); err != 0 {

return err

}

return nil

}

更多精彩内容请关注:http://bbs.superwu.cn

关注超人学院微信二维码:

关注超人学院java免费学习交流群:

时间: 06-01

稀疏文件系统解析的相关文章

Node.JS文件系统解析

1.Node.js 文件系统 var fs = require("fs") 2.异步和同步 读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync(). var fs = require('fs') fs.readFile( 'a.txt','utf-8', function (err,data) { if( err ) { console.error(err) }else{ console.log( "not aynsc===>

linux 文件系统解析及相关命令(转)

简介 文件系统就是分区或磁盘上的所有文件的逻辑集合. 文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件.目录.软连接及文件保护信息等都存储在其中. 不同Linux发行版本之间的文件系统差别很少,主要表现在系统管理的特色工具以及软件包管理方式的不同,文件目录结构基本上都是一样的. 文件系统有多种类型,如: ext2 : 早期linux中常用的文件系统: ext3 : ext2的升级版,带日志功能: RAMFS : 内存文件系统,速度很快: iso9660:

linux 文件系统解析及相关命令

简介 文件系统就是分区或磁盘上的所有文件的逻辑集合. 文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件.目录.软连接及文件保护信息等都存储在其中. 不同Linux发行版本之间的文件系统差别很少,主要表现在系统管理的特色工具以及软件包管理方式的不同,文件目录结构基本上都是一样的. 文件系统有多种类型,如: ext2 : 早期linux中常用的文件系统: ext3 : ext2的升级版,带日志功能: RAMFS : 内存文件系统,速度很快: iso9660:

iKuai 固件 文件系统解析

由于职业原因, 需要 在路由器上做一些功能, 在网上找了很多资料, 都模糊不清, 所以就有了解开iKuai固件的想法 本帖为技术贴,只是为了分享方法, 本帖只说释放固件的过程, 和另一种恢复固件的方式,  仅作为参考. 如果有侵权请联系我. iKuai固件是这个 当前最新的 iKuai8_2.7.10_Build20170810-16_54.img.rar linux 系统我用的是 Ubuntu 12.04.5 LTS 用 physdiskwrite.exe 这个烧写 CF卡, 烧写完成 挂载到

Linux 文件系统模型

声明:本文仅限于 cnblogs 发布,其他第三方网站均为盗版,原文地址:Linux 文件系统模型 在 Linux 环境下有过一些经历的同学可能都会遇到一个问题,这个问题就是往机器上插入 U盘 或者其他外接设备的时候,居然经常没有反应,上网查找之后别人会教你怎么用几条命令然后你就可以像操作正常文件一样操作这些设备了(当然,现在很多流行的桌面Linux环境例如 Ubuntu/Centos 都支持自动挂载了). 但是,可能我们也曾想过为什么 Linux 要这么麻烦,很多时候我遇到这种问题都是想毕竟

Linux文件系统误装入到Ocfs2文件系统的数据卷上的解决过程

一.什么是Linux文件系统 Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux用户和程序看到的文件.目录.软连接及文件保护信息等都存储在其中.Linux是一个性能稳定.功能强大.效率高的操作系统.它在功能特性方面与Unix系统相似,同时又具有多任务.多用户.多平台等若干特性.· 二.故障描述 由于用户误操作,将Linux文件系统误装入到Ocfs2文件系统的数据卷上,导致原始Ocfs2文件系统被新格式化Ext4文件系统,据对两种文件系统格

Maven-pom.xml

POM:Poject Object Model,项目对象模型. 项目基础信息: modelVersion: 当前POM模型的版本. groupId: 当前Maven项目隶属的实际项目. artifactId: 当前Maven项目的实际项目名称.推荐使用项目名-模块名的方式. version: 项目当前的版本. packaging: 项目的打包方式.默认为jar. classifier: 定义构建输出的一些附属构件.如源码.javadoc等.不能直接定义项目的classifier,因为附属构件不是

Maven详解之仓库------本地仓库、远程仓库

在Maven中,任何一个依赖.插件或者项目构建的输出,都可以称之为构件. Maven在某个统一的位置存储所有项目的共享的构件,这个统一的位置,我们就称之为仓库.(仓库就是存放依赖和插件的地方) 任何的构件都有唯一的坐标,Maven根据这个坐标定义了构件在仓库中的唯一存储路径, 解读Maven在仓库中的存储路径: 1.基于groupId准备路径,将句点分隔符转成路径分隔符,就是将  "."  转换成 "/" ; example: org.testng --->o

linux中生成考核用的FAT32文件系统结构样例

实验X说明:FAT32-1.img是一个包含FAT32文件系统的磁盘镜像,请使用winhex手工方式读出这个文件系统内的指定文件,并回答其md5 HASH值. 要求: 1.利用WINHEX手工方式读取. 2.不得使用WINHEX模板功能. 3.不得使用WINHEX文件系统解析功能. 4.填写的MD5 HASH值全部为大写,不包括0x头标或H尾标,中间不得有任何间隔符号(包括空格.制表符.'-'等符号),以WINHEX软件运算出的HASH值为准. 实验目的: 1.实现手工方式跟踪一个FAT32文件