faq_2026-09-26_st_1
title: “Linux创建硬链接提示权限不够怎么回事” description: “Linux 下 ln 命令建立硬链接报 Permission denied,先分清三种真因:目标目录无写权限、跨文件系统不可链、只读挂载或文件加锁,sudo 只能解决其中一种。本文按报错原文分路排查并给出验证方法。” slug: linux-hardlink-permission-denied-troubleshoot date: 2026-09-26 categories: [“常见问答”] draft: false
服务器上有个几十 GB 的数据文件,想在另一个目录给它建个硬链接当引用——不占第二份空间,删错一边也不伤数据。敲下 ln 命令,回车弹出来的却是一行 Permission denied。查资料都说加 sudo 就行,可 sudo 敲下去有人好了、有人照样报错。这个“权限不够”不是一句话能概括的问题,它至少有三层不同的成因,治法各不相同。
原因分析
先弄清硬链接的本质:它不是复制一份新文件,而是给同一份数据(inode)再登记一个名字。建立硬链接这个动作,动的是“目标目录”——在那个目录里写入一条目录项。所以系统检查的是你对放置链接的目录有没有写权限,而不是对源文件有没有权限。很多人反着去 chmod 源文件,自然无效。
在这层机制之上,“权限不够”常见三种真身。其一,目标目录无写权限:普通用户往 /var/log 这类系统目录建链接,被拒是正常防护。其二,跨文件系统不可链:inode 编号只在同一个文件系统内有意义,源文件在 / 分区、目标目录挂在 /data 分区,硬链接就建不起来,报错也换成了 Invalid cross-device link。其三,文件系统以只读方式挂载,或者文件被 chattr +i 加了不可变属性,任何写入动作都会被挡下。sudo 能解决其一,解决不了其二其三——root 也造不出跨分区的硬链接,这就是“sudo 不是万能”的边界所在。
分步解决
- 先看清报错原文。Permission denied、Invalid cross-device link、Read-only file system 是三个方向,别拿到一律当权限问题处理。
- Permission denied 时查目录不查文件。用 ls -ld 看目标目录的属主、属组与权限位,确认当前用户对它有写与执行权限;不满足就换一个自己有权的目录,或让管理员调整目录属组。
- Invalid cross-device link 时确认分区。df 把两个路径各查一遍,落在不同文件系统就放弃硬链接:要么改用软链接(ln -s,跨分区可用,代价是源删了链接就悬空),要么直接复制。
- 只读挂载与加锁文件单独处理。mount 看挂载选项里的 ro,业务允许时重新挂载为读写;lsattr 查属性,chattr -i 解锁后再操作。
- sudo 只用在系统目录场景。确属系统目录管理需要,sudo ln 一次到位;日常业务数据应从目录权限规划上解决,别养成凡事 sudo 的习惯。
- 建完验证。ls -i 看两个名字的 inode 号是否相同,stat 看链接数是否加一——从 1 变 2,才算真建成。
预防
给账号规划好数据目录的属组与写权限,建链接的动作放在自己有权的目录里做;系统目录里的文件尽量不动硬链接,后续的清理与升级工具对多出来的名字并不友好。真要在生产环境批量做,先拿测试目录把命令跑通——inode 这一层的东西,改动前多验一步,比事后翻账踏实得多。