前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Ceph快照爱你不容易系列 01:虚拟机挂掉了

Ceph快照爱你不容易系列 01:虚拟机挂掉了

作者头像
腾讯云TStack
发布于 2020-04-20 13:10:20
发布于 2020-04-20 13:10:20
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

一、问题 

最近遇到一个问题,一般云平台都有定时快照功能,快照的个数是有限制的,比如一个虚拟机同一时刻最多有5个快照,如果要创建第六个快照,需要先把时间最久的第一个快照删除,然后再创建新快照,我们的一个老测试平台中Ceph的版本是10.2.7,在创建快照的时候偶尔出现虚拟机挂掉,虚拟机qemu日志如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
block i/o error in device 'drive-virtio-disk0': Cannot send after transport endpoint shutdown (108)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
而且出现了大概一分多钟的慢请求告警;

二、分析 

我们的猜想

1)删除快照的压力

首先我们知道rbd的快照创建的时候是秒级的,因为只是创建了一些元数据,不会对ceph集群产生很多的压力,但是删除快照不一样,删除的快照虽然是异步操作,但是会产生数据的删除操作,而且是删除最老的快照,所以快照的数据很多已经经过cow拷贝了数据,所以删除快照会产生很大的存储压力;

2)osd所在磁盘性能比较差

我们也注意到了这套出问题的ceph集群在使用ceph osd perf发现这套集群osd磁盘的性能参差不齐,有些延迟有1000-2000ms,可以这是个根源,那为什么会出现虚拟机挂掉呢?

审计日志的查找

因为我们没有开启rbd客户端的日志,所以看不到qemu在调librbd的时候出现了什么问题,于是去Ceph服务端查看,我们在虚拟机挂掉的时间周围在ceph的审计日志中找到了这条记录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020-03-12 23:53:11.646925 mon.0 127.0.0.1:6789/0 1565359 : audit [INF] from='client.? 127.0.0.1:0/3655019494' entity='client.cinder' cmd='[{"prefix": "osd blacklist", "addr": "127.0.0.1:0/1548601709", "blacklistop": "add"}]': finished2020-03-13 00:11:20.690720 mon.0 127.0.0.1:6789/0 1566350 : audit [INF] from='client.? 127.0.0.1:0/2040474367' entity='client.cinder' cmd='[{"prefix": "osd blacklist", "addr": "127.0.0.1:0/1548601709", "blacklistop": "rm"}]': finished2020-03-13 00:15:28.399958 mon.0 127.0.0.1:6789/0 1566589 : audit [INF] from='client.? 127.0.0.1:0/66127387' entity='client.cinder' cmd='[{"prefix": "osd blacklist", "addr": "127.0.0.1:0/2546996510", "blacklistop": "add"}]': finished

触发了把客户端加入黑名单的命令,也就是说qemu虚拟机的客户端被加入到了osd的黑名单,想想加入黑名单确实会导致qemu虚拟机在继续发送数据的时候会被拒绝,后面代码分析也是正确的,具体代码在下面解释

加入黑名单操作谁触发的

那到底谁触发了黑名单操作,就是找入口,看了一下大概有三个入口,分析如下:

入口1:librbd有一个break_lock接口,这个接口中会有可能触发add blocklist

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int break_lock(ImageCtx *ictx, const string& client,     const string& cookie){  ...  if (ictx->blacklist_on_break_lock) {    ...    r = rados.blacklist_add(client_address,            ictx->blacklist_expire_seconds);    ...  }  ...}

入口2:librados有add blocklist接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int blacklist_add(const std::string& client_address,                      uint32_t expire_seconds);
代码语言:javascript
代码运行次数:0
运行
复制

入口3:在创建快照的请求一个回调函数中,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename I>struct C_BlacklistClient : public Context {  ...
  virtual void finish(int r) override {    librados::Rados rados(image_ctx.md_ctx);    r = rados.blacklist_add(locker_address,                            image_ctx.blacklist_expire_seconds);    on_finish->complete(r);  }};
代码语言:javascript
代码运行次数:0
运行
复制

前面两个入口只能是openstack或者qemu代码进行调用,查了一下代码没有,那就是第三个入口,而且我们确实是在创建快照的时候出现问题,同时我们从审计日志中也可以看出我们的请求是来自client.cinder用户,也即是来自外部调ceph,而不是ceph内部产生的,如果内部产生或者有谁命令行调用那用户应该是client.admin

创建快照的时候会什么会有这个回调函数

我们首先看一下这个回调类是在哪里创建的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename I>void BreakRequest<I>::send_blacklist() {  ...  m_image_ctx.op_work_queue->queue(new C_BlacklistClient<I>(m_image_ctx,                                                            m_locker.address,                                                            ctx), 0);}

可以看到是在send_blacklist函数中创建的回调类,那这个函数是谁调用的呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename I>void BreakRequest<I>::handle_get_watchers(int r) {  ...
  for (auto &watcher : m_watchers) {    if ((strncmp(m_locker.address.c_str(),                 watcher.addr, sizeof(watcher.addr)) == 0) &&        (m_locker.handle == watcher.cookie)) {      ldout(cct, 10) << "lock owner is still alive" << dendl;
      if (m_force_break_lock) {        break;      } else {        finish(-EAGAIN);        return;      }    }  }
  send_blacklist();}

在这个handle_get_watchers函数中掉了,这个函数主要是用来获取一个rbd上面的所有watcher,那watcher是什么呢?

每跟rbd创建一个新的连接都会有一个watcher,也就是要获取这个rbd的所有客户端,我们可以通过分析创建快照的代码知道,创建快照要获取exclusive_lock锁,并且要知道这个锁现在被哪个watcher,也就是客户端拥有者,这样会把创建快照的请求分为local request和remote request交个锁的拥有者去执行创建快照元数据操作,而请求的所有者已经在创建连接refresh的时候已经保存到了m_locker中了,现在在获取watcher只是确认一下这个locker的owner是不是还存在。

这里先等一下,我们想一下,在既有qemu客户端又有nova-compute客户端创建快照的操作的时候,因为虚拟机qemu是第一个操作这个rbd的,所以exclusive_lock的owner就是qemu进程。上面的代码的正常流程是nova-compute在创建rbd快照的时候,watcher会返回两个值,一个是qemu虚拟机客户端,一个nova-compute发起创建快照的这个自身客户端,而m_locker这个应该是qemu虚拟机这个客户端,在if判断的时候应该能匹配到qemu的客户端这个watcher,如过匹配到就是走下面的if和else,而m_force_break_lock是写死false

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename I>void AcquireRequest<I>::send_break_lock() {  ...  auto req = BreakRequest<I>::create(    m_image_ctx, m_locker, m_image_ctx.blacklist_on_break_lock, false, ctx);  req->send();}

就是上面创建的第四个参数,现在既然能走到send_blacklist,那就有两种可能,一种就是从osd那边返回的watcher是空的,没有进入for循环,一种就是没有匹配进入if也就是qemu虚拟机的watcher没了,猜想是第二种,那watcher为什么会没了呢?首先我们看一下watcher在osd那边是怎么存储的?

watcher持久化

watch持久化在前面的文章中我已经分析过是存储在rbd_header的文件对象的扩展属性中,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@con02 0.ee_head]# attr -q -g "ceph._" rbd\\uheader.301027238e1f29__head_A5BD3CEE__0   > /root/object_info_t.txt[root@con02 0.ee_head]# attr -q -g "ceph._@1" rbd\\uheader.301027238e1f29__head_A5BD3CEE__0   >> /root/object_info_t.txt

内容类似如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{    "oid": {        "oid": "rbd_header.301027238e1f29",        "key": "",        "snapid": -2,        "hash": 2780642542,        "max": 0,        "pool": 0,        "namespace": ""    },    ...
    "watchers": {        "client.8079633": {            "cookie": 139996606507840,            "timeout_seconds": 30,            "addr": {                "nonce": 3613298630,                "addr": "127.0.0.1:0"            }        }    }}

我们看到watchers是一个字典,当前只是示例,可以看到在watcher中有一个timeout_seconds字段,默认是30s,那这个字段是干嘛的呢,看名字就是超过30s删除,那是怎么删除

watcher的timeout 

watcher就是客户端,其实客户端为了保活,会通过心跳ping来更新超时,如何做的呢,首先心跳在objecter的tick函数中每个5s调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void Objecter::tick(){  ...  for (map<uint64_t,LingerOp*>::iterator p = s->linger_ops.begin();  p != s->linger_ops.end();  ++p) {      LingerOp *op = p->second;      LingerOp::unique_lock wl(op->watch_lock);      assert(op->session);      ldout(cct, 10) << " pinging osd that serves lingering tid " << p->first         << " (osd." << op->session->osd << ")" << dendl;      found = true;      if (op->is_watch && op->registered && !op->last_error)  _send_linger_ping(op);    }  ...    
}

通过_send_linger_ping就向osd发送心跳,以更新watcher的超时

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void Objecter::_send_linger_ping(LingerOp *info){  ...  opv[0].op.op = CEPH_OSD_OP_WATCH;  opv[0].op.watch.cookie = info->get_cookie();  opv[0].op.watch.op = CEPH_OSD_WATCH_OP_PING;  opv[0].op.watch.gen = info->register_gen;  ...
}

看到请求操作码是CEPH_OSD_OP_WATCH,这里还有一个watcher的操作码CEPH_OSD_WATCH_OP_PING,在osd端查看处理流程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops){   ...   case CEPH_OSD_OP_WATCH:{     ...     else if (op.watch.op == CEPH_OSD_WATCH_OP_PING) {    ...    dout(10) << " found existing watch " << w << " by " << entity << dendl;    p->second->got_ping(ceph_clock_now(NULL));    result = 0;        }     ...
   }   ...}

通过两个操作码的匹配可以看到是got_ping进行处理,函数如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void Watch::got_ping(utime_t t){  last_ping = t;  if (conn) {    register_cb();  }}

这里看到有注册回调

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void Watch::register_cb(){  Mutex::Locker l(osd->watch_lock);  if (cb) {    dout(15) << "re-registering callback, timeout: " << timeout << dendl;    cb->cancel();    osd->watch_timer.cancel_event(cb);  } else {    dout(15) << "registering callback, timeout: " << timeout << dendl;  }  cb = new HandleWatchTimeout(self.lock());  osd->watch_timer.add_event_after(    timeout,    cb);}

上面就是watcher超时更新,大概意思就是如果有收到ping请求,就把原来的超时回调给删了,注册新的30s超时回调,通俗讲就是续命保活,好了到这里我们分析完了watcher超时更新,我们上面说过,加入加黑名单流程是因为没有匹配qemu的watcher,可以就是osd端没有收到ping心跳导致没有更新watcher的超时,然后watcher被删除了。

而objecter的tick是每隔5s会调用一次,那为什么osd没有收到呢,那就回想一下我们开头的说的几个条件,osd磁盘性能很差,删除快照的时候产生大量的io,而tick发的心跳也是作为op请求网络发送到osd进行处理,那很有可能会出现osd在磁盘性能很差的情况下出现ping心跳请求被block,这也跟我们收到一分多钟的慢请求告警一致。好我们继续跟踪在触发了add blacklist之后,虚拟机的qemu进程是如何io block挂掉的

add blacklist流程

创建快照时的回调类在触发add blacklist时,请求是发给mon的,mon在收到请求之后通过paxos,修改osdmap,把黑名单记录在了osdmap里面,由于osdmap的改变,osdmap的版本会加1,从而扩散到各个osd,下面是版本加1的osdmap

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{  ...  "pg_temp": [],  "blacklist": {    "127.0.0.1:0/147234759": "2020-03-15 22:20:44.052504"  },  ...}

qemu读写请求继续操作 

qemu虚拟机根本不知道自己被加入了黑名单,还是会调用librbd继续发送读写请求,那我们看看osd那边是怎么处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void ReplicatedPG::do_op(OpRequestRef& op){  ...  // blacklisted?  if (get_osdmap()->is_blacklisted(m->get_source_addr())) {    dout(10) << "do_op " << m->get_source_addr() << " is blacklisted" << dendl;    osd->reply_op_error(op, -EBLACKLISTED);    return;  }  ...}

在osd的do_op函数中检查请求来的客户端是不是在黑名单中,是则返回EBLACKLISTED错误码,而这个错误码是108,也即是shutdown错误,所以我们看到qemu虚拟机日志中出现的108错误。至此我们就分析完了。

三、解决方法 

那有什么可以避免在watcher失效之后,不执行add blacklist,可以修改一个参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename I>void BreakRequest<I>::send_blacklist() {  if (!m_blacklist_locker) {    send_break_lock();    return;  }
  CephContext *cct = m_image_ctx.cct;  ldout(cct, 10) << dendl;
  // TODO: need async version of RadosClient::blacklist_add  using klass = BreakRequest<I>;  Context *ctx = create_context_callback<klass, &klass::handle_blacklist>(    this);  m_image_ctx.op_work_queue->queue(new C_BlacklistClient<I>(m_image_ctx,                                                            m_locker.address,                                                            ctx), 0);}

可以看到在生成加黑名单的回调类之前,如果m_blacklist_locker为false,则可以跳过,这个参数是通过配置rbd_blacklist_on_break_lock赋予的,这个配置默认是True,所以修改配置为false,则可以避免add blacklist操作。

下期预告:Ceph快照爱你不容易系列(2)频繁创建删除快照导致OSD启动慢

小甲师兄的系列大作

小甲陪你一起看Ceph (OSDC |上篇)

小甲陪你一起看Ceph (OSDC |下篇)

· END ·

记得文末点个在看鸭~


点就完事儿了!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云TStack 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Ceph快照爱你不容易系列 03:快照数据一致性浅析
点击上方“腾讯云TStack”,关注我们,获取最in云端资讯和海量技术干货~ ●导语● 快照一般是指数据存储的某一时刻的状态记录,类似于给数据按下快门拍了一张照片,所以也叫snapshot。而存储系统的快照在云计算中广泛使用,比如块存储的快照。很多其他高级功能基本都要依赖快照来实现,比如备份、热迁移等。而对于快照,我们经常会问的一个问题就是快照的数据是不是完整的,会不会出现快照回滚之后数据丢失。其实这也就是我们常说的快照数据一致性问题。 下面主要分以下几点进行讨论: (1) 一致性的分类 (2)
腾讯云TStack
2020/07/20
2.2K0
Ceph快照爱你不容易系列 02:OSD启动慢了
一、问题 最近有一个环境出现OSD启动很慢,要40多分钟,很奇怪,看一下osd的日志发现一直在刷类似下面的日志 2020-04-05 19:52:59.925 7fa86b863700 20 PGPool::update cached_removed_snaps [1~f5,f7~1,f9~7,101~1,103~12d,233~ea,31e~1,320~64,385~1e,3a4~16b,510~7e,58f~4e,5de~49,629~8,632~28,65b~31,68e~a,699~c
腾讯云TStack
2020/04/20
1.7K0
Ceph快照详解
Ceph的快照与其他系统的快照一样,是基于COW(copy-on-write)实现的。其实现由RADOS支持,基于OSD服务端——每次做完快照后再对卷进行写入时就会触发COW操作,即先拷贝出原数据对象的数据出来生成快照对象,然后对原数据对象进行写入。于此同时,每次快照的操作会更新卷的元数据,以及包括快照ID,快照链,parent信息等在内的快照信息。
thierryzhou
2022/12/01
4.4K0
Ceph快照详解
CephFS源码分析
13. 深入研究 13.1 MDS启动阶段分析 //src/ceph_mds.cc int main(int argc, const char **argv) { ceph_pthread_setname(pthread_self(), "ceph-mds"); vector<const char*> args; argv_to_vec(argc, argv, args); env_to_vec(args); //初始化全局信息 auto cct = global_init(NU
Lucien168
2020/07/20
1.9K0
CephFS源码分析
记录ceph两个rbd删除不了的处理过程
在一个使用的环境发现两个ceph的rbd删除不了,发现两个rbd都是由于残留了watch的信息。在此记录处理过程。
星哥玩云
2022/07/28
8580
Ceph理解
- 图虽然很复杂,但如果理解了几个基本操作的含义就很好读下来了,这里是三个操作的伪代码,take和emit很好理解,select主要是遍历当前bucket,如果出现重复、失败或者超载就跳过,其中稍微复杂的“first n”部分是一旦遇到失败,第一种情况是直接使用多备份,第二种情况是使用erasing code基本可以忽略。看着下面的图就更好理解具体的算法了
ZHaos
2019/02/27
2.4K0
KVM虚拟机克隆快照总结
1.虚拟机支持快照 (1)已创建快照虚拟机不允许导出、克隆、迁移操作 (2)磁盘快照使用外部快照,创建快照需要暂停虚拟机(是否需要手动暂停)或关闭虚拟机,支持raw和qcow2格式 (3)只有虚拟机运行的时候,才允许创建内存快照
Laikee
2022/04/25
8000
Ceph 集群整体迁移方案
场景介绍:在我们的IDC中,存在着运行了3-6年的Ceph集群的服务器,这些服务器性能和容量等都已经无法满足当前业务的需求,在购入一批高性能机器后,希望将旧机器上的集群整体迁移到新机器上,当然,是保证业务不中断的前提下,再将旧机器下架回收。本文就介绍了一种实现业务不中断的数据迁移方案,并已经在多个生产环境执行。 本文的环境均为:Openstack+Ceph 运行虚拟机的场景,即主要使用RBD,不包含RGW,MDS。虚机的系统盘(Nova),云硬盘(Cinder),镜像盘(Glance)的块均保存在共享存储C
腾讯云TStack
2018/04/02
4.1K0
每天10分钟玩转Ceph(二)探索RBD块存储接口
部署完Ceph集群之后,如何在Ceph集群中存储文件呢?ceph提供了三种接口供用户使用,分别是:
HappyLau谈云计算
2020/03/02
5K0
每天10分钟玩转Ceph(二)探索RBD块存储接口
Ceph分布式存储工作原理 及 部署介绍
存储根据其类型,可分为块存储,对象存储和文件存储。在主流的分布式存储技术中,HDFS/GPFS/GFS属于文件存储,Swift属于对象存储,而Ceph可支持块存储、对象存储和文件存储,故称为统一存储。
洗尽了浮华
2022/03/28
7.6K0
Ceph分布式存储工作原理 及 部署介绍
ceph-mimic版
Ceph使用RADOS提供对象存储,通过librados封装库提供多种存储方式的文件和对象转换。外层通过RGW(Object,有原生的API,而且也兼容Swift和S3的API,适合单客户端使用)、RBD(Block,支持精简配置、快照、克隆,适合多客户端有目录结构)、CephFS(File,Posix接口,支持快照,社会和更新变动少的数据,没有目录结构不能直接打开)将数据写入存储。
yuezhimi
2020/09/30
9420
Ceph部署在Centos7上简明摘要
最近需要研究Ceph,也部署了一下环境,本文分为1,2,3,4章为概念介绍,第5章为实践环节。
麒思妙想
2020/07/10
1K0
Ceph CookBook
原因:2017年5月4日 星期四 理解Ceph。 说明:阅读书籍。 官方文档:http://docs.ceph.com/docs/master/rbd/rbd-openstack/ 块存储、文件储存、对象存储:http://limu713.blog.163.com/blog/static/15086904201222024847744/ 可靠性、低成本、可扩展 SDS(软件定义存储-softwate defined storage) SDS可以降低存储基础设施的TCO(Total Cost of O
ZHaos
2019/02/27
1.6K0
Ceph介绍及原理架构分享
Ceph项目最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),并随后贡献给开源社区。在经过了数年的发展之后,目前已得到众多云计算厂商的支持并被广泛应用。RedHat及OpenStack都可与Ceph整合以支持虚拟机镜像的后端存储。
Lucien168
2020/07/20
2.3K0
Ceph介绍及原理架构分享
QEMU3 - 使用ceph来存储QEMU镜像
ceph简介 Ceph是一个PB级别的分布式软件定义存储系统,为用户提供了块存储、对象存储以及符合POSIX标准的文件系统接口。目前,Ceph已经成为Openstack最受欢迎的后端存储系统。下图为c
宅蓝三木
2018/02/07
2.4K0
QEMU3 - 使用ceph来存储QEMU镜像
kubernetes(十九) Ceph存储入门
Ceph是当前非常流行的开源分布式存储系统,具有高扩展性、高性能、高可靠性等优点,同时提供块存储服务(rbd)、对象存储服务(rgw)以及文件系统存储服务(cephfs),Ceph在存储的时候充分利用存储节点的计算能力,在存储每一个数据时都会通过计算得出该数据的位置,尽量的分布均衡。目前也是OpenStack的主流后端存储,随着OpenStack在云计算领域的广泛使用,ceph也变得更加炙手可热。国内目前使用ceph搭建分布式存储系统较为成功的企业有华为,xsky,杉岩数据,中兴,华三,浪潮,中移动等。
alexhuiwang
2020/09/23
3.9K0
kubernetes(十九) Ceph存储入门
linux ceph原理及搭建
Ceph是一个可靠地、自动重均衡、自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储、块设备存储和文件系统服务。在虚拟化领域里,比较常用到的是Ceph的块设备存储,比如在OpenStack项目里,Ceph的块设备存储可以对接OpenStack的cinder后端存储、Glance的镜像存储和虚拟机的数据存储,比较直观的是Ceph集群可以提供一个raw格式的块存储来作为虚拟机实例的硬盘。
葫芦
2019/06/20
3.8K0
ceph分布式存储学习指南 实战
1、安装完虚拟机后,更改名字,设置/etc/hosts文件 2、ceph-deploy工具部署
用户5760343
2022/05/14
7660
ceph分布式存储学习指南 实战
Ceph性能调优和建议
这些集群范围内的配置参数定义在Ceph的配置文件中,因此任何一个Ceph守护进程启动时都将会遵循已定义的设置。缺省的配置文件是ceph.conf,放在/etc/ceph目录下。这个配置文件有一个global部分和若干个服务类型部分。任何时候一个Ceph服务启动,都会应用[gloabl]部分,以及进程特定部分的配置。一个Ceph配置文件有多个部分,如下图所示。
博文视点Broadview
2020/06/12
5.9K0
Ceph性能调优和建议
kvm qcow2和ceph rbd虚拟机磁盘加密
LUKS 实现了一种独立于平台的标准磁盘格式,用于各种工具。LUKS 用于加密块设备。加密设备的内容是任意的,因此可以加密任何文件系统,包括交换分区。加密卷的开头有一个未加密的标头,它允许存储多达 8 个 (LUKS1) 或 32 个 (LUKS2)加密密钥以及密码类型和密钥大小等加密参数。此标头的存在是 LUKS 和普通 dm-crypt 之间的主要区别,因为标头允许使用多个不同的密码短语,并且能够轻松更改和删除它们。但是,如果标头丢失或损坏,设备将不再可解密。LUKS (Linux Unified Key Setup)为提供了一个标准的磁盘加密格式,使得它不仅兼容性高,能通用于不同的 Linux 发行版本,还支持多用户/口令,并且由于它的加密密钥独立于口令,所以即使口令失密,我们也无需重新加密整个硬盘,只需要及时的改变口令即可重获安全。
没有故事的陈师傅
2022/09/15
1K0
kvm qcow2和ceph rbd虚拟机磁盘加密
相关推荐
Ceph快照爱你不容易系列 03:快照数据一致性浅析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档