Как настроить устройство петли во время загрузки?

14

Я хочу настроить устройство петли во время загрузки. Интересно, как лучше всего это сделать.

Я искал это в Google. Кто-то говорит, что добавляет правило udev, кто-то говорит /etc/init.d, что вводит скрипты , кто-то даже изменяет initramfs.

Итак, что является лучшим или правильным способом сделать это? Не могли бы вы дать некоторые подробности (о том, как это сделать)?

Спасибо.

Roun
источник
Я хотел бы пойти /etc/init.d/something, или /etc/rc.local, но я предлагаю остаться с любым методом, который работает.
энзотиб
6
Зачем? Если вы хотите, чтобы файл монтировался во время загрузки, просто добавьте его в / etc / fstab с параметром loop, и mount позаботится о настройке устройства loopback для вас.
psusi
@psusi: Спасибо за ваш совет, но для моей цели монтирования недостаточно, и фактически файл не может быть просто смонтирован. Это образ диска, а не образ раздела. И мне нужно знать точное имя устройства петли, чтобы использовать его для создания виртуального диска в VirtualBox. (Я делаю этот тип виртуального диска, думая, что легче обмениваться файлами между виртуальной машиной и хост-машиной. Встроенная общая папка не работает для некоторых приложений.)
Roun
4
Вы можете просто указать виртуальную машину на файл, а не на петлевом устройстве. Вы также должны быть очень осторожны, чтобы убедиться, что вы никогда не запустите виртуальную машину (или не приостановите ее) и не смонтируете файловую систему на хосте одновременно, иначе вы испортите fs. По этой причине гораздо лучше использовать сеть, чтобы иметь файлы гостевого доступа, которыми хост делится через nfs, samba или sshfs.
psusi
@Roun: Разделы в файле все еще могут быть смонтированы, хотя вы должны указать смещение сектора раздела от начала файла (например, mount /disk.img /mnt -o loop,offset=2048для первого раздела). Смещения могут быть найдены с помощью parted или fdisk после настройки устройства петли (см. Мой ответ ниже).
Занфур

Ответы:

7

Существует как минимум три «подходящих» способа запуска вещей в Ubuntu (при условии, что вы не просто хотите его смонтировать), перечисленных здесь в порядке убывания предпочтений:

  1. /etc/init/*.conf (Выскочка)
  2. /etc/init.d/* (Sysvinit)
  3. /etc/rc.local (скрипт изменения уровня запуска)

Существует также возможность использования правил Udev, но это будет запутанным. Я рекомендую против этого. Сценарий sysvinit излишен для такой мелочи, поэтому я сосредоточусь на двух других вариантах. Сценарий изменения уровня выполнения является самым простым (хотя и наименее предпочтительным), поэтому я начну с него.

/etc/rc.localФайл просто выполняется с помощью /etc/init.d/rc.localсценария SysVinit, который (по умолчанию) выполняется в последний раз при переходе на любой нормальный «на» уровень запуска (например , при загрузке нормально, но не тогда , когда вы выключаете или перейти в режим восстановления). Чтобы реализовать настройку загрузочного устройства, просто добавьте это в конце /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монтирования файловой системы, выполнить процесс losttup и считать себя завершенным, когда процесс завершится успешно (a " задача ", в отличие от службы, которая является постоянной). Просто поместите это содержимое в соответствующий файл /etc/init/*.conf. Я бы /etc/init/losetup.confсам выбрал .

Преимущества заданий Upstart перед /etc/rc.localтакой простой вещью невелики, но важны. Во-первых, /etc/rc.localэто устарело, и его использование в качестве «грязной песочницы для достижения цели» в наши дни вызывает недовольство почти всех. Среди других причин не одобрения его использования, некоторые программы, которые используют этот файл, просто перезаписывают содержимое, и трудно согласовать разные сценарии, которые должны входить в один и тот же файл. Во-вторых, Upstart на самом деле обрабатывает проверку зависимостей для вас (убедившись, что файловая система смонтирована первой), поэтому, если есть проблема с монтированием файловой системы, она не будетпопробуйте настроить устройство петли .... но как только вы решите и смонтируете его. В-третьих, Upstart является гораздо более гибким: вы можете, например, быть достаточно умным, чтобы найти неиспользуемое петлевое устройство, и «испустить» это петлевое устройство для использования в других заданиях upstart, подобно тому, как мы использовали переменную «MOUNTPOINT». в этом примере выше.

zanfur
источник
Как вызывается файл /etc/init/losetup.conf ??? Это не работает для меня ...
Имран
1

Как отметил @psusi, самый простой способ - добавить следующую строку в ваш /etc/fstabфайл.

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

Теперь перезагрузитесь или запустите mount -aот имени пользователя root. Затем устройство должно быть установлено. Вы можете проверить это с lsblk.

navigaid
источник