我想在启动时设置一个循环设备。我想知道什么是最好的方法。
我已经在Google上搜索了它。有人说添加udev规则,有人说添加脚本/etc/init.d
,甚至有人修改initramfs。
那么最好的或正确的方法是什么?您能否提供一些细节(有关操作方法)?
谢谢。
mount /disk.img /mnt -o loop,offset=2048
,第一个分区),但仍可以挂载文件中的分区。一旦设置了循环设备,就可以使用parted或fdisk找到偏移(有关此信息,请参见下面的答案)。
我想在启动时设置一个循环设备。我想知道什么是最好的方法。
我已经在Google上搜索了它。有人说添加udev规则,有人说添加脚本/etc/init.d
,甚至有人修改initramfs。
那么最好的或正确的方法是什么?您能否提供一些细节(有关操作方法)?
谢谢。
mount /disk.img /mnt -o loop,offset=2048
,第一个分区),但仍可以挂载文件中的分区。一旦设置了循环设备,就可以使用parted或fdisk找到偏移(有关此信息,请参见下面的答案)。
Answers:
在Ubuntu中至少有三种“适当的”方式来执行启动操作(假定您不只是要挂载它),这里按优先级降序列出:
/etc/init/*.conf
(暴发户)/etc/init.d/*
(sysvinit)/etc/rc.local
(运行级别更改脚本)还有使用udev规则的可能性,但它会令人费解。我建议反对。sysvinit脚本对于这么小的事情太过苛刻,因此我将重点介绍其他两个选项。运行级别更改脚本是最简单的(尽管是最不推荐的),所以我将从这里开始。
该/etc/rc.local
文件仅由/etc/init.d/rc.local
sysvinit脚本执行,该脚本(默认情况下)在切换到任何正常的“ on”运行级别时(默认情况下)最后执行(例如,当您正常启动时,而不是在关闭或进入恢复模式时才执行)。要实现设置启动设备,只需在末尾添加它/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
文件系统挂载,执行Lostup流程,并在流程成功退出时认为自己已完成(“任务”,而不是持久性服务)。只需将这些内容放入匹配的文件中即可/etc/init/*.conf
。我会/etc/init/losetup.conf
自己选择。
/etc/rc.local
与这样简单的事情相比,Upstart作业的优势虽然很小但很重要。首先,/etc/rc.local
它已被弃用,如今,几乎每个人都反对将它用作“完成任务的混乱沙箱”。皱眉使用它的其他原因中,某些确实使用该文件的程序只会覆盖内容,并且很难调和需要进入同一文件的不同脚本。其次,Upstart实际上为您处理了依赖项检查(确保首先安装了文件系统),因此,如果在安装文件系统时遇到问题,它将不会尝试设置回路设备...。但是一旦您解决并安装它,它就可以。第三,Upstart更加灵活:例如,您可以使其足够聪明以找到未使用的循环设备,并“发出”该循环设备以供其他新贵工作使用,类似于我们使用“ MOUNTPOINT”变量的方式在上面的示例中。
/etc/init.d/something
或/etc/rc.local
,但是我建议保留任何可行的方法。