正文开始------
NFS因共享存储、灵活扩展的优势,是运维人员部署KES数据库的常用存储方案,但实操中易因NFS权限机制特殊、Shell环境配置疏漏,出现Operation not permitted报错,且反复赋权难以解决。下面我将结合实操经验,介绍该报错的根源与解决办法,补充KES安装前环境检查、NFS及分布式存储部署、Shell脚本调试等实操要点。
一、问题场景与报错重现
最近几次在 NFS 共享存储环境部署 KES 时,都遇到了同一个问题:执行安装脚本 setup.sh 时,频繁弹出 Operation not permitted 报错,一开始以为是文件权限不够,反复执行 chmod 777 赋权,甚至给整个目录赋权,还是报错,同时还会跟着出现 Read-only file system 的提示,下面是当时操作的真实日志,大家可以参考一下:
bash
-bash-4.4$ sh setup.sh
-bash: /usr/bin/sh: Operation not permitted
-bash-4.4$ chmod -R 777 setup.sh
chmod: changing permissions of 'setup.sh': Read-only file system
-bash-4.4$ ./setup.sh
Now launch installer...
tee: .installer.log: Read-only file system
一开始看这个报错,很容易误以为是权限不足或者 NFS 目录被设为只读了,但实际排查后发现,根本原因不是脚本本身的权限问题,而是 Shell 环境变量没有加载,导致 sh 解释器调用受限,NFS 目录的权限识别也出现了异常。
结合平时遇到的情况,这种报错大多出现在这几种场景下:一是新部署的 NFS 客户端,没重启 Shell 环境就直接执行安装脚本;二是手动修改了 .bashrc 文件后,没重新加载配置;三是批量部署时,通过脚本登录用户,没触发环境变量自动加载;四是 NFS 挂载时,参数配置不当,加上 Shell 环境异常,两者叠加就会触发报错。
二、根因定位与一键解决
1. 核心原因
Linux 系统中,.bashrc 是用户级 Shell 环境配置文件,定义着环境变量、核心命令路径等关键配置,是命令正常调用的基础。实际操作中,SSH 登录、切换用户或重启终端后,若 .bashrc 未自动加载,会导致核心命令路径识别失败、NFS 目录被默认识别为只读、KES 所需环境变量失效,进而触发相关报错。
2. 解决方案
找到根源后,解决起来就很简单了,不需要复杂的操作,进入 KES 安装用户的家目录,执行一条环境重载命令,就能一键修复,具体操作步骤如下(结合实际部署场景,我以安装用户家目录为 /home/test 为例):
bash
# 进入安装用户家目录(大家根据自己的实际部署用户调整路径)
cd /home/test
# 重新加载Shell环境变量,这是核心修复命令
source .bashrc
# 验证一下环境是否生效,看看核心命令路径是否正常
echo $PATH # 正常情况下,输出里会包含/usr/bin、/bin这些核心路径
sh --version # 能正常输出sh解释器版本就可以,推荐4.0及以上版本
# 再验证一下NFS目录权限,确保能正常读写
touch /home/test/test_file && rm /home/test/test_file
# 最后重新执行安装脚本
./setup.sh
亲测过很多次,执行完上面这些命令,再重新运行 ./setup.sh,就能正常启动 KES 安装程序,之前的报错会彻底解决。
这里再补充几个实操中遇到的小细节,给大家提个醒:
- 有些 Linux 系统默认优先加载
.bash_profile文件,如果执行source .bashrc后还是报错,可以再执行一遍source ~/.bash_profile,同步重载一下这个文件; - 偶尔会遇到用户家目录下没有
.bashrc文件的情况,这时候不用慌,直接复制系统默认模板就能生成,命令是cp /etc/skel/.bashrc ~/ && source ~/.bashrc; - 如果是批量部署 KES,为了避免手动执行环境重载命令,减少操作失误,可以把
source ~/.bashrc写在安装脚本的头部,这样执行脚本时会自动加载环境。
三、延伸 1:KingbaseES 安装前环境检查清单
KES 对运行环境的兼容性、权限配置要求比较高,尤其是在 NFS 共享存储环境下,只要安装前把环境检查到位,就能避免很多不必要的麻烦。
1. Shell 环境与变量检查
Shell 环境是 KES 安装的基础,环境出问题,后面的安装肯定无法正常进行,所以这一步一定要仔细检查,具体步骤如下:
bash
# 1. 先强制加载所有用户级的环境配置文件,避免有遗漏
source ~/.bashrc
source ~/.bash_profile
# 2. 校验当前登录的用户身份,KES安装不建议用root用户,推荐用专用用户(比如kingbase)
whoami # 输出应该是部署用的专用用户,比如kingbase
id # 查看一下用户的UID、GID和所属组,确保没有权限异常
# 3. 验证核心命令路径,这些路径必须存在,否则无法执行安装操作
echo $PATH | grep -E "/usr/bin|/bin|/usr/sbin"
which sh bash # 确认sh、bash解释器能被正确识别
# 4. 检查KES需要的环境变量,如果提前配置过,确认路径正确;没配置的话,安装后再补充也可以
echo $KINGBASE_HOME # 提前配置的话,输出应该是类似/home/test/KingbaseES的路径
echo $LD_LIBRARY_PATH # 这个路径里需要包含KES的依赖库路径,比如$KINGBASE_HOME/lib
2. 脚本与执行权限检查
KES 的安装脚本(比如 setup.sh),权限配置是否正确,直接影响能不能正常执行,这一步也不能马虎,重点检查这几点:
bash
# 先给安装脚本赋予执行权限,这是最核心的一步,避免因为权限不足导致执行失败
chmod +x setup.sh
# 查看一下权限详情,确保当前用户有读、写、执行权限
ls -l setup.sh # 正常的输出格式应该是:-rwxr-xr-x 1 kingbase kingbase xxxx Apr 13 10:00 setup.sh
# 可以先测试一下脚本能不能正常启动,不用执行完整安装,只验证启动逻辑就好
sh setup.sh -h # 能正常输出脚本的帮助信息,就说明脚本没有语法错误
# 再验证一下sh解释器的版本,KES支持4.0及以上版本,版本太低也可能出现兼容问题
sh --version
bash --version
3. NFS 挂载参数检查(关键,报错核心诱因)
前面遇到的 Operation not permitted 报错,很多时候都和 NFS 挂载参数配置错误有关,这一步是重点检查项,一定要仔细核对,具体命令如下:
bash
# 先查看当前NFS的挂载信息,确认挂载路径和参数是否正确
mount | grep nfs
# 核心检查:绝对不能出现noexec(不可执行)、ro(只读)这两个参数
mount | grep nfs | grep -E "noexec|ro" # 如果没有任何输出,就说明参数正常
# 给大家推荐一个实操中好用的挂载参数,写入/etc/fstab文件,能实现开机自动挂载
# 格式:NFS服务端IP:共享目录 本地挂载目录 nfs 推荐参数 0 0
192.168.xx.xx:/nfs_share /home/test nfs defaults,rw,exec,suid,no_root_squash 0 0
# 如果发现参数异常,先卸载当前的NFS挂载,再重新挂载
umount /home/test # 先卸载异常的挂载
# 重新挂载,用上面推荐的参数,这样能避免很多权限问题
mount -t nfs 192.168.xx.xx:/nfs_share /home/test -o defaults,rw,exec,suid,no_root_squash
这里再给大家解释一下这些参数的作用,都是实操中总结出来的,没有多余的配置,大家可以直接参考:
rw:允许客户端读写 NFS 目录,KES 安装过程中需要写入文件,这个参数是必选的;exec:允许在 NFS 目录下执行可执行文件,安装脚本需要执行,这个参数也必须有;suid:允许执行带有 SUID 权限的文件,KES 部分核心程序需要这个权限,也是必选的;no_root_squash:禁止把 root 用户映射成匿名用户,避免用 root 用户操作 NFS 目录时出现权限不足的情况,可选但推荐配置;defaults:包含了 rw、suid、dev、exec 等默认参数,不用单独配置,简化操作。
4. NFS 目录读写验证
KES 安装过程中,需要解压安装文件、生成安装日志,所以 NFS 目录必须能正常读写,这一步一定要提前验证,避免安装到一半报错,具体命令如下:
bash
# 先测试一下目录的可写和可删除权限,创建一个临时文件再删除
touch /home/test/test_file && rm /home/test/test_file
# 再测试一下子目录的创建和删除权限,KES安装时会自动生成子目录
mkdir /home/test/kes_temp && rmdir /home/test/kes_temp
# 查看一下NFS目录的磁盘空间,KES安装最低需要20GB,推荐预留30GB以上,避免空间不足
df -h /home/test
# 最后查看一下目录权限,确保当前用户有读、写、执行权限
ls -ld /home/test # 正常输出格式:drwxr-xr-x 2 kingbase kingbase 4096 Apr 13 10:30 /home/test
四、延伸 2:KES 在 NFS / 分布式存储部署策略
在企业级部署场景中,很多时候会用 NFS 或者分布式存储部署 KES 集群,实现数据共享和高可用。结合平时的部署经验,总结了一些实用的部署策略,都是经过实际验证的,能保证 KES 运行的稳定性和兼容性,大家可以参考。
1. NFS 部署核心规范(服务端+客户端)
- 服务端配置(
/etc/exports文件):这是 NFS 服务端的核心配置文件,配置不当会导致客户端挂载异常,下面是我平时常用的配置,实操中没有出现过问题:
bash
# 编辑配置文件
vi /etc/exports
# 新增配置,生产环境建议把*替换成具体的IP段,比如192.168.1.0/24,更安全
/nfs_share *(rw,sync,no_root_squash,no_subtree_check)
# 配置生效
exportfs -r
# 查看一下配置是否生效
exportfs -v这里再简单说一下这些配置的作用:rw 是允许客户端读写,sync 是数据同步写入磁盘,避免意外断电导致数据丢失,no_root_squash 是保留 root 用户权限,no_subtree_check 是关闭子目录检查,能提升 NFS 的性能。
-
客户端配置:客户端的配置也很关键,尤其是集群部署时,需要注意这几点:
- 所有节点的 NFS 挂载路径必须统一,比如都挂载到 /home/test/kes_data,不然集群节点之间访问数据会出现异常;
- 各节点的 KES 安装用户,UID 和 GID 必须保持一致,不然会出现权限不匹配的问题。可以用
id kingbase查看用户的 UID 和 GID,如果不一致,用usermod -u 1001 kingbase调整(1001 可以替换成实际需要的 UID); - SELinux 经常会拦截 NFS 目录的操作,哪怕权限配置正确,也可能出现报错,所以建议关闭 SELinux 或者设为宽容模式,具体命令如下:
bash
# 临时关闭,重启服务器后会失效
setenforce 0
# 永久关闭,修改配置文件,重启后生效
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 查看一下SELinux状态,确保是Permissive或Disabled状态
getenforce
2. 共享存储兼容性要求
- NFS 客户端和服务端的内核版本,差异最好不要超过 2 个主版本,不然容易出现 NFS 协议不兼容的问题,导致挂载失败或者数据传输异常。查看内核版本的命令很简单,
uname -r就能查看; - 生产环境部署 KES 时,建议优先使用 SSD 存储,搭配万兆网卡,这样能避免 IO 瓶颈,提升 KES 的运行性能。如果用机械硬盘,数据读写速度会很慢,影响数据库的正常使用。查看网卡速率的命令是
ethtool eth0(eth0 是网卡名称,根据实际情况调整); - 为了避免 IO 竞争,建议把 KES 的数据目录、WAL 日志目录、临时目录,分别挂载到不同的 NFS 共享目录,这样能提升数据库的稳定性,具体的挂载配置如下(可以直接写入 /etc/fstab 实现开机自动挂载):
bash
# 数据目录挂载
192.168.xx.xx:/nfs_kes_data /home/test/kes_data nfs defaults,rw,exec,suid,no_root_squash 0 0
# WAL日志目录挂载
192.168.xx.xx:/nfs_kes_wal /home/test/kes_wal nfs defaults,rw,exec,suid,no_root_squash 0 0
# 临时目录挂载
192.168.xx.xx:/nfs_kes_temp /home/test/kes_temp nfs defaults,rw,exec,suid,no_root_squash 0 0
3. KES 集群部署注意事项
- 如果是 RAC 集群部署,有一点需要特别注意:NFS 共享目录只能用于存储 KES 的数据文件,投票盘、OCR 文件建议存储在独立的共享存储(比如 SAN 存储),这样能避免 NFS 网络异常导致集群分裂。另外,投票盘建议配置 3 个,分别存储在不同的存储设备上,提升集群的可靠性;
- 集群所有节点的系统时间,必须保持一致,时间误差不能超过 1 秒,不然会导致集群节点通信异常、事务同步失败。建议给所有节点部署 NTP 服务,同步到同一个时间服务器,具体命令如下(以 CentOS 系统为例,其他系统可以适当适配):
bash
# 安装NTP服务
yum install -y ntp
# 启动NTP服务,并设置开机自启
systemctl start ntpd && systemctl enable ntpd
# 查看一下时间同步状态,有同步源就说明正常
ntpq -p
# 检查一下各节点之间的时间差,确保误差不超过1秒
date; ssh 192.168.xx.xx date
五、延伸 3:KES 运维 Shell 脚本调试艺术
运维 KES 时,Shell 脚本可提升管理和故障排查效率,以下是针对 NFS+KES 场景的核心调试技巧及实用方案。
1. 环境类故障快速排查
针对 Operation not permitted、脚本执行失败等故障,核心排查步骤如下:
bash
# 1. 重载环境变量(核心步骤)
source ~/.bashrc && source ~/.bash_profile
# 2. 验证核心命令和环境变量
echo $PATH | grep /usr/bin && echo $KINGBASE_HOME
# 3. 脚本调试,定位报错行
sh -x setup.sh
# 4. 查看安装日志,获取报错详情
tail -f .installer.log
# 5. NFS挂载排查
mount | grep nfs && dmesg | grep nfs && df -h /home/test
2. 环境隔离方案
为避免服务环境冲突,建议为 KES 部署独立环境,核心操作如下:
bash
# 创建KES专用用户并赋权
useradd kingbase && passwd kingbase
chown -R kingbase:kingbase /home/test && chmod -R 755 /home/test
编写环境初始化脚本(init_env.sh),一键加载环境:
bash
#!/bin/bash
source ~/.bashrc && source ~/.bash_profile
export KINGBASE_HOME=/home/test/KingbaseES
export PATH=$KINGBASE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$KINGBASE_HOME/lib:$LD_LIBRARY_PATH
echo "KES环境初始化完成!"
使用方法:chmod +x init_env.sh,操作前执行 source init_env.sh。
3. 日志定位技巧
故障排查核心日志及定位方法:
- 安装报错:查看
.installer.log,搜索"Permission""ERROR"关键词; - NFS 异常:查看
/var/log/messages,用grep "nfs" /var/log/messages过滤; - KES 运行异常:查看
$KINGBASE_HOME/data/sys_log; - 权限报错:查看
/var/log/secure。
平时运维 KES 时,Shell 脚本是个很实用的工具,不管是日常管理,还是故障排查,都能帮我们节省很多时间。结合平时调试脚本的经验,总结了一些针对 NFS+KES 场景的调试技巧,还有一些实用的脚本,都是实操中能用得上的,分享给大家。
六、总结
结合平时部署和运维 KES 的实际经验,总结一下核心要点,希望能帮大家规避常见问题,提高工作效率:
- NFS 环境下安装 KES,遇到
Operation not permitted报错,90% 都不是文件权限的问题,核心原因是 Shell 环境变量没有加载,执行source .bashrc就能快速修复;如果同时伴随Read-only file system提示,记得同步检查 NFS 挂载参数,避免参数配置错误; - KES 安装前,一定要严格执行环境检查清单,重点校验 Shell 环境、NFS 挂载参数、脚本权限,很多安装失败的问题,都是因为环境检查不到位导致的,提前检查能节省很多排查时间;
- 用 NFS 或分布式存储部署 KES 时,要遵循"权限统一、参数规范、环境隔离"的原则,尤其是集群部署,要注意时间同步、存储分离,这样才能保证 KES 稳定运行;
- 平时运维 KES 时,多运用 Shell 脚本调试和日志定位技巧,能大幅提升故障排查效率,建议把常用的操作编写成脚本,实现运维自动化,减少手动操作失误。