cloud-init 错误ERROR 21:is a directory '/var/lib/cloud/instance'

本文介绍了解决cloud-init日志中出现的/var/lib/cloud/instance is a directory错误的方法。该问题通常由于/var/lib/cloud/instance应为软链接却生成了目录导致。文章提供了删除相关目录并重启虚拟机的临时解决方案,并建议更新cloud-init到0.7.9版本以彻底解决问题。

错误现象:

cloud-init log 中出现错误,提示  /var/lib/cloud/instance is a directory

错误原因:

/var/lib/cloud/instance 应该是一个软链接,但实际生成了目录 

规避办法:

1. 删除 rm -rf  /var/lib/cloud/*

2. 重启虚拟机

解决办法:

1.查看cloud-init 版本,如果低于0.7.9  ,安装0.7.9版本

相关资料:

/var/lib/cloud/instance这个目录作为链接 链到了最近使用的实例id的目录 ,这个路径包含了cloud-init 从数据源里获取的信息,

包括 vender 和 user-data,这些信息能更好的帮助我们检查 所传入的数据信息是正确的

该目录下 包含了一个datasource文件,这个文件存储了数据源是如何被识别并被用来设置系统的。

该目录下的 boot-finished 文件是cloud-init 做的最后一件事了,(创建并写入信息)

<think> 我们面对的是一个sudo配置文件语法错误导致sudo无法使用的问题。用户提到错误发生在/etc/sudoers.d/90-cloud-init-users文件的第5行附近,并且导致了两个主要错误提示:"no valid sudoers sources found, quitting" 和 "unable to initialize policy plugin"。 由于sudo命令本身已经无法使用,我们必须通过其他方式获得root权限来修复问题。常见的可行方法包括: 1. 使用root用户直接登录(如果系统允许root登录且你知道root密码) 2. 通过单用户模式(recovery mode)进入root shell 这里我们假设用户可以通过单用户模式(recovery mode)获得root权限。以下是修复步骤: ### 解决方法 #### 1. 进入恢复模式(Recovery Mode) - 重启系统,在GRUB菜单中选择**Advanced options for Ubuntu**,然后选择**recovery mode** - 在恢复模式菜单中,选择**root**(进入root shell) #### 2. 挂载文件系统为可读写 在恢复模式的root shell中,文件系统通常以只读方式挂载,需要重新挂载为可读写: ```bash mount -o remount,rw / ``` #### 3. 检查并编辑问题文件 使用文本编辑器(如nano)打开问题文件: ```bash nano /etc/sudoers.d/90-cloud-init-users ``` 定位到第5行附近,检查语法错误。常见的语法错误包括: - 缺少冒号`:` - 错误的空格 - 不完整的配置行 典型的正确配置行示例(假设该文件用于授予用户sudo权限): ``` username ALL=(ALL) NOPASSWD:ALL ``` 注意: - 用户名后必须有一个空格 - `(ALL)`前后必须有空格 - `NOPASSWD:`后面不能有空格,且必须以冒号结束 #### 4. 修复语法错误 根据错误提示修正第5行附近的语法。例如,常见的错误是把`NOPASSWD:`写成了`NOPASSWD`(缺少冒号),或者写成`NOPASSWD: ALL`(冒号后多了一个空格)。 修正后保存文件(在nano中:按`Ctrl+O`保存,按`Ctrl+X`退出)。 #### 5. 验证sudoers文件语法 在保存修改后,务必使用`visudo`命令检查整个sudoers配置的语法(包括/etc/sudoers和/etc/sudoers.d/下的所有文件): ```bash visudo -c ``` 如果输出`parsed OK`,则表示语法正确。例如: ``` /etc/sudoers: parsed OK /etc/sudoers.d/90-cloud-init-users: parsed OK ``` #### 6. 重启系统 ```bash reboot ``` #### 7. 测试sudo 重启后,尝试使用sudo命令验证修复是否成功: ```bash sudo ls ``` ### 注意事项 - **必须使用visudo验证**:直接编辑sudoers文件风险很高,任何语法错误都会导致sudo不可用。因此修复后必须用`visudo -c`验证。 - **文件权限**:确保/etc/sudoers.d/下的文件权限为440(`-r--r-----`): ```bash chmod 440 /etc/sudoers.d/90-cloud-init-users ``` - **云初始化文件**:90-cloud-init-users是由cloud-init生成的,通常包含创建的用户名。如果错误cloud-init本身导致的,可能需要检查cloud-init配置。 ### 常见错误原因 1. **缺少冒号**:例如将`NOPASSWD:`写成`NOPASSWD` 2. **多余空格**:例如`NOPASSWD: ALL`(冒号后多了一个空格) 3. **用户组语法错误**:例如`%admin`写成`admin`(缺少百分号) 4. **配置行不完整**:例如只写了用户名,没有指定权限 ### 预防措施 - 修改sudoers文件时,尽量使用`visudo`命令(它会自动检查语法) - 在/etc/sudoers.d/下添加新文件时,先用`visudo -c -f 新文件`检查 > 注意:如果系统无法进入恢复模式,且没有其他root访问方式,可能需要在Live CD环境下挂载磁盘分区进行修复,操作较为复杂[^1]。 §§相关问题§§ 1. 如何安全地编辑sudoers配置文件? 2. 恢复模式下如何重置root密码? 3. 如何配置Linux系统允许root用户SSH登录? 4. 什么是cloud-init及其在云服务器中的作用? 5. 如何修复系统启动时出现的其他配置文件错误? </think> ### 解决 /etc/sudoers.d/90-cloud-init-users 语法错误导致 sudo 失效的问题 #### 问题分析 错误提示 `no valid sudoers sources found` 和 `unable to initialize policy plugin` 通常由以下原因造成: 1. **语法错误**:sudoers 文件格式严格,任何语法错误(如缺少冒号、错误空格)都会导致解析失败[^1] 2. **权限问题**:sudoers 文件权限必须为 0440(`-r--r-----`) 3. **包含错误**:错误使用 `#include` 或 `#includedir` 指令 4. **冲突配置**:多个 sudoers 文件中的规则冲突 #### 解决步骤(需 root 权限) ##### 1. 进入恢复模式获取 root 权限 ```bash # 重启系统,在 GRUB 菜单中选择 "Advanced options" > "Recovery Mode" > "root" mount -o remount,rw / # 挂载根目录为可写 ``` ##### 2. 检查并修复语法错误 ```bash nano /etc/sudoers.d/90-cloud-init-users ``` - **常见错误修复**: - 缺少冒号:将 `ALL=(ALL) NOPASSWD ALL` 改为 `ALL=(ALL) NOPASSWD:ALL` - 多余空格:确保 `NOPASSWD:` 后无空格 - 无效用户名:确认用户名拼写正确(区分大小写) - **验证语法**: ```bash visudo -c -f /etc/sudoers.d/90-cloud-init-users ``` 输出应为 `/etc/sudoers.d/90-cloud-init-users: parsed OK` ##### 3. 修复文件权限(关键) ```bash chmod 440 /etc/sudoers.d/90-cloud-init-users # 设置正确权限 chown root:root /etc/sudoers.d/90-cloud-init-users # 确保属主为root ``` ##### 4. 检查主 sudoers 文件 ```bash nano /etc/sudoers ``` 确认包含: ```bash #includedir /etc/sudoers.d # 确保此行存在且未被注释 ``` ##### 5. 重启 sudo 服务 ```bash systemctl restart sudo.service # 或 reboot ``` #### 示例修复前后对比 **错误配置**: ```bash user ALL=(ALL) NOPASSWD ALL # 缺少冒号(:) ``` **正确配置**: ```bash user ALL=(ALL) NOPASSWD:ALL # 冒号位置正确[^1] ``` #### 验证修复 ```bash sudo -l # 应显示用户权限 sudo echo "Success" # 测试执行命令 ``` #### 预防措施 1. **使用 visudo 编辑**:禁止直接使用普通编辑器,始终用 `visudo -f /etc/sudoers.d/file` 编辑 2. **语法检查**:每次修改后运行 `visudo -c` 3. **权限管理**:新文件创建后立即执行: ```bash chmod 440 /etc/sudoers.d/newfile ``` > 注意:云初始化(cloud-init)生成的 sudoers 文件通常包含创建用户权限,修改后需测试新用户登录[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值