在虚拟机中,用touch命令创建文件的标准格式是touch 文件名,如果提示Permission denied,根源通常是当前用户对该目录没有写权限,正确做法是先确认用户身份和目录归属,再用chmod、chown或sudo对症解决。
虚拟机touch命令创建文件的基础操作
touch是Linux和Unix系统里最轻量的命令之一,主要用途是创建空文件和修改文件时间戳,在虚拟机环境里,它的用法与物理机完全一致,但因为虚拟化带来的用户隔离、挂载点差异,实际操作时更容易踩权限的坑。
touch命令的三种核心用法
- 创建单个文件:
touch /home/user/test.txt,如果文件不存在则创建空文件,存在则只更新访问时间和修改时间。 - 批量创建多个文件:
touch file1.txt file2.txt file3.txt,或者配合花括号扩展一次生成一组文件,例如touch log{1..5}.log。 - 只更新时间戳:
touch -a只改访问时间,touch -m只改修改时间,加上-d参数可以指定具体时间,比如touch -d "2026-01-01 08:00" oldfile。
touch命令在虚拟机里的适用场景
多数情况下,虚拟机里的touch用于三类任务:初始化项目目录中的占位文件(比如.gitkeep)、测试文件系统的读写权限、结合find命令批量生成临时日志,与Windows虚拟机不同,Linux虚拟机中touch的地位更接近New-Item,但因为语法极简,脚本效率更高。
有个容易忽略的细节:touch不会主动创建多级目录,你想在/data/logs/2026/下创建app.log,但父目录不存在时,系统只会报错No such file or directory,这时要么手动mkdir -p先建目录,要么直接mkdir -p /data/logs/2026 && touch /data/logs/2026/app.log。
linux虚拟机touch命令权限不足的报错特征
当权限不足时,shell会给出touch: cannot touch '文件名': Permission denied,这句话翻译过来就是:你对当前所在的目录没有写权限。

报错背后的权限判定链
Linux的权限模型只看三点:你是文件属主、你属于属组、还是其他人,运行id命令能看到你的用户ID和组ID,再运行ls -ld 目录名查看目录的属主和权限位,组合起来就能定位问题。
实际操作流程如下:
- 运行
whoami确认当前用户名。 - 运行
ls -ld /目标目录查看目录权限,比如drwxr-xr-x表示属主可写,但其他人只有读和执行权限。 - 对照输出判断:如果你不是目录属主,且不在属组内,写操作直接被拒绝。
两类高发权限故障场景
第一类,登录用户不是目录属主,云服务器默认用root登录时,/home/www目录往往归www用户所有,直接在/home/www下touch文件会被拒绝,第二类,目录位于只读挂载点,虚拟机里常见的光驱挂载(/media/cdrom)、某些初始化脚本只读挂载的/opt分区、还有Docker容器内默认只读的根文件系统,都属于这种情况。
判断是否只读挂载,运行mount | grep 目录路径,输出中如果带ro字样,说明这块硬盘是以只读模式挂载的,另外用df -hT能确认文件系统类型和使用量,比如ext4、xfs、overlay等。
touch命令创建文件提示权限不足的解决方案
核心思路很简单:要么让你自己获得写权限,要么让目录接受你,具体选哪条路,取决于环境约束和操作习惯。
chmod直接调整目录权限
如果你有sudo权限,且这个虚拟机只服务于你一个人,直接修改目录权限最省事,用法是sudo chmod u+w /目标目录,给当前用户增加写权限,更彻底一点,sudo chmod -R 755 /目标目录能批量处理子目录,但注意-R参数会递归修改所有子文件权限,多用户共用环境慎用。
权限数值对照表:
| 权限组合 | 数值 | 含义 |
|---|---|---|
rwx------ |
700 | 仅属主可读写执行 |
rwxr-xr-x |
755 | 属主全权限,其他人只读和执行 |
rw-rw-r-- |
664 | 属主和属组可读写,其他人只读 |
rwxrwx--- |
770 | 属主和属组全权限,其他人无权限 |
chown变更目录属主
多用户虚拟机中,更稳妥的方式是sudo chown 你的用户名 /目标目录,比如sudo chown zhangsan /data/app之后,zhangsan就能随便在/data/app下touch文件了,行业共识认为,多租户虚拟机环境应当优先使用属主隔离而非大范围chmod 777,后者会让所有用户都能修改文件,安全风险高。
需要注意chown也行直接修改属组:sudo chown :devgroup /data/app,这样属组内的成员都能写入,适合小型协作团队。
sudo临时提权
如果只是在特定目录紧急创建配置文件,不需要长期开放权限,直接用sudo touch /etc/nginx/conf.d/test.conf完成操作就行,但每次sudo都会有审计日志,频繁使用会让系统管理员注意到你的操作习惯,不建议日常化。
调整共享目录的挂载参数
VMware和VirtualBox的共享文件夹普遍存在权限问题,这类目录在虚拟机内部以特殊文件系统(如vmhgfs-fuse或vboxsf)呈现,默认挂载参数中用户权限映射到虚拟机的guest账户,此时用chmod往往无效,正确做法是重新挂载,以VirtualBox为例:sudo mount -t vboxsf -o uid=$(id -u),gid=$(id -g) 共享名 /mnt/host,把宿主机目录映射到当前用户的虚拟身份下。
同样的思路适用于NFS和SMB挂载目录,国内云服务器环境使用云硬盘时基本不会遇到这种问题,但自建虚拟化平台时相当一部分权限故障来自挂载参数配置错误。
特殊场景下touch命令的其他故障原因
权限不足之外,还存在几类不会提示Permission denied却仍然无法创建文件的情况,排查时如果确认了权限没问题,就要往以下方向看。
文件系统已满
df -h看到分区使用率达到100%时,任何写操作都会失败,部分文件系统会报

No space left on device,也有些系统只安静地返回错误码,这类故障和touch无关,但不能忽略。
SELinux或AppArmor拦截
CentOS默认启用的SELinux,以及Ubuntu的AppArmor,都可能拦截看似正常权限的写操作,检查方式很简单:getenforce返回Enforcing就说明SELinux在管理,临时验证是sudo setenforce 0,但重启后失效,长期关闭会降低系统安全性,不推荐生产环境这么做。
touch命令不存在或路径错误
极少数精简版虚拟机镜像可能没有安装touch(属于coreutils包),这种情况下运行会提示command not found,用which touch确认路径,缺了就用yum install -y coreutils或apt install -y coreutils补装。
Q&A:虚拟机touch命令创建文件失败常见问题
虚拟机里touch命令和物理机有区别吗?
没有本质区别,touch来自GNU coreutils,虚拟机里只要跑的是同样发行版,命令行为和物理机完全一致,虚拟机容易踩的坑主要在于权限模型、挂载配置、共享文件夹参数这几方面,和主机无关。
没有root密码还能获得写权限吗?
如果当前用户是sudo组成员,可以用sudo -i切换root身份,无需root密码,如果连sudo组都不在,唯一的出路是找管理员执行usermod -aG sudo 用户名或usermod -aG wheel 用户名,从独立开发者视角看,购买云服务器时选择“密钥登录”方式会默认给ubuntu或centos用户sudo权限,这比密码登录更灵活,价格方面,国内各大云服务商的Linux虚拟机实例无论按量付费还是包年包月,都默认预装coreutils,不存在因为镜像版本差异导致touch不可用的情况。
为什么chmod 777之后touch还是报权限不足?
典型的场景是目录处于FUSE共享挂载或NFS只读导出下,chmod只是改动了虚拟文件系统层的元数据,没有真正映射到宿主机或存储端,运行stat查看文件系统类型,确认是fuse、nfs还是cifs,然后去宿主机改共享设置,而不是在虚拟机内部反复chmod。
