
分布式存储
oscube
这个作者很懒,什么都没留下…
展开
-
fuse hlevel缓存的释放
在hlevel中建立的缓存和lowlevel中fuse_inode是一一对应的,因此他的释放也由内核来决定,释放的时机参看vfs中inode的释放。使用之前会lookup,如果缓存已经不存在了那么就重建,如何保证释放时,先释放子文件?不需要保证先释放子文件,父目录中会记录引用数ref,子文件未解除和父目录的关联时,即子文件对象中任然有指针指向父目录时,ref不会减为0,所以对象不会释放。forget_node会调用unhash解除和父目录的关联,并且通过父目录 + name无法查到自己,减少父目录的引原创 2020-12-29 21:38:56 · 2187 阅读 · 0 评论 -
ext2数据块预分配
ext2_truncate–>ext2_discard_preallocext2_alloc_block–>ext2_discard_preallocext2_put_inode–>ext2_discard_preallocext2_release_file–>ext2_discard_prealloc原创 2020-12-29 21:33:02 · 159 阅读 · 0 评论 -
ceph使用quorum如何保障数据一致
ceph包含两个层面的log,每个osd有自己的log,保障单个osd操作的原子性。每个pg有pglog,保障多副本之间的一致性。pglog中带有pg的版本号,由pgleader每次更新数据的时候分配,pglog整体发送给每个osd,osd收到请求后,转化成osdlog写入本地磁盘中。如果写入过程中,部分osd出现了故障,可以通过校验日志的方式,来同步副本并达成一致。...原创 2020-12-29 21:28:49 · 812 阅读 · 0 评论 -
ceph osd的多种状态
acting set 通过crush算法计算出来的osdup set 正在提供读写服务的osd当出现osd down掉或者发生数据迁移时actiong set会重新设置,把数据迁移到acting set中,而使用up set提供读写服务peering完毕不意味着所有副本都具有相同数据,只是标明所有副本达成了一致(版本,主从关系等)ACTIVE代表peering已经完毕,代表primary osd具有有效数据,pg可以提供读写服务CLEAN代表peering已经完毕,并且所有副本数据no str原创 2020-12-29 21:25:49 · 1467 阅读 · 0 评论 -
ceph osd请求处理流程
OSD::dequeue_op-->PrimaryLogPG::do_request-->PrimaryLogPG::do_op-->PrimaryLogPG::execute_ctx-->PrimaryLogPG::prepare_transaction-->PrimaryLogPG::do_osd_ops原创 2020-10-21 19:50:55 · 470 阅读 · 0 评论 -
ceph内核rbd源码
rbd_sysfs_init 函数先调用device_register函数注册一个设备到内核中 在注册一个总线类型到内核中。do_rbd_add-->rbd_dev_device_setup-->rbd_init_diskrbd_init_disk中设置fops 为rbd_bd_ops原创 2020-10-21 19:48:46 · 349 阅读 · 0 评论 -
ceph内核模块编译
以linux-4.4.77为例(要求编译rbd.ko的内核源码与当前内核一致)cdlinux-4.4.77/net/ceph/makeCONFIG_CEPH_LIB=m-C/lib/modules/`uname-r`/buildM=`pwd`modulescplinux-4.4.77/net/ceph/Module.symverslinux-4.4.77/drivers/block/cddrivers/block/makeCONFIG_BLK_DEV_RBD=m-C/...原创 2020-10-21 19:47:20 · 410 阅读 · 0 评论 -
目录项高速缓存
缓存状态缓存管理原创 2020-10-21 19:36:55 · 647 阅读 · 0 评论 -
文件系统open操作流程
sys_open-->open_namei-->path_walk -->(vfs_create) -->(error = -EISDIR;if (S_ISDIR(inode->i_mode) && (flag & FMODE_WRITE))) -->...原创 2020-10-21 19:34:57 · 471 阅读 · 0 评论 -
inode缓存的生命周期
destroy_inode 释放inode内存对象put_inode 减少索引节点引用计数时调用drop_inodedelete_inode 删除索引节点在硬盘上的数据(包括修改所在块组的位图)clear_inode 重置inode内存对象中的数据,重置状态,解除和buffer_head的关联等等。iput-->put_inode -->(drop_inode 2.4内核没找到) -->delete_inode | clear_ino...原创 2020-10-21 19:27:18 · 601 阅读 · 0 评论 -
bcache
参考https://blog.youkuaiyun.com/liumangxiong/article/details/18090043https://blog.youkuaiyun.com/liuaigui/article/details/54882935https://blog.youkuaiyun.com/column/details/flashcache.htmlhttps://blog.youkuaiyun.com/colu...原创 2018-06-08 10:42:41 · 3531 阅读 · 0 评论 -
nfsclient 源码笔记
此处会设置xprt的锁标记->rpc_xdr_encode->xprt_transmit->xprt->ops->send_request ,此处可能会因为发送缓冲区满而无法继续发送,但是会记录已经发送的长度,不会全部从头开始->rpc_sleep_on 在call_transimit,将task在等待队列上,此处不是立即挂起,而是在call_transmi调结...原创 2018-06-04 14:40:24 · 5407 阅读 · 0 评论 -
i_rdev i_bdev i_mapping 关系
i_bdev只有块设备文件系统的inode会设置该属性,对应的是块设备的数据结构i_rdev 通过mknod创建的inode都会指定设备号一个块设备可以通过mknod创建多个具有相同i_rdev的inode,那么在访问这些inode的时候,具体对应的块设备是i_bdev指定的,这和普通的文件系统是不一样的,普通文件系统只使用sb中记录的s_bdev。所有使用相同设备号创建的inode的i_...原创 2018-06-04 14:43:04 · 2601 阅读 · 0 评论 -
linux为什么不允许创建文件夹的硬链接
使用方面考虑,会产生递归黑洞,举例:文件夹 a,b,在a下面创建b文件夹得硬链接c,在b下面创建a文件夹的硬链接d,ls a ,会看到c,ls c,看到b下的文件夹d,再ls d又看到c,这样可以无限ls下去软连接在访问时readlink有递归次数的限制,硬链接就是普通inode,所以没办法记录递归次数代码实现角度代码实现方面应该是可以做到的。首先pwd不是由文件系统拼接路径的,而是记录在一个全局变量中,所以cd 。。 的时候只是需要获得上一级目录inode的属性来检查权...原创 2020-06-13 21:02:50 · 836 阅读 · 0 评论 -
通过ctdb来控制linux lio target启动关闭
修改/etc/ctdb/functions文件,增加target环境变量 ctdb_compat_managed_service"$CTDB_MANAGES_VSFTPD""vsftpd" ctdb_compat_managed_service"$CTDB_MANAGES_SAMBA""samba" ctdb_compat_managed_service"$CTDB_MANAGES_WINBIND""winbind" ctdb_compat_...原创 2020-10-21 11:32:47 · 608 阅读 · 0 评论 -
ext2磁盘数据结构
只使用块组0中的超级块和组描述符,其他块组中的超级块和组描述符可以在块组0损坏时进行恢复。其他块组中的超级块和组描述符是否需要按一定策略和块组0中的进行同步。如果需要,什么时机?// 根据文件inode获取文件索引节点所在的块组编号block_group = (inode->i_ino - 1) / EXT2_INODES_PER_GROUP(inode->i_sb); if (block_group >= inode->i_sb->u.ext2_sb.s_g.原创 2020-07-23 23:16:26 · 248 阅读 · 0 评论 -
swift-container源码阅读
containerserver:run_wsgi-->run_server-->loadwsgi.loadapp-->app_factorywsgi会在收到http请求之后调用ContainerController.__call____call__中根据http请求头部的方法类型来决定调用相应的处理函数:PUT,POST,GET,HEAD,DELETE,REPLICA需要注意的是,__call__方法在处理请求时,先会检查配置文件中的replicat...原创 2020-07-23 22:48:17 · 294 阅读 · 0 评论 -
centos安装swift
1,先安装pip:pip: http://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#md5=62a9f08dd5dc69d76734568a6c040508tar zxpf pip-1.1.tar.gzcd pip-1.1python setup.py install2,下载swift源码yum install gitgit clone https://github.com/openstack/swift..原创 2020-07-23 22:45:37 · 1182 阅读 · 0 评论 -
为什么磁盘裸容量不等于可用容量
为了方便用户或应用访问,磁盘在使用之前都会格式化为文件系统,例如:ext4、btrfs、xfs等等。每种文件系统会按照自己特有的方式来组织文件、管理磁盘空间的分配和回收以及保证原子性、这就需要元数据和日志,必然会导致一些额外的存储空间开销。所以每个磁盘的容量并不能完全被应用使用。在分布式存储容量估算的时候,这一点更加重要。每个文件系统都实现statvfs接口,来统计存储空间的使用情况。应用可以通过系统调用的方式来获取这一统计信息。下面是简单的代码样例:#include <stdio.h>原创 2020-06-13 22:19:26 · 1620 阅读 · 1 评论 -
go-fuse
server.go 逻辑主循环,不断从内核收取request,处理完毕后,再写回内核。opcode.go 根据操作类型,调用不同的处理函数,进行处理(doInit, doCreate,doRead等等)。nodefs/fsconnector.go 负责转换内核中inodeid到fuse的内存数据结构,opcode中的处理函数,最终会调用fsconnector的成员函数,这个通过New...原创 2018-06-04 14:38:22 · 3709 阅读 · 1 评论 -
centos7.1中安装calamari
ceph集群安装确定版本[root@node1050 calamari]# ceph --versionceph version 10.2.9 (2ee413f77150c0f375ff6f10edd6c8f9c7d060d0)[root@node1050 calamari]#配置无密访问准备脚本[root@node1050 17-ceph-install]# cat rei...原创 2018-06-04 14:51:46 · 4739 阅读 · 0 评论 -
修改crushmap实现ssd sata混合部署的
# begin crush maptunable choose_local_tries 0tunable choose_local_fallback_tries 0tunable choose_total_tries 50tunable chooseleaf_descend_once 1tunable chooseleaf_vary_r 1tunable straw_calc_vers...原创 2018-06-04 14:56:09 · 1586 阅读 · 0 评论