“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。
md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。
要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。
在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。
要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。
工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。
写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。
适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。
你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。
全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。
这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。
不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。
产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。
如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。
为什么你的数据只有40%被压缩了?Tarball陷阱以及如何摆脱它
写在前面:一个让我纠结了很久的问题
先别急着读下去,打开你的主存储阵列,随便找个shell,对那个自从2022年就没人碰过的目录跑个du -sh。然后看看你的云账单。
我打赌你会发现自己正在为那些本可以压缩到一半空间的数据付全价。这不是什么新鲜事——行业分析师年年都在说:大约80%的企业数据是非结构化的——日志、CSV、旧项目导出文件、文档、媒体文件、备份的备份。而且,非结构化数据恰恰是现代压缩算法最擅长的类型。Zstd在典型的非结构化数据上通常能达到2:1到3:1的压缩比,这意味着50-66%的存储空间根本不需要存在。
所以问题来了:如果算法这么好,财务效益这么明显,为什么那么多冷数据还完全未压缩地躺在昂贵的主存储上?
答案不是无知。是恐惧——一种非常理性的恐惧,根植于压缩工具在你真正使用它们时的实际表现。
我们为什么不压缩:Tarball陷阱
大家都干过这事儿:tar czf archive.tar.gz project/,看着一个包含一万个文件的目录缩成一个单一的blob,然后心里涌起一阵小小的恐惧——你知道那个目录基本上已经“消失”了。
这就是传统压缩的核心可用性问题:可见性的丧失。一旦文件进了tarball或zip,它们就从文件系统的视野中消失了。find不行了,grep -r不行了,在文件管理器里随意浏览文件夹也不行了。文件技术上还存在,但它们被锁在一个不透明的容器后面。
然后就是那个“我可能要用到”的代价。某天有人需要从那个归档里取出一个5MB的配置文件。要拿到它,他们得把整个100GB的tarball拉下来解压——CPU时间、磁盘I/O,再加上一杯咖啡的时间——就为了取出一个只有容器大小千分之几的文件。面对这种取舍,大多数团队做出了理性的选择:保持不解压。存储“够便宜了”,一个能正常工作的文件系统总比一个你不敢碰的压缩黑盒强。
我们不压缩,不是因为我们不理解它的价值——而是因为传统的工具让可访问性和压缩成了互斥的选择。
这种恐惧的财务代价
选择不压缩不是一个一次性的决定,只会浪费一些磁盘空间。这是一个每天、永远、在整个基础设施栈上被放大的决定。
- 备份。 每次备份任务都要移动和存储完整的未压缩卷——100TB而不是40TB,每个周期都这样。
- 复制。 云出站费用和站点间带宽都在传输那些大多是冗余文本或空填充的字节。
- 电力和冷却。 未压缩的数据意味着更多的旋转磁盘,全天候耗电,只为了存放那些三年没人读过的数据。
这些成本没有一项会以“我们没有压缩归档”的单独一行出现在账单上。它们悄无声息地分散在每一个涉及存储的预算线里——这正是为什么它们如此容易被忽视,又如此昂贵到难以维持。
解决方案:不改变用户体验的压缩
真正的修复不是更好的zip格式。而是完全消除这种取舍:如果数据在静态时可以被压缩,但对其上的所有层来说,它看起来、用起来都像一个普通的、未压缩的文件,那会怎样?
这就是HuskHoard要解决的具体问题。它是一个开源的(AGPL v3)、基于Rust的Linux分层引擎,能自动将冷数据从昂贵的NVMe/SSD存储迁移到磁盘、云桶或物理LTO磁带——同时在你的目录树中留下一个看起来正常的文件。
这个机制值得单独提出来说,因为它不是FUSE。基于FUSE的透明文件系统确实存在,但它们会通过一个用户空间文件系统驱动来路由每一次读取,这增加了延迟,并且引入了一个你现在依赖其正确性的层。HuskHoard使用的是Linux的fanotify内核API。当一个进程打开一个已被归档的文件时,内核本身会暂停该进程,HuskHoard的守护进程会召回数据,然后进程继续——完全不知道发生了什么。ls、find和你的文件管理器都能正常工作,因为从文件系统的角度来看,文件还在那里。
技术层:Catalog和Frames到底是怎么工作的
这部分值得深入理解,如果你正在评估这种方法是否能在实际工作负载下站住脚。
Catalog解决了可见性问题
HuskHoard没有把归档文件藏在一个单一的容器里,而是将每个文件的元数据——路径、版本历史、物理介质上的字节偏移、BLAKE3哈希——记录到一个它称为Catalog的SQLite数据库中。文件系统会保留一个轻量级的stub来代替原始文件,因此目录列表、find和搜索都能像以前一样正常工作。你永远不会失去对你有什么以及它在哪里存放的视野;即使在多PB的归档中,Catalog也可以在毫秒内查询,而无需唤醒任何一个磁带驱动器。
独立的Zstd帧解决了“从100GB中取出5MB”的问题
标准的Zstd或gzip流会在整个文件上建立一个单一的连续压缩窗口——要读取第90,000,000个字节,你通常必须解压它之前的所有内容。HuskHoard通过将归档数据打包成独立的16MB Zstd帧(当通过rclone写入云存储时)来避免这个问题。每个帧都是一个自包含的压缩边界,因此解压第400帧不需要接触第1到第399帧。这也是保持云写入成本低廉的原因——分批成16MB单元可以最小化PUT请求的数量,而当提供商按请求和按字节收费时,这一点很重要。
TLV头部使得在没有工作数据库的情况下也能恢复
HuskHoard归档的每个文件前面都有一个4,096字节的对象头部。前136个字节保存了基本信息——UUID、POSIX模式、压缩大小、BLAKE3哈希。剩余的约3,960个字节使用类型-长度-值(TLV)编码打包,将POSIX扩展属性(xattrs)直接存储在有效负载旁边。这个细节比听起来更重要:如果解析器遇到一个它不认识的TLV类型,它只需读取长度并跳过它,这使得格式能容忍未来的变化。这也意味着归档是自描述的——如果Catalog数据库丢失了,HuskHoard可以通过扫描磁带或桶并读回每个对象头部,从头重建它。
帧索引使得部分读取真正快速
将Catalog的字节偏移跟踪与独立的帧边界结合起来,你就得到了真正的范围访问,而不是全文件提取。HuskHoard的StreamGate HTTP网关利用这一点,让你无需整体下载就能寻址到大型文件——想在Plex或mpv中浏览存储在S3或物理LTO磁带上的4K视频?StreamGate解析你请求的字节范围,只获取相关的帧(对云存储是HTTP Range请求,对LTO是SCSI磁带寻址),然后只解压那一部分。
磁带在此基础上还有自己针对物理特性的处理——写入以256KB的SCSI对齐块和文件标记进行,专门为了避免驱动器“擦鞋”(shoeshining),而Catalog以与索引云帧相同的方式索引这些块。
你可以通过实际操作看到它的样子——安装后,将守护进程指向一个测试卷,把一个文件放入热层,等待几秒钟,就能看到它发生:
# 将一个文件放入被监视的热层
dd if=/dev/urandom of=/hot-tier/testfile.bin bs=1M count=100
# 几秒后,检查冷层
ls -la /cold-tier/testfile.bin
# 文件还在,但它的实际数据已经迁移了
一些关键设计决策的思考
为什么是16MB的帧大小?
这不是随便选的。16MB是一个平衡点:太小会导致过多的元数据和请求开销(尤其是在云存储上),太大会让部分读取变得低效。在实际测试中,16MB帧在大多数工作负载下提供了最佳的成本/性能平衡。对于云存储,它还能很好地匹配S3和GCS的请求大小优化。
为什么用SQLite做Catalog?
SQLite被广泛部署,经过实战检验,而且不需要单独的服务器进程。对于归档元数据这种工作负载——主要是写入一次,读取多次——它表现得非常好。每个Catalog数据库可以处理数百万个条目,而且查询速度极快,因为所有数据都在本地。如果Catalog损坏或丢失,如前所述,可以从归档本身重建。
为什么是BLAKE3而不是SHA-256?
BLAKE3比SHA-256快得多,尤其是在多核系统上。它还能生成更短的哈希(256位 vs 256位,但BLAKE3的设计允许更高效的并行计算)。对于需要频繁哈希验证的归档系统来说,性能差异是显著的。
实际部署中的注意事项
如果你决定尝试HuskHoard,有几个点值得注意:
初始迁移需要时间。 首次将大量数据归档到冷层时,会有一个初始的“填充”阶段。对于PB级的数据,这可能需要几天。规划好窗口。
fanotify的限制。 fanotify是内核API,不是用户空间文件系统。这意味着它不依赖FUSE,但它在某些配置下可能有限制(例如,某些网络文件系统不支持)。确保你的工作负载兼容。
磁带需要物理处理。 如果你使用LTO磁带,记住磁带是顺序访问介质。虽然HuskHoard通过索引和帧设计减轻了这一点,但随机访问磁带上的数据仍然比磁盘慢得多。它更适合归档而不是频繁检索。
监控Catalog的健康。 虽然HuskHoard可以从归档重建Catalog,但定期备份Catalog数据库是一个好习惯。SQLite数据库很容易备份,而且很小。
总结:我们终于可以两全其美了
回到最初的问题:为什么只有40%的数据被压缩?因为传统工具让压缩和可访问性成了互斥的选择。HuskHoard通过将压缩层从文件系统层分离,从根本上解决了这个问题。文件看起来还在,数据被压缩存储,而且你可以随时只取你需要的那一小部分,而不必解压整个归档。
这不是一个完美的解决方案——没有银弹——但它是一个务实、经过深思熟虑的设计,解决了实际世界中存储管理员每天面对的问题。如果你正在为冷数据存储成本头疼,或者只是厌倦了看着那些巨大的未压缩归档目录,值得一试。
毕竟,存储可能“足够便宜”,但没必要为不需要的东西付钱。