bam*_*ntu 7 boot shortcut-keys upstart
我想创建一个启动潜力,它允许根据启动时的特定按键(或组合)加载不同的新贵/运行级别配置。如何使用 upstart 脚本检测按键事件?
如果有帮助,我在 10.04。
实现相同结果的替代方法是可以接受的,即,我如何使用 grub 来做到这一点?
为了帮助提供更多清晰度,我正在根据 Tuminoid 和 Lumbric 给出的两个答案创建一个分步说明。(请帮助我改进这一点,我对 Tuminoid 答案的解释不起作用。)
注意:每个人都必须有这样做的理由。为了赋予以下两个分步解决方案的意义,我将描述我希望在启动时决定新贵脚本的目的。
我正在制作名为 Surfer 的用于网上冲浪的 Live DVD。为了安全起见,我想禁用管理员帐户并保留一个非特权帐户来上网。我还想让自己和用户能够重新制作 Surfer,这样他们就可以添加更多在线应用程序并自定义他们的 Surfer 帐户,然后刻录他们自己的实时自定义 Surfer iso。所以我需要两个引导配置文件:Surfer 和 Remaster。一个用于安全在线冲浪,另一个用于重新制作和开发。
创建自定义 grub 文件
1. 要将自定义条目添加到 grub,请使用 gedit 打开此文件进行编辑:
gksudo gedit /etc/grub.d/40_custom
如果您在其中看到以下文本,您将拥有正确的文件:
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
Run Code Online (Sandbox Code Playgroud)
2. 在另一个 gedit 选项卡中,打开:
/boot/grub/grub.cfg
3. 在 grub.cfg 中,查找以以下开头的部分:
菜单项
选择用于引导的默认条目。如果您通过查看此文件不知道默认条目,请重新启动并记下您在启动时选择的条目。 如果您必须重新启动才能找到默认条目,请不要保存任何更改。 如果您对默认条目持肯定态度,请注意这是用于自定义配置文件的条目。
每个menuentry部分都有一些相应的括号集:
Run Code Online (Sandbox Code Playgroud)menuentry ...text left out... { ...text left out... }
封装了几行文本。复制您的默认条目部分。从单词menuentry复制到右括号。我需要两个条目,所以我将粘贴我的默认条目两次。
对于两个自定义引导配置文件条目,它应该类似于以下内容。(请记住,我取出了文本以使其更易于阅读):
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
menuentry ...text left out... {
...text left out...
}
menuentry ...text left out... {
...text left out...
}
Run Code Online (Sandbox Code Playgroud)
4. 按 ctrl + f 找到您的引导行。在搜索字段中输入:
linux /启动
每个引导行都应该突出显示。
5. 将此文本剪切并粘贴到突出显示的引导行的末尾,但更改每个条目的编号。
引导配置文件=1
粘贴后,菜单条目应类似于以下内容:
menuentry ...text left out... {
...text left out...
linux /boot/vmlinuz-2.6.35-22-generic root=UUID=66cdrfwec91-0070-32f-b666-c9f2232j23232j ro quiet splash boot-profile=1
}
menuentry ...text left out... {
...text left out...
linux /boot/vmlinuz-2.6.35-22-generic root=UUID=66cdrfwec91-0070-32f-b666-c9f2232j23232j ro quiet splash boot-profile=2
}
Run Code Online (Sandbox Code Playgroud)
6. 现在,我们将编辑我们在启动时看到的行。对于上面标识的菜单项,编辑单词 menuentry 和第一个括号之间的文本。替换为文本Surfer:
menuentry "Surfer" {
...text left out...
linux /boot/vmlinuz-2.6.35-22-generic root=UUID=66cdrfwec91-0070-32f-b666-c9f2232j23232j ro quiet splash boot-profile=1
}
Run Code Online (Sandbox Code Playgroud)
对 Remaster 条目执行相同操作:
menuentry "Remaster" {
...text left out...
linux /boot/vmlinuz-2.6.35-22-generic root=UUID=66cdrfwec91-0070-32f-b666-c9f2232j23232j ro quiet splash boot-profile=2
}
Run Code Online (Sandbox Code Playgroud)
7. 保存文件 40_custom。
8. 现在,使用以下命令更新 grub:
sudo update-grub
Run Code Online (Sandbox Code Playgroud)
注意:如果您对修改内核的程序进行任何升级或安装,请注意 lumbric 在其链接中提出的观点。我们如何知道我们的内核是否要升级?帮助我阐明如何防止在不知情的情况下升级内核。
9. 重新启动。在引导菜单中,查找新条目。如果你看到他们,到目前为止一切都很好。选择您的自定义条目之一,然后按 Enter。
10. 登录后,打开终端。输入此命令。
猫 /proc/cmdline
Grub 将引导行写入此文件。该引导行是你在末尾添加启动配置= 1。所以,如果你选择了 surfer,那么最后应该是 boot-profile=1 或者如果你选择 Remaster 则应该是 boot-profile=2。如果不是,请从第一步重新阅读并更正任何逻辑错误。
11. 现在,必须编写脚本来处理从 grub 菜单中选择的启动项。我选择使用新贵脚本,因为我知道如何做到这一点。新贵将尽快启动,检查 /proc/cmdline 的内容并使用它来确定我们在启动菜单中的选择。这是新贵启动脚本:
/etc/bootChoice.conf
12. 将以下文字粘贴在:
task
start on startup or bootChoice
script
profile=$(cat /proc/cmdline |sed 's/.*boot-profile=\([0-9]\).*/\1/g')
case $profile in
1)
# Run script for Surfer Profile
initctl emit surferboot
;;
2)
# Run script for Remaster Profile
initctl emit remasterboot
;;
*)
echo Error
echo "Error" > /error
;;
esac
end script
Run Code Online (Sandbox Code Playgroud)
13. 现在,将根据我们的选择发出信号。为了处理每个信号,必须创建两个文件。一个叫:surfer.conf,另一个叫remaster.conf。将它们放在 /etc/init/ 中。它们的内容将类似于:
# surfer user boot
task
start on surferboot
script
echo "surfer test-data" > /home/surfer/surfer
end script
Run Code Online (Sandbox Code Playgroud)
我们可以看到,当发出 surferboot 信号时,上面的脚本是由这一行决定的:start on surferboot
将所有自定义启动脚本代码放在script
和之间end script
。Remaster 也会做同样的事情。
我试过这个,它有效。谢谢伦布里克。
首先,我们必须让 grub 知道我们要调用脚本。我们将脚本的路径放在 /etc/default/grub 中。
1. 打开文件:/etc/default/grub。
gksudo gedit /etc/default/grub
2. 在文件末尾添加这一行:
init=/sbin/preinit
3. 保存并退出。然后,运行此命令:
更新 grub
现在我们将创建我们让 grub 知道的文件。
4. 用 gedit 创建文件:
gksudo gedit /sbin/preinit
5. 在里面粘贴以下文字:
Run Code Online (Sandbox Code Playgroud)#!/bin/sh EVENT="startup" while [ /bin/true ]; do echo "Select boot:" echo " 1) Surfer" echo " 2) Remaster" echo "" read selection case "$selection" in 1) EVENT="surfer" ;; 2) EVENT="remaster" ;; *) ;; esac done exec /sbin/init --startup-event=$EVENT
6. 使脚本可执行:
chmod +x /sbin/preinit
WIP 注意:到目前为止我已经尝试过这个,但它不起作用。请通过指出我哪里出错来帮助改进对答案的这种解释。
最后一节: 本节未完成。等待清晰的第一步完成。
上述事件是新贵的信号。如果你没有使用过新贵信号,他们会在目录中调用一个脚本:/etc/init.d。因此,我将在 /etc/init 中创建两个文件,称为:
/etc/init/surfer.conf
/etc/init/remaster.conf
Run Code Online (Sandbox Code Playgroud)
在这些文件中,我将使用 bash 脚本来配置每次启动。
如果选择了 Surfer,我将在 upstart /etc/gdm/custom.conf 中创建以强制自动登录。我还将打开 /etc/shadow 并禁用 remasters 密码。
或者,我将创建 /etc/gdm/custom.conf 以强制自动登录到用户 remaster 以进行重新制作和开发。
归档时间: |
|
查看次数: |
909 次 |
最近记录: |