我想在启动时设置一个循环设备。我想知道最好的方法是什么。
我在 google 上搜索过。有人说添加 udev 规则,有人说放入脚本/etc/init.d
,还有人甚至修改 initramfs。
那么,最好的或正确的方法是什么?您能提供一些细节吗(关于如何做)?
谢谢。
答案1
在 Ubuntu 中,至少有三种“适当”的方式可以执行启动操作(假设您不只是想安装它),下面按优先顺序列出:
/etc/init/*.conf
(暴发户)/etc/init.d/*
(系统初始化)/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.local
Upstart 作业相对于如此简单的事情的优势虽小但很重要。首先,/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
。