关于校验磁盘的思考

btrfs 分区支持 single 模式,将不同大小的硬盘合并为一个硬盘池,还支持快照,平衡,看着很诱人。 unraid 将不同的硬盘内容合并为一个硬盘池,添加上校验盘后,支持实时校验,对数据有保护作用。

一直在思考有没有办法将 unraid 的校验盘的方式放到 btrfs 的 single 模式上,毕竟,single 模式就差了一个文件级别的校验方式了。如果带上校验的话,完全可以不用 unraid 的这种校验模式了。

我研究了 snapraid 的方式,因为 snapraid 属于文件级别的校验。 原来的想法是在 btrfs 开始写入到磁盘之前,在内存中先使用 raid5 算法,计算好相关的内容,然后 btrfs 写入文件内容,完成后,将校验结果按照虚拟磁盘布局的方式, 写入校验盘。 但对于流类的文件,或者在持续写入的文件,因为无法知道文件的完整内容,如果文件过大,造成无法先进行计算,这种方式必然没办法了。如果不先计算结果,在写入完成后再计算,这样必须每次写入完成的时候,开始计算相关内容,然后写入校验盘,这样就是按照块设备的方式,但这不就是目前的 raid5 么,据说不稳定。因为是按照块设备处理的,当读取的时候,校验盘无法确定这是哪个文件,然后读取内容后,为了看数据是否正确,需要旋转所有的硬盘设备,如果按照 snapraid 的算法,有更多的校验盘的话,就需要旋转更多的磁盘了,读写效率将大幅降低,实用性就不大了。

btrfs 的 single 模式,在某块磁盘出问题后,可以使用降级的方式挂载,然后读取数据,不管如何,算是恢复了一部分数据。只是不带校验始终是不安全。

javascript 的 symbol

又学到了奇怪的知识。对 sequelize 的那个[Op.eq]之类的写法很好奇,比如:

{
   [Op.between]:[1,2]
}

看了下源代码,between 这个就是个 Symbol.for(“between”),这个 symbol 我从来没用过,就研究了下。

const test = Symbol.for("test");
let obj = {
    [test]: "for test"
};
console.log("obj==", obj); //{ [Symbol(test)]: 'for test' }
console.log(JSON.stringify(obj)); // {}
obj[test] = "replace test"; 
console.log(obj); //{ [Symbol(test)]: 'replace test' }
obj[Symbol("test")] = "aaabbb";
console.log(obj); //{ [Symbol(test)]: 'replace test', [Symbol(test)]: 'aaabbb' }
console.log(obj[test]); //replace tes
console.log(obj[Object(test)]); //replace tes
let symbols = Object.getOwnPropertySymbols(obj);
for(let i in symbols) {
    console.log(symbols[i],'=', obj[symbols[i]]); //Symbol(test) = replace test; Symbol(test) = aaabbb
}

乌克兰士兵从亚速钢铁厂撤离

今天刷抖音看到这条消息,从战略和历史而言,和中国当初的八佰非常相像,看了评论后,不仅为八佰的后代们感到悲哀,他们的牺牲可算是***。

之前看到一个对侵略还是解放的判断标准,我觉得非常适合:判断是侵越还是解放,只要看人民对他们是欢迎还是抵抗便知。

所以,看到现在的小朋友们同情抗日战争竟然打了八年我就觉的抗日的结果算是**

snapraid 代码浏览

最近一直在折腾硬盘上的数据。就研究了下snapraid 的代码。

snapraid非常适合做数据备份使用。我其实很好奇btrfs的single模式为啥不加个类似的功能,这样相当于直接为single模式来了个带raid5功能的备份。

snapraid的校验非常的简单暴力,直接将文件数据按块读取到内存中,然后类似模拟拼接为一个raw的文件的数据结构,然后使用raid5的算法,计算之后,将校验写入校验盘的文件中。恢复的时候,也使用的是raid5的恢复方法。

因为是基于对文件进行的操作,所以与分区格式无关系。但这样一来,对于频繁的文件读写或者移动,或者实时的写入,就不太适合了。