LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 768|回复: 4

有熟悉openrc的吗?遇到一个麻烦,

[复制链接]
发表于 2011-4-27 23:09:15 | 显示全部楼层 |阅读模式
情况是这样子的,最近在摆弄一台USB ADSL modem,要用net.nas0做桥接,但是第一次运行下面的开机脚
  1. /etc/init.d/net.nas0 start
复制代码
直接报错,为这个折腾了半天,调试的情况是这样的:
  1. # /etc/init.d/net.nas0 -d start
  2. * Caching service dependencies ...                                                                              [ ok ]
  3. ......
  4. ......
  5. ......
  6. ++ command -v ip6to4_pre_start
  7. + '[' '' = ip6to4_pre_start ']'
  8. + _exists
  9. + grep -Eq '^[[:space:]]*nas0:' /proc/net/dev
  10. + eerror 'ERROR: interface nas0 does not exist'
  11. *   ERROR: interface nas0 does not exist
  12. + eerror 'Ensure that you have loaded the correct kernel module for your hardware'
  13. *   Ensure that you have loaded the correct kernel module for your hardware
  14. + return 1
  15. + exit 1
  16. * ERROR: net.nas0 failed to start
复制代码
我推测是因为脚本执行的太快了,结果nas0还没有启动起来、加到/proc里时,openrc就已经执行语句就判断nas0是否存在,结果自然是还不存在,囧。这个问题可能是因为用USB ADSL modem都是些老机器没那么快……所以被无视了。

所以我就在/lib64/rc/net/ifconfig.sh的_exists()函数中加了一行:
  1. sleep 1
复制代码
这样做暂解决了问题,但是太那个了……

我不知道我没有没说清楚情况。我觉得应该可以把那个sleep加在/etc/conf.d/net里,但是我对openrc,开机脚本之类一窍不通。所以在这里请教一下。
发表于 2011-4-28 11:49:21 | 显示全部楼层
可以在这个脚本中判断 /proc 文件之前sleep 1 吗?
回复 支持 反对

使用道具 举报

发表于 2011-4-28 16:52:22 | 显示全部楼层

  1. while  ! grep -Eq '^[[:space:]]*nas0:' /proc/net/dev ; do
  2.                :
  3. done

复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-4-28 16:58:26 | 显示全部楼层
Post by linyunxian;2136831
可以在这个脚本中判断 /proc 文件之前sleep 1 吗?


我也是这么想的,我希望我可以通修改/etc/conf.d/net达到这个目的。

Post by iamkr;2136875

  1. while  ! grep -Eq '^[[:space:]]*nas0:' /proc/net/dev ; do
  2.                :
  3. done

复制代码


这样好像比我还狠……
回复 支持 反对

使用道具 举报

发表于 2011-6-8 01:04:24 | 显示全部楼层
你提到只有第一次运行才会提示没有加载模块,那么说明这个USB设备的模块在加载后到生成node之间有比较大的延时.
在第一次net.nas0 start失败后,虽然进程没有起来,但模块已经加载并生成node了,所以之后在net.nas0 start就都可以成功.
所以解决的关键是,在执行net.nas0 start之前要确保模块已经加载并有一段时间了,所以这里有两个解决办法.

第一种:在net配置里可以写preup的函数,内容是

preup()
{
if echo ${IFACE} | grep  -w 'nas0'
then

  modprobe 你的模块名

while true
do
  if grep -w ${IFACE} /proc/net/dev
  then
   break
  fi
done

fi
}

把这段直接加到net的最后就可以生效了,其实preup里就是一般的shell,你可以根据需要再做进一步调整.

第二种是操作起来比较简单,在/etc/conf.d/modules里改这句话modules="你的模块名",让模块在启动初期就加载,应该就可以了.当然,也可以在initramfs里让模块更早加载.

至于模块名,lsmod就可以了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表