ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

RHEL 8.3装Oracle 19c RAC遇INS-06006?临时替换scp最管用

RHEL 8.3装Oracle 19c RAC遇INS-06006?临时替换scp最管用 先说结论这个“临时替换scp”的办法绝大多数情况下比找补丁更快而且逻辑上完全说得通。你遇到的肯定是RHEL 8.3或者Oracle Linux 8.3上装Oracle 19c RACGrid Infrastructure安装界面卡在SSH Connectivity点完Test以后直接弹INS-06006换了密钥、清了known_hosts、重启了sshd都没用。别急着怀疑人生问题大概率不在互信本身而在scp这个命令在新系统上偷偷换了工作方式。这篇文章是我在实际环境中趟过一遍的总结。如果你是做RAC实施、DBA转系统和系统管理员接Oracle项目的人这几个排查思路和替换脚本可以直接抄作业省得在图形界面和命令行之间反复折腾。1. 先别骂Linux 8.3搞清楚INS-06006卡在哪一步1.1 报错画面和第一反应安装Oracle 19c RAC的时候runInstaller走到“SSH Connectivity”这一步要求你填节点列表和grid用户密码点“Test”测试。正常情况会显示几个绿色的成功图标失败就直接给你一个红色大叹号错误信息类似INS-06006: Passwordless SSH connectivity is not set up between the following node(s): node1,node2我第一次遇到的时候第一反应就是SSH互信没配好。马上切到终端手动执行ssh node2 date发现明明可以免密登录也能在节点之间ping通甚至用ssh把文件拷贝过去都没问题。这就很诡异了——OS层面互信是通的OUI却说不通。网上搜一圈很多帖子让你下载这个补丁那个补丁还有让你改/etc/hosts、清~/.ssh目录、重新跑ssh-keygen的。这些我都试过全都没用。真正有用的动作藏得很深和RHEL 8.3自带的OpenSSH 8.0版本有关。1.2 OUI的SSH互信到底想干什么要说清楚这个问题得先理解OUI在配置互信时做了什么。Oracle安装程序这步不是简单检测你能不能用ssh而是要建立一个“它自己可控”的互信环境。具体来说OUI会利用你提供的grid用户密码通过SSH协议连到每个节点然后执行一系列操作在本地生成一对SSH密钥如果你没有的话把公钥追加到每个节点的authorized_keys里测试从当前节点到其他节点的免密连接通过scp在节点间传输一些安装阶段的小文件注意最后一条这很关键。OUI不只是用ssh执行命令还会调用scp传文件。如果scp行为异常即使ssh免密是通的OUI也会认为互信没有建好。1.3 用cluvfy提前打草惊蛇其实这个坑在安装之前就可以通过Oracle自带的检查工具暴露出来。如果你习惯在执行安装前跑一遍cluvfy stage -pre crsinst -n node1,node2 -fixup -r 19.0.0你就会看到其中有一项SSH检查状态是Failed。一般建议安装前把这一项跑绿我当时图省事想等OUI统一测结果就是返工。在RHEL 8.3上cluvfy的SSH检查失败给出的错误往往不是权限问题而是类似“SCP operation failed”或者“Unable to copy file to remote node”。看到这种提示基本就可以确定是scp传输环节出事而不是登录认证的问题。2. 根因OpenSSH 8.0p1的scp悄悄换了底层的SFTP2.1 RHEL 8.3默认scp行为变了RHEL 8.3自带的OpenSSH版本是8.0p1这个版本有一个很重要的变化scp命令默认不再使用传统的SCP协议而是改用SFTP协议作为传输通道。传统SCP协议是早期SSH里单独设计的一套文件复制机制走的是独立的SCP通道服务端由scp这个二进制程序处理请求。OpenSSH 8.0开始为了统一协议栈、方便维护scp命令默认先建立SFTP连接再利用SFTP子系统做文件传输。从8.0版本开始OpenSSH保留了传统SCP协议的兼容开关也就是scp命令加-O参数可以强制走老协议。但问题来了Oracle的OUI内部调用scp时不会给你加这个参数它默认认为系统的scp就是老规矩。这两边一碰撞表现就是ssh免密正常scp传文件却可能失败或者scp虽然成功但行为细节不符合OUI预期最终报INS-06006。2.2 为什么Oracle 19c的OUI会踩雷Oracle 19c RAC的安装程序在SSH互信验证里对scp的依赖比旧版本更明显。它会生成一个临时的测试文件从当前节点scp到其他节点再scp回来然后对比内容。在传统SCP协议下这个过程很干净建立独立的SCP通道传输数据关闭通道。在SFTP协议下就需要依赖远程sshd_config里配置的sftp子系统。如果系统加固或者默认配置把sftp子系统注释掉了scp的SFTP调用就会得到一个“subsystem request failed”的错误。即使子系统能正常工作OUI在某些版本的检测逻辑里也可能对SFTP传输的返回行为判断不一致从而误报失败。RHEL 8.3默认的/etc/ssh/sshd_config是包含下面这行的Subsystem sftp /usr/libexec/openssh/sftp-server但很多生产环境在拿到系统后安全基线脚本会把sftp子系统禁掉或者管理员为了让scp走传统模式手动调整过sshd配置。一旦这行配置缺失或异常OUI的scp测试就会挂。2.3 快速自测你的scp是不是走SFTP在纠结Oracle之前先自己判断一下系统scp当前是什么状态。最直接的办法就是抓日志。在其中一个节点上执行scp /tmp/testfile gridnode2:/tmp/然后在node2上看SSH日志journalctl -u sshd -f如果日志里出现subsystem request for sftp说明scp确实在走SFTP。如果没有sftp相关记录而是出现了scp进程调用说明走的是传统协议。也可以用strace看系统调用strace -f -e traceexecve scp /tmp/testfile gridnode2:/tmp/ 21 | grep execve如果看到scp进程额外fork了sftp相关进程或者执行了/usr/libexec/openssh/sftp-server那就是SFTP模式。3. 骚操作写个wrapper把scp“翻译”回传统协议3.1 替换思路为什么不直接改系统二进制既然问题是OUI调scp的时候没有带-O参数而我们又不能去改Oracle的二进制最直接的思路就是给系统做一个“假”的scp让它在真正执行的时候自动把-O参数加上。为什么不直接改/usr/bin/scp因为系统自带的scp是二进制文件改起来风险大而且会影响所有用户的所有scp行为。用wrapper脚本的好处是可以在特定用户、特定环境变量下生效安装Oracle时用装完环境一换就恢复原样不污染系统。这个操作本质上是利用了PATH环境变量的优先级。只要把wrapper脚本放在一个目录下再把那个目录放到PATH最前面那么当OUI调用scp时系统先找到的就是这个wrapper而不是/usr/bin/scp。3.2 具体实现脚本与PATH注入假设你的grid用户是grid主目录是/home/grid。以grid用户登录或者在root下用su - grid切过去执行mkdir -p /home/grid/bin创建wrapper脚本cat /home/grid/bin/scp EOF #!/bin/bash # Temporary wrapper to force scp to use legacy SCP protocol # Created for Oracle 19c RAC INS-06006 workaround exec /usr/bin/scp -O $ EOF给上执行权限chmod x /home/grid/bin/scp然后把/home/grid/bin放到PATH最前面export PATH/home/grid/bin:$PATH验证一下当前环境实际生效的scp路径which scp正常情况下会输出/home/grid/bin/scp到这一步你已经把scp替换成了wrapper。注意这个export只对当前shell会话有效。如果要从图形界面启动runInstaller一定要在同一个终端里先执行export再执行runInstaller。千万不能另开一个终端否则PATH就丢了。更稳妥的写法是把export追加到/home/grid/.bash_profile里这样grid用户每次登录都会自动生效。但装完以后记得删掉。3.3 验证步骤怎么知道wrapper生效了替换完以后先别急着跑OUI手动验证一下scp传输确保wrapper没有破坏scp的基本功能。在当前节点执行echo test /tmp/ora_test.txt scp /tmp/ora_test.txt node2:/tmp/ ssh node2 cat /tmp/ora_test.txt如果看到内容正确输出说明wrapper已经能正常工作。再用-v参数看详细输出scp -v /tmp/ora_test.txt node2:/tmp/可以看到输出里明确带有-O相关的协议启用信息。有没有这个参数scp的协商流程差别很明显SFTP模式会要求打开sftp subsystem传统协议模式则直接建立SCP通道。确认无误后再用之前那个strace或者sshd日志看一次会发现已经看不到sftp subsystem请求了。3.4 在OUI里重新Test 继续安装环境准备好以后回到Oracle安装界面。在同一个终端窗口PATH已经生效的那个执行./runInstaller等到“SSH Connectivity”这一步重新填好节点列表和grid用户密码点“Test”。这次大概率会直接通过。如果还是报INS-06006别慌回头看一下第5节八成是权限或者known_hosts的附加问题。安装继续往下走在OUI执行root脚本那一步会出现一个新的坑OUI会让你在node1和node2上分别以root身份执行orainstRoot.sh和root.sh。这些脚本执行时是root环境和grid用户的wrapper没多大关系但你需要注意在root下执行也可能调用scp的地方。如果有报错再用同样的方式给root用户也做一套wrapper。不过绝大多数环境下root脚本执行用到的scp概率极低真正卡住的就是grid用户的OUI阶段。4. 其实还有个“正统”方案把sftp子系统打开4.1 检查sshd_config里的Subsystem如果你不想用wrapper这种“歪门邪道”还有一个更简单的方案那就是让系统scp的SFTP模式能够正常工作。回到根本原因RHEL 8.3的scp默认走SFTP而SFTP依赖sshd_config里的Subsystem配置。很多环境里的线上服务器安全加固时把这行注释了或者ChrootDirectory配置错了导致SFTP子系统不可用。检查所有节点上的配置grep -i subsystem /etc/ssh/sshd_config grep -rI subsystem /etc/ssh/sshd_config.d/RHEL 8系列的OpenSSH会优先读取sshd_config.d目录下的额外配置文件如果主目录和d目录下都没有有效的sftp subsystem配置scp的SFTP模式就会失败。如果确认没有或者被注释掉了加上这一行Subsystem sftp /usr/libexec/openssh/sftp-server保存后重启sshdsystemctl restart sshd再执行之前那个scp测试看是否成功。同样是看sshd日志这时候应该能看到sftp subsystem请求被正确处理。4.2 修改后重启sshd和一些注意事项重启sshd不影响现有连接不会把正在跑的会话踢掉这个可以放心。但在生产环境还是建议挑个维护窗口毕竟改sshd配置属于核心服务变更。改完配置后别忘了在另外一个节点也做同样操作。RAC环境有多个节点任何一个节点SFTP子系统不正常OUI都可能在节点间拷贝文件时报错。还有一点如果你用的是SELinux强制模式EnforcingRHEL 8自带的sftp-server二进制是有对应SELinux策略的正常开启就能工作。如果你把Subsystem指向了自定义路径比如网上有些人建议用internal-sftpSELinux可能就会拦截。建议先保持系统默认的/usr/libexec/openssh/sftp-server路径别自作主张换。查看SELinux下sftp相关的布尔值getsebool -a | grep ssh里面的ssh_chroot_rw_homedirs、ssh_sysadm_login这些一般保持默认即可。4.3 wrapper方案 vs 正统方案怎么选我把两个方案放在一起对比一下方便你做决策。对比项wrapper替换scp开启sftp子系统生效范围仅对设置过PATH的用户全局所有用户侵入性低只影响当前安装中修改sshd核心配置风险点装完需清理PATH和脚本可能触碰安全基线要求对系统长期影响无打开了SFTP安全暴露面略增大成功率极高直接绕开协议问题高但取决于系统其他配置我个人在实际项目中优先用wrapper方案因为改动范围可控出问题容易回滚。特别是面对那种安全要求很严的客户环境你改sshd_config可能得走变更审批而用grid用户自己的PATH变量做wrapper不占用系统变更窗口。但你要理解wrapper方案回避了问题本身系统scp命令的实际行为还是被改过的。如果你后续有别的应用依赖scp走SFTP那这个wrapper可能会误伤它们。所以严格来说它适合用来验证“问题是不是出在scp协议”这一假设验证完如果确认只影响Oracle安装那正式实施可以走正统方案。5. 现场实录5个我踩过的坑5.1 目录权限不对互信测试照样失败这个坑最容易在“折腾完scp还报错”的时候出现。Oracle的SSH互信对权限要求非常严每个节点的grid用户主目录下.ssh目录权限必须是700authorized_keys权限必须是600id_rsa、id_rsa.pub权限必须是600我之前有一台机器authorized_keys是644ssh免密手动登录完全正常但OUI测试就是不通过。因为SSH服务端对authorized_keys的权限要求很死多一个组权限都直接拒绝使用这个公钥。检查命令ls -ld ~/.ssh ls -l ~/.ssh/authorized_keys ~/.ssh/id_rsa chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys ~/.ssh/id_rsa所有节点都要做不只是主节点。有时候你node1到node2通了node2回连node1就会出现权限问题。5.2 known_hosts和StrictHostKeyCheckingOUI在测试互信时会尝试以grid用户向其他节点发起SSH连接。如果节点之前从没互相连过首次连接会弹出host key确认提示。在非交互模式下这个提示会导致连接被中断OUI直接判定为失败。手动执行ssh时你看到了提示输个yes就能继续OUI可不会帮你输yes。解决办法是在grid用户的~/.ssh/config里添加Host * StrictHostKeyChecking no UserKnownHostsFile /dev/null或者提前把节点的host key加入known_hostsssh-keyscan node1 node2 node1-vip node2-vip ~/.ssh/known_hosts注意RAC环境不仅要处理节点名还要处理私有IP、公有IP、VIP对应的主机名。最省事的方法就是上面那个StrictHostKeyChecking no配置但那会降低安全性适合临时排障。正式互信配置完成后建议恢复。5.3 grid用户和oracle用户别混着配在19c RAC的标准架构里Grid基础设施用grid用户数据库软件用oracle用户两个用户要分开配置SSH互信。当时我图省事用oracle用户配好了互信然后切到grid用户去跑GI安装结果INS-06006照报。后来才发现OUI用的是grid用户而你用oracle用户的互信根本帮不上忙。正确操作是分别以这两个用户登录各自生成密钥、各自做互信。OUI测试时用的哪个用户就配哪个用户的互信。别想着配一个顶两个Oracle不会给你省这个事。grid用户互信命令示例su - grid ssh-keygen -t rsa -b 4096 -N -f ~/.ssh/id_rsa ssh-copy-id node1 ssh-copy-id node2oracle用户也来一遍。注意每个节点都要执行一次ssh-copy-id确保双向互信。5.4 root用户跑安装时的注意点RunInstaller本身一般用grid用户执行但到了执行root脚本阶段需要切到root。root环境下PATH是独立的之前给grid设置的wrapper在root下不生效。如果root脚本执行过程中有scp相关报错那就需要给root也做一个类似的wrappermkdir -p /root/bin cat /root/bin/scp EOF #!/bin/bash exec /usr/bin/scp -O $ EOF chmod x /root/bin/scp export PATH/root/bin:$PATH不过说实话19c的root.sh脚本在不同节点之间主要依靠ssh执行远程命令scp操作很少。我遇到过的root阶段报错更多是主机名解析或者grid用户环境变量没加载导致的。遇到了先看日志$ORACLE_HOME/cfgtoollogs别一上来就套wrapper。5.5 安装完别忘了恢复环境如果你用了wrapper方案Oracle安装成功以后记得把临时环境变量和脚本清理掉。清理grid用户的PATH编辑/home/grid/.bash_profile删除追加的export PATH/home/grid/bin:$PATH那一行确认当前shell里没有残留unset PATH或者重新登录删除wrapper脚本rm -rf /home/grid/bin如果给root也做了一样要清理。为什么强调恢复因为很多DBA配完了Oracle就放那儿不管结果三个月后别的业务调scp发现神秘失败排查两小时才发现是PATH被改过。这种问题最坑属于“自己挖坑自己跳”。在正式生产环境还有一个更省心的做法在安装前随手记录一下每个节点的PATH和scp原始路径安装完成后对比一下确保环境变量恢复到初始状态。最后的经验INS-06006这个报错本质上是Oracle 19c和现代Linux发行版之间的一次“协议代沟”。你真正要做的事情不是跟Oracle死磕补丁而是理解它调用scp的方式然后在系统层给它一个能理解的接口。wrapper替换scp看着粗鲁但确实管用。我个人实际操作中的体会是遇到这种环境兼容问题先花十分钟做协议自测再看报错日志定位子系统最后决定用临时手段还是永久配置。盲目搜网上的补丁贴往往浪费时间。这个思路不仅适用于Oracle RAC其他依赖scp做节点通信的软件遇到类似问题都可以参考。最后再分享一个小技巧在两节点RAC中如果你已经配好了互信但OUI就是过不去可以顺手把Oracle安装目录里的config日志翻出来看看里面一般会记录OUI实际执行的scp命令长什么样。看到了具体命令你就知道该给wrapper加什么参数了。我就在这个日志里发现过OUI实际调用的是scp -r -p这种组合当时还专门确认了一下带不带-O对结果的影响。掌握了这一点以后再遇到类似问题你就能比同行少走很多弯路。
返回列表