FreeBSD 8 执行/etc/rc时屏蔽 Ctrl-C

本文介绍如何在系统启动过程中屏蔽Ctrl-C按键,避免意外中断。通过修改init进程的源文件init.c,并调整信号处理函数,可以实现对SIGINT信号的忽略。


系统启动后,加载完内核,便会执行 /etc/rc,这时候是能够被 Ctrl - C打断的,而有些系统是不能容忍中断的。

因此需要屏蔽 Ctrl-C 按键。


找到  /usr/src/sbin/init/init.c 文件,这是 init 进程的源文件,/etc/rc 是被这个进程进行调用执行的。

在 init.c 中,会调用 run_script 函数,这个函数负责执行一些特定的脚本,信号的屏蔽需要在这里进行修改。


如:

sigemptyset(&sa.sa_mask);

sa.sa_flags=0;

sa.sa_handler=SIG_IGN;

if (strncmp(script,"/etc/rc",7) == 0)

{

    sigaction(SIGINT,&sa,(struct sigaction *)0);

    warning("%s on %s SIGINT ignore.",shell,script);

}

sigaction(SIGTSTP....);

sigaction(SIGHUP....);


重新编译,替换 init 程序即可。


<think>我们遇到的问题是:在OPNsense系统中执行`service os-hw-probe status`命令,提示`os-hw-probe does not exist in /etc/rc.d or the local startup directories (/usr/local/etc/rc.d), or is not executable`。 根据错误信息,我们可以分析出以下原因: 1. 系统中没有安装`os-hw-probe`服务。 2. 即使安装了,但服务脚本没有放在正确的目录(`/etc/rc.d`或`/usr/local/etc/rc.d`)下。 3. 服务脚本存在但没有可执行权限。 OPNsense基于FreeBSD,因此服务管理机制与FreeBSD相同。服务脚本通常位于`/usr/local/etc/rc.d`目录下(对于通过pkg安装的第三方软件)或`/etc/rc.d`(系统自带服务)。 ### 解决方案步骤: #### 1. 确认`os-hw-probe`是否安装 由于`os-hw-probe`不是OPNsense或FreeBSD的默认组件,首先需要确认是否已安装。 - 使用pkg命令检查: ```bash pkg info | grep os-hw-probe ``` 如果没有任何输出,则表示未安装。 #### 2. 安装`os-hw-probe` 如果未安装,则需安装。但注意:FreeBSD官方仓库中可能没有`os-hw-probe`,它可能是一个第三方软件。 - 尝试安装: ```bash pkg install os-hw-probe ``` 如果提示找不到,则可能需要从源代码安装。 #### 3. 检查服务脚本位置 如果已安装(或安装后),检查服务脚本是否在正确目录: - 检查`/usr/local/etc/rc.d/`: ```bash ls -l /usr/local/etc/rc.d/os-hw-probe ``` 如果存在,确保它有可执行权限: ```bash chmod +x /usr/local/etc/rc.d/os-hw-probe ``` - 如果不在`/usr/local/etc/rc.d/`,检查是否在`/etc/rc.d/`(可能性较小)。 #### 4. 如果服务脚本不存在 如果安装后仍然没有服务脚本,可能是安装包没有提供rc脚本。此需要手动创建。 - 创建服务脚本: 在`/usr/local/etc/rc.d/`下创建文件`os-hw-probe`,内容如下(根据FreeBSD rc脚本模板): ```sh #!/bin/sh # PROVIDE: os-hw-probe # REQUIRE: LOGIN # KEYWORD: shutdown . /etc/rc.subr name="os-hw-probe" rcvar="${name}_enable" command="/usr/local/bin/os-prober" # 假设实际可执行文件路径 pidfile="/var/run/${name}.pid" load_rc_config $name run_rc_command "$1" ``` 注意:上述脚本中的`command`需要替换为实际的可执行文件路径(通过`which os-hw-probe`查找)。 - 赋予可执行权限: ```bash chmod +x /usr/local/etc/rc.d/os-hw-probe ``` #### 5. 启用并启动服务 - 在`/etc/rc.conf`中添加以下行以启用服务(或者使用sysrc命令): ```bash sysrc os_hw_probe_enable="YES" ``` 注意:脚本中定义的`rcvar`是`os_hw_probe_enable`(用下划线),但rc.conf中变量名通常使用下划线。 - 启动服务: ```bash service os-hw-probe start ``` #### 6. 如果`os-hw-probe`不是服务 如果`os-hw-probe`只是一个普通命令(而不是守护进程),则无法通过`service`管理。此应直接运行: ```bash os-hw-probe ``` ### 验证安装成功 - 检查命令是否存在: ```bash which os-hw-probe ``` 如果返回路径(如`/usr/local/bin/os-hw-probe`),则说明已安装。 - 运行命令: ```bash os-hw-probe ``` ### 注意事项 - OPNsense默认使用`tcsh`,但服务脚本是`sh`脚本,所以不会受shell语法差异影响。 - 如果通过pkg安装失败,可能需要从源代码构建。可以参考官方文档(如果有)或GitHub仓库。 ### 参考引用 在解决类似问题,我们注意到服务启动脚本的目录和权限是关键[^1]。另外,创建缺失的目录有也能解决问题[^2],但本例中我们关注的是服务脚本本身。 ### 相关问题 1. 如何在FreeBSD系统中添加自定义服务? 2. OPNsense中如何管理第三方软件? 3. 如何调试FreeBSD服务的启动失败问题? </think> ### 解决 OPNsense 中 "os-hw-probe does not exist" 错误 在 OPNsense 中执行 `service os-hw-probe status` 出现错误提示,表明系统无法找到或执行 `os-hw-probe` 服务脚本。以下是系统性的解决方案: --- ### 1. **确认服务安装状态** ```bash # 检查是否安装 os-hw-probe pkg info | grep os-hw-probe ``` - 若无输出:说明未安装,跳转到步骤 2 - 若有输出(如 `os-hw-probe-1.6`):说明已安装但配置缺失,跳转到步骤 3 --- ### 2. **安装 os-hw-probe 包** OPNsense 使用 FreeBSD 包管理器: ```bash # 更新仓库索引 pkg update # 安装 os-hw-probe pkg install os-hw-probe ``` > 若提示 `Unable to find package`: - 添加第三方仓库:`pkg add https://pkg.example.com/os-hw-probe.txz`(需替换实际源) - 或手动编译:[官方 GitHub 仓库](https://github.com/linuxhw/os-probe) 获取源码 --- ### 3. **验证服务脚本位置** 正确路径应为 `/usr/local/etc/rc.d/os-hw-probe`: ```bash # 检查文件是否存在 ls -l /usr/local/etc/rc.d/os-hw-probe # 若无输出,手动创建目录结构(参考引用[2]方案) mkdir -p /usr/local/etc/rc.d/ ``` > FreeBSD 服务约定: - 系统服务:`/etc/rc.d` - 第三方服务:`/usr/local/etc/rc.d`[^1] --- ### 4. **修复权限与可执行性** ```bash # 添加可执行权限(关键步骤!) chmod +x /usr/local/etc/rc.d/os-hw-probe # 验证权限 ls -l /usr/local/etc/rc.d/os-hw-probe | awk '{print $1,$9}' ``` - 正确输出:`-rwxr-xr-x os-hw-probe` --- ### 5. **检查服务配置** 在 `/etc/rc.conf` 或 `/etc/rc.conf.local` 添加启用指令: ```bash # 启用服务 sysrc os_hw_probe_enable="YES" # 检查配置 grep os_hw_probe /etc/rc.conf ``` > 变量名需匹配脚本中的 `rcvar`(通常为 `os_hw_probe_enable`) --- ### 6. **手动启动服务** ```bash # 直接调用脚本(测试功能) /usr/local/etc/rc.d/os-hw-probe start # 检查状态 service os-hw-probe status ``` --- ### 7. **替代方案:直接执行二进制** 若无需服务管理,直接运行: ```bash # 查找二进制路径 find / -name os-hw-probe -type f 2>/dev/null # 执行探测(例如) /usr/local/bin/os-hw-probe --upload ``` --- ### 原理说明 错误根本原因: - **路径缺失**:OPNsense 的第三方服务必须位于 `/usr/local/etc/rc.d` - **权限问题**:脚本缺少可执行位(`chmod +x`) - **配置未启用**:`rc.conf` 中未设置 `_enable="YES"` 服务脚本模板示例: ```sh #!/bin/sh # PROVIDE: os_hw_probe # REQUIRE: networking . /etc/rc.subr name="os_hw_probe" rcvar="${name}_enable" command="/usr/local/bin/os-hw-probe" pidfile="/var/run/${name}.pid" load_rc_config $name run_rc_command "$1" ``` --- ### 验证成功 ```bash root@OPNsense:~ # service os-hw-probe start Starting os_hw_probe... root@OPNsense:~ # service os-hw-probe status os_hw_probe is running as pid 1024. ``` > **注意**:若为临安装,建议使用 `pkg audit -F` 检查安全风险[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值