新贵脚本:在启动时检测 shift 键按下

bam*_*ntu 7 boot shortcut-keys upstart

我想创建一个启动潜力,它允许根据启动时的特定按键(或组合)加载不同的新贵/运行级别配置。如何使用 upstart 脚本检测按键事件?

如果有帮助,我在 10.04。

实现相同结果的替代方法是可以接受的,即,我如何使用 grub 来做到这一点?

为了帮助提供更多清晰度,我正在根据 Tuminoid 和 Lumbric 给出的两个答案创建一个分步说明。(请帮助我改进这一点,我对 Tuminoid 答案的解释不起作用。)

注意:每个人都必须有这样做的理由。为了赋予以下两个分步解决方案的意义,我将描述我希望在启动时决定新贵脚本的目的。

我正在制作名为 Surfer 的用于网上冲浪的 Live DVD。为了安全起见,我想禁用管理员帐户并保留一个非特权帐户来上网。我还想让自己和用户能够重新制作 Surfer,这样他们就可以添加更多在线应用程序并自定义他们的 Surfer 帐户,然后刻录他们自己的实时自定义 Surfer iso。所以我需要两个引导配置文件:Surfer 和 Remaster。一个用于安全在线冲浪,另一个用于重新制作和开发。

Lumbric 的解决方案

创建自定义 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部分都有一些相应的括号集:

menuentry ...text left out... {
  ...text left out...

}
Run Code Online (Sandbox Code Playgroud)

封装了几行文本。复制您的默认条目部分。从单词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 也会做同样的事情。

我试过这个,它有效。谢谢伦布里克。

Tuminoid 的解决方案

首先,我们必须让 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. 在里面粘贴以下文字:

#!/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
Run Code Online (Sandbox Code Playgroud)

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 以进行重新制作和开发。

lum*_*ric 1

在启动期间捕获 Shift 键按下事件似乎是一项有趣的任务,但我不知道如何实现这一点。但我在最近的问答中描述了如何使用 GRUB 菜单以便在登录后运行不同的启动脚本。

步骤 3 中的脚本应在登录后运行,但也可以将其放置在/etc/rcXY.