Comment configurer un périphérique en boucle au démarrage?

14

Je souhaite configurer un périphérique en boucle au démarrage. Je me demande quelle est la meilleure façon de procéder.

Je l'ai cherché sur google. Certains disent ajouter une règle udev, certains disent mettre des scripts /etc/init.d, certains modifient même les initramfs.

Alors, quelle est la meilleure ou la bonne façon de procéder? Pourriez-vous s'il vous plaît donner quelques détails (comment faire)?

Je vous remercie.

Roun
la source
J'irais avec /etc/init.d/something, ou /etc/rc.local, mais je suggère de rester avec la méthode qui fonctionne.
enzotib
6
Pourquoi? Si vous voulez qu'un fichier soit monté au démarrage, ajoutez-le simplement à / etc / fstab avec l'option de boucle et mount se chargera de configurer le périphérique de bouclage pour vous.
psusi
@psusi: Merci pour vos conseils, mais pour mon objectif, le montage ne suffit pas, et en fait le fichier ne peut pas être simplement monté. Il s'agit d'une image disque plutôt que d'une image de partition. Et j'ai besoin de connaître le nom exact du périphérique de boucle afin de l'utiliser pour créer un disque virtuel dans VirtualBox. (Je fais ce type de disque virtuel en pensant qu'il est plus facile de partager des fichiers entre la machine virtuelle et la machine hôte. Le dossier partagé intégré ne fonctionne pas pour certaines applications.)
Roun
4
Vous pouvez simplement pointer la machine virtuelle vers le fichier plutôt que vers le périphérique de bouclage. Vous devez également être très prudent pour vous assurer de ne jamais exécuter la machine virtuelle (ou de la suspendre) et de monter le système de fichiers sur l'hôte en même temps, sinon vous corromprez le fs. Pour cette raison, c'est une bien meilleure idée d'utiliser le réseau pour avoir les fichiers d'accès invité que l'hôte partage via nfs ou samba ou sshfs.
psusi
@Roun: Les partitions dans le fichier peuvent toujours être montées, mais vous devez spécifier le décalage de secteur de la partition depuis le début du fichier (par exemple mount /disk.img /mnt -o loop,offset=2048pour la première partition). Les décalages peuvent être trouvés en utilisant parted ou fdisk une fois que le périphérique de boucle est configuré (voir ma réponse ci-dessous pour cela).
zanfur

Réponses:

7

Il existe au moins trois façons "appropriées" de faire des choses de démarrage dans Ubuntu (en supposant que vous ne voulez pas simplement le monter), répertoriées ici par ordre décroissant de préférence:

  1. /etc/init/*.conf (Parvenu)
  2. /etc/init.d/* (sysvinit)
  3. /etc/rc.local (script de changement de niveau d'exécution)

Il y a aussi la possibilité d'utiliser les règles udev, mais ce sera compliqué. Je le déconseille. Le script sysvinit est exagéré pour une si petite chose, donc je vais me concentrer sur les deux autres options. Le script de changement de niveau d'exécution est le plus simple (bien que le moins préféré), donc je vais commencer par là.

Le /etc/rc.localfichier est simplement exécuté par le /etc/init.d/rc.localscript sysvinit, qui est (par défaut) exécuté en dernier lors du passage à n'importe quel niveau d'exécution "activé" (par exemple lorsque vous démarrez normalement, mais pas lorsque vous arrêtez ou passez en mode de récupération). Pour implémenter la configuration du périphérique de démarrage, ajoutez simplement ceci à la fin de /etc/rc.local, en supposant que votre fichier est appelé /srv/diskimageet que vous souhaitez utiliser /dev/loop0comme périphérique de boucle:

losetup /dev/loop0 /srv/diskimage

C'est vraiment tout ce qu'il y a à faire. Bien sûr, remplacez les noms de fichiers par ceux qui fonctionnent le mieux dans votre configuration.

Si vous voulez être un peu plus précis à ce sujet, vous pouvez créer pour lui un travail Upstart qui le configure une fois que le système de fichiers qui le contient a été monté. Un exemple serait le suivant, en supposant que /srvc'était le point de montage contenant votre diskimagefichier:

description     "Setup loop devices after filesystems are mounted"

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

Cela devrait être assez simple pour suivre conceptuellement: la première ligne est juste un commentaire pour les lecteurs humains, et il s'agit d'instructions à Upstart d'attendre que le /srvsystème de fichiers soit monté, d'exécuter le processus losetup et de vous considérer comme terminé lorsque le processus se termine avec succès (un " ", par opposition à un service persistant). Mettez simplement ces contenus dans un fichier correspondant /etc/init/*.conf. Je choisirais /etc/init/losetup.confmoi-même.

Les avantages des travaux Upstart par rapport /etc/rc.localà une chose aussi simple sont petits mais importants. Tout d'abord, il /etc/rc.localest obsolète, et son utilisation en tant que «bac à sable en désordre pour faire avancer les choses» est mal vue par presque tout le monde de nos jours. Entre autres raisons de froncer les sourcils sur son utilisation, certains programmes qui utilisent ce fichier écraseront simplement le contenu, et il est difficile de réconcilier différents scripts qui doivent aller dans le même fichier. Deuxièmement, Upstart gère en fait la vérification des dépendances pour vous (en vous assurant que le système de fichiers est monté en premier), donc s'il y a un problème lors du montage du système de fichiers, il ne le fera pas.essayez de configurer le périphérique de boucle .... mais le sera une fois que vous l'avez résolu et monté. Troisièmement, Upstart est beaucoup plus flexible: vous pouvez, par exemple, le faire être assez intelligent pour trouver un périphérique de boucle inutilisé et «émettre» ce périphérique de boucle pour une utilisation dans d'autres travaux parvenus, comme nous avons utilisé la variable «MOUNTPOINT» dans cet exemple ci-dessus.

zanfour
la source
Comment le /etc/init/losetup.conf invoqué ??? Ça ne marche pas pour moi ...
Imran
1

Comme l'a souligné @psusi, le moyen le plus simple consiste à ajouter la ligne suivante dans votre /etc/fstabfichier

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

Maintenant, redémarrez ou exécutez en mount -atant que root. Ensuite, l'appareil doit être monté. Vous pouvez vérifier cela avec lsblk.

navigaid
la source