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

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

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

我在 google 上搜索过。有人说添加 udev 规则,有人说放入脚本/etc/init.d,还有人甚至修改 initramfs。

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

谢谢。

答案1

在 Ubuntu 中,至少有三种“适当”的方式可以执行启动操作(假设您不只是想安装它),下面按优先顺序列出:

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

还有一种使用 udev 规则的可能性,但会比较复杂。我不建议这样做。对于这么小的事情,使用 sysvinit 脚本有点过头了,所以我将重点介绍其他两个选项。运行级别更改脚本最简单(但最不受欢迎),所以我将从那里开始。

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

losetup /dev/loop0 /srv/diskimage

这就是全部内容了。当然,请将文件名替换为最适合您的设置的任何名称。

如果您想要更具体一点,您可以为其创建一个 Upstart 作业,该作业在挂载了它的文件系统后对其进行设置。以下是一个例子,假设这是/srv包含您的文件的挂载点diskimage

description     "Setup loop devices after filesystems are mounted"

start on mounted MOUNTPOINT=/srv
task
exec losetup /dev/loop0 /srv/diskimage

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

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

答案2

正如 @psusi 指出的那样,最简单的方法是将以下行添加到文件/etc/fstab

/path/to/loop/device       /path/to/mount/point       auto       loop       0 0

现在重新启动或mount -a以 root 身份运行。然后设备应该已挂载。您可以使用 进行检查lsblk

相关内容