笔记
0工具
0此页用于记录用户反馈问题后的每一次改进
关于
“写笔记”支持四种格式——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)。
这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。
不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。
产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。
如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。
趋势
umount 报 target is busy,lsof 揪出占用的进程
想把一块数据盘从 /mnt/data 卸载下来挪给别的机器用,umount 直接拒绝:
umount /mnt/data
umount: /mnt/data: target is busy.
这个报错的意思是有进程正在用这个挂载点里的文件,或者有进程的工作目录在这个目录里面,内核不让卸载。硬拔不行,得先找到谁占着。
最直接的排查工具是 lsof,直接列出打开这个挂载点下文件的进程:
lsof /mnt/data
输出会列进程名、PID、用户、打开的文件路径。如果什么都没输出,还有一个可能:进程的工作目录(cwd)在挂载点里,但没有打开具体文件。lsof 看不到 cwd,这时候用 fuser:
fuser -vm /mnt/data
fuser -v 会显示占用挂载点的进程,-m 是指把挂载点当整体来看。fuser 的输出里能看到进程名和 PID,还能看到它是把哪里当 cwd(标成 c)还是打开了文件(标成 r/w)。
我这次的情况很典型:fuser 列出来一个 bash 进程,PID 是我自己开的一个 tmux 会话里的 shell,工作目录正好 cd 在 /mnt/data 里面。我自己把自己挡住了。解决方式是让那个 shell 退出目录:
cd /
回到根目录再 umount,这次就成功了。凡是 tmux、screen 里开着的 shell,目录停在挂载点里的,都是这种隐形占用,lsof 查不到文件、fuser 一查一个准。
如果占用的是一个重要服务,比如 nginx 或者某个数据库在读写这个盘,那就不能简单 kill。得先看是什么进程、能不能优雅停:
fuser -vm /mnt/data # 看是谁
systemctl stop 那个服务 # 能停服务就别 kill 进程
fuser -km 是直接发 SIGKILL 把占用的进程全干掉,属于暴力手段,我一般不用,除非确定那些进程都是可丢弃的。
跟这个场景相关但症状不一样的两个问题也记一下,容易混。
一个是删文件/删目录报错。rm 一个正在被某进程当 cwd 的目录,会报:
rm: cannot remove 'data': Device or resource busy
同一个根因,用 lsof +D 或者 fuser 找占用进程处理。
另一个是覆盖正在运行的二进制文件报 Text file busy。你编译了一个新版本想覆盖正在跑的旧程序:
cp newbin /usr/local/bin/oldbin
cp: cannot create regular file '/usr/local/bin/oldbin': Text file busy
这是内核的 ETXTBSY,正在执行的程序文件不能直接覆盖。解法是先删再拷,或者停掉进程再覆盖,cp 直接覆盖是不行的。
顺带记录一下怎么定位"到底什么把磁盘空间吃掉了",跟占用进程是两个方向但经常一起查。找大目录用 du:
du -xh --max-depth=1 / | sort -h
-x 是不跨文件系统,避免把其他挂载点也算进来;sort -h 按人类可读的大小排序,最大的排尾部一眼就能看到。找大文件用 find:
find /var -xdev -type f -size +500M -exec ls -lh {} \;
-xdev 同样是限制在当前文件系统。这种定位方法配合前面的 lsof,一个找"谁在占着空间/文件",一个找"谁占着不让卸载",基本覆盖日常两类问题。
补充一个 lsof 的注意事项:对大目录不要用 lsof +D /mnt/data 这种递归列举,它会把目录树底下所有被打开的文件都翻一遍,目录大或者文件多的时候慢得离谱,看着像卡死。先用 fuser -vm 定位,或者 lsof 直接指到具体怀疑的文件路径,效率高很多。
真着急卸载、又确认那些占用进程无所谓,除了 fuser -km 强杀,还有个温和的懒人办法是延迟卸载:
umount -l /mnt/data
-l 是 lazy unmount,先把挂载点从命名空间里摘掉,等占用进程都释放了再真正卸掉。适合那种进程一时半会停不下来、但你不急着把盘拔走的场景。代价是 lazy 卸载之后,原来那些进程如果还在往里面写,数据可能来不及落盘就丢了,所以只适合确实不在乎数据、或者进程马上会退的情况,别拿它当常规操作。数据盘迁移这种正经场景,该停服务停服务,该等进程等进程,老老实实来。
如果是 NFS 挂载卸载报 busy,还得多个心眼:NFS 上有进程在跑、有缓存没刷完、甚至服务端连接还挂着,都可能 busy。先确认真的没有进程在用,再看服务端 export 状态,NFS 那套跟本地盘的 busy 不是一个根因。我这次不是 NFS,但记在这提醒自己别拿本地盘的套路硬套远程文件系统。
这次折腾完的体会:umount 报 busy 先别慌也别强来,九成是自己某个 shell 的 cwd 停在挂载点里,cd 出来就好。真不是自己的 shell,再用 fuser/lsof 定位进程,能停服务就停服务,实在不行才考虑 kill。另外在改 fstab 或者要卸载之前,先检查有没有 shell 在里面,能省很多事。这块盘后来顺利挪走了,数据校验过没丢。