如何在启动时设置循环设备?

Rou*_*oun 15 boot

我想在启动时设置一个循环设备。我想知道什么是最好的方法来做到这一点。

我已经在谷歌上搜索过了。有人说添加 udev 规则,有人说将脚本放入/etc/init.d,有人甚至修改 initramfs。

那么最好或正确的方法是什么?你能不能提供一些细节(关于如何做)?

谢谢你。

小智 8

在 Ubuntu 中至少有三种“合适”的方法可以启动(假设你不只是想挂载它),这里按优先级降序列出:

  1. /etc/init/*.conf (暴发户)
  2. /etc/init.d/* (sysvinit)
  3. /etc/rc.local (运行级别更改脚本)

也有可能使用 udev 规则,但会很复杂。我建议反对。sysvinit 脚本对于这么小的事情来说太过分了,所以我将专注于其他两个选项。运行级别更改脚本最简单(尽管最不受欢迎),所以我将从那里开始。

/etc/rc.local文件仅由/etc/init.d/rc.localsysvinit 脚本执行,该脚本(默认情况下)在切换到任何正常的“开启”运行级别时(例如,当您正常启动时,而不是在您关闭或进入恢复模式时)最后执行。要实现设置引导设备,只需在 末尾添加它/etc/rc.local,假设您的文件被调用/srv/diskimage并且您希望/dev/loop0用作循环设备:

losetup /dev/loop0 /srv/diskimage
Run Code Online (Sandbox Code Playgroud)

这就是它的全部内容。当然,用最适合您的设置的文件名替换文件名。

如果你想更具体一点,你可以为它创建一个 Upstart 作业,一旦挂载它的文件系统被挂载,它就会设置它。一个示例如下,假设这/srv是包含您的diskimage文件的挂载点:

description     "Setup loop devices after filesystems are mounted"

start on mounted MOUNTPOINT=/srv
task
exec losetup /dev/loop0 /srv/diskimage
Run Code Online (Sandbox Code Playgroud)

这在概念上应该很简单:第一行只是对人类读者的注释,它指示 Upstart 等待/srv文件系统挂载,执行 Lostup 进程,并在进程成功退出时认为自己已完成(一个“任务”,而不是持久的服务)。只需将这些内容放在匹配/etc/init/*.conf. 我会选择/etc/init/losetup.conf,我自己。

/etc/rc.local对于这样一个简单的事情,Upstart 工作的优势很小但很重要。首先,/etc/rc.local已被弃用,如今几乎每个人都不赞成将其用作“完成工作的凌乱沙箱”。除了不赞成使用它的其他原因之外,一些使用该文件的程序只会覆盖内容,并且很难协调需要进入同一文件的不同脚本。其次,Upstart 实际上会为您处理依赖项检查(确保首先挂载文件系统),因此如果挂载文件系统出现问题,它不会尝试设置循环设备......但是一旦你解决并安装它。第三,Upstart 更加灵活:例如,你可以让它足够聪明,找到一个未使用的循环设备,并“发出”该循环设备以用于其他新贵工作,类似于我们如何使用“MOUNTPOINT”变量在上面的这个例子中。