|
发表于 2006-1-18 23:06:39
|
显示全部楼层
2.6.11以后的内核不需要这个延时补丁了
我用google怎么也搜不到2.6的能用的内核补丁,后来实在无奈,仔细研读了源代码里面的/init/do_mounts.c部分,发现源代码里本来就提供了一个rootdelay参数,可以设定加载根文件系统之前的延时时间,以秒为单位,一般在启动引导程序syslinux,grub,lilo中直接加一个rootdelay=5,肯定就可以了。
后来我在kernel.org上查了一下,好像是在2.6.11-rc2中加入的。
-------------------------------------------------------------------
From: Daniel Drake <dsd@gentoo.org>
Adds a boot parameter which can be used to specify a delay (in seconds)
before the root device is decoded/discovered/mounted.
Example usage for 10 second delay:
rootdelay=10
Useful for usb-storage devices which no longer make their partitions
immediately available, and for other storage devices which require some
"spin-up" time.
Signed-off-by: Daniel Drake <dsd@gentoo.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---
25-akpm/Documentation/kernel-parameters.txt | 3 +++
25-akpm/init/do_mounts.c | 15 +++++++++++++++
2 files changed, 18 insertions(+)
diff -puN Documentation/kernel-parameters.txt~configurable-delay-before-mounting-root-device Documentation/kernel-parameters.txt
--- 25/Documentation/kernel-parameters.txt~configurable-delay-before-mounting-root-device 2005-01-22 23:33:13.038162280 -0800
+++ 25-akpm/Documentation/kernel-parameters.txt 2005-01-22 23:33:13.043161520 -0800
@@ -1117,6 +1117,9 @@ running once the system is up.
root= [KNL] Root filesystem
+ rootdelay= [KNL] Delay (in seconds) to pause before attempting to
+ mount the root filesystem
+
rootflags= [KNL] Set root filesystem mount option string
rootfstype= [KNL] Set root filesystem type
diff -puN init/do_mounts.c~configurable-delay-before-mounting-root-device init/do_mounts.c
--- 25/init/do_mounts.c~configurable-delay-before-mounting-root-device 2005-01-22 23:33:13.039162128 -0800
+++ 25-akpm/init/do_mounts.c 2005-01-22 23:33:13.044161368 -0800
@@ -6,6 +6,7 @@
#include <linux/suspend.h>
#include <linux/root_dev.h>
#include <linux/security.h>
+#include <linux/delay.h>
#include <linux/nfs_fs.h>
#include <linux/nfs_fs_sb.h>
@@ -228,8 +229,16 @@ static int __init fs_names_setup(char *s
return 1;
}
+static unsigned int __initdata root_delay;
+static int __init root_delay_setup(char *str)
+{
+ root_delay = simple_strtoul(str, NULL, 0);
+ return 1;
+}
+
__setup("rootflags=", root_data_setup);
__setup("rootfstype=", fs_names_setup);
+__setup("rootdelay=", root_delay_setup);
static void __init get_fs_names(char *page)
{
@@ -387,6 +396,12 @@ void __init prepare_namespace(void)
mount_devfs();
+ if (root_delay) {
+ printk(KERN_INFO "Waiting %dsec before mounting root device...\n",
+ root_delay);
+ ssleep(root_delay);
+ }
+
md_run_setup();
if (saved_root_name[0]) {
_ |
|