web-dev-qa-db-fra.com

Comment éditer des images ISO (y compris des ISO amorçables)

Je cherche des outils pour Ubuntu qui puissent être utilisés pour EDIT Images ISO. Y compris les images ISO qui sont amorçables comme les ISO Ubuntu et Windows. Non seulement éditer mais enregistrer l'ISO édité et pouvez toujours démarrer lorsqu'il est gravé sur un lecteur USB ou un CD/DVD.

29
Luis Alvarado

ISO Masterinstall isomaster

J'ai déjà utilisé ISO Master pour ajouter des fichiers aux fichiers ISO auparavant. Il convient à vos besoins car il conserve le statut d'initialisation de l'ISO. Je l'ai utilisé par le passé pour ajouter un autre contenu (comme de la musique) à un disque en direct. Notez, cependant, qu'après avoir modifié un fichier ISO, vous ne pouvez que "Enregistrer sous", c.-à-d. Qu'un autre fichier ISO sera créé. Assurez-vous donc de disposer de suffisamment d'espace disque pour les deux.

isomaster

41
dv3500ea

PowerISO vient de publier un version Linux de son logiciel d'édition ISO. Comme ISO Master , il conserve le statut d'initialisation de l'ISO. Cependant, il vous permet d’enregistrer directement dans le fichier d’origine (en le supprimant d’abord); il n’est donc pas nécessaire de disposer de suffisamment d’espace disque pour les deux fichiers. Je trouve également que son interface est plus simple et intuitive à utiliser que ISO Master.

screenshot of PowerISO for Linux

0
Ploni

La réponse courante à cette question est de décompresser le fichier ISO, de le modifier et de le ranger à nouveau. Il semble que "ISO Master", comme mentionné dans la réponse de dv3500ea, soit un bon début pour faire cela.

Si:

  • tu n'as pas assez d'espace pour ça
  • vous voulez seulement faire une modification chirurgicale au lieu de tout réécrire
  • vous souhaitez modifier un périphérique de stockage contenant un système de fichiers isofs (a.k.a. iso9660) sans copier l'intégralité du périphérique, ou
  • si vous pensez que cette opération de dépaquetage/remballage est tout simplement pas assez hacky

Alors cette réponse est pour vous!

En résumé, nous allons remplacer un fichier existant dans le système de fichiers isofs par le fichier souhaité. Notre fichier souhaité doit être plus petit que le fichier existant (cible) et les espaces de fin doivent être acceptés. Cela ne nécessite en réalité que deux commandes, mais soyez prudent: une faute de frappe peut détruire complètement le système de fichiers cible, voire écraser le fichier source. Les sauvegardes sont vos amis!

Dans mon cas, je voulais stocker un script dans un démarrage en direct afin de ne pas avoir à le retaper à chaque fois. Le script est à script.py et ma cible (une clé USB) est à /dev/sdc. La taille du script étant de 202 octets, notre première étape consiste à rechercher un fichier de plus de 202 octets afin de pouvoir l'écraser. Après l'avoir monté à /mnt, j'ai trouvé un fichier approprié à /mnt/info.txt.

Nous ne pouvons pas simplement écraser info.txt sur le point de montage, il se plaindra du fait qu’il s’agit d’un système de fichiers en lecture seule. Nous sommes root, alors montrons-leur ce que cela signifie! Nous devons déterminer où se trouve info.txt sur le système de fichiers. Recherchez une chaîne qui est (probablement) unique à info.txt, par exemple This is the official distribution CD of X., et recherchez-la sur le disque:

$ Sudo strings -a -t d /dev/sdc | grep 'CD of X.'
2573588480 This is the official distribution CD of X. See INSTALL for how to [...]

Cela peut également être fait avec grep, ce qui est beaucoup plus rapide, mais vous devez le spécifier dès le début: $ Sudo grep -oba 'This is ...' /dev/sdc.

Maintenant que nous savons où il se trouve, nous devons simplement remplacer ces octets par notre fichier:

$ Sudo dd if=script.py of=/dev/sdc conv=notrunc bs=1 seek=2573588480 count=202

Cette ligne:

  • copie des octets du fichier d'entrée (ifname__) dans le fichier de sortie (ofname__), et le fait que le fichier de sortie soit en réalité un périphérique n'a pas d'importance, car "tout est un fichier".
  • conv=notrunc lui dit de ne pas tronquer le fichier de sortie, parce que nous voulons seulement écraser quelques octets, pas écraser le fichier à partir d'un certain point.
  • bs=1 définit la taille du bloc sur 1. Vous voulez généralement une taille de bloc de 4 k ou plus, mais cela évite d'avoir à faire des calculs (en ligne) et nous permet de spécifier l'emplacement exact de l'octet.
  • seek=N cherche à un certain point dans le fichier de sortie (notez que seek=N est différent de skip=N car skipignore les octets du fichier d'entrée!). Nous avons bien sûr défini l'emplacement du texte cible.
  • count=N copie seulement ce nombre d'octets. Je pense que cela peut être omis car il remarquera la fin du fichier d’entrée, mais je l’ai laissé juste pour être sûr.

Et voila, le fichier est écrasé!

Mais attendez, le fichier cible était plus volumineux que notre script, donc sur la clé USB, il ressemble maintenant à quelque chose comme: "while do if run () blah; blah (); yright 2007 X Inc.". Il y a des déchets de fuite. Deux façons de résoudre ce problème: allonger notre fichier d’entrée (ajouter des espaces) ou ajouter un symbole de commentaire à la fin. Notez que de nombreux éditeurs ajoutent une nouvelle ligne à la fin. Il est donc préférable de définir count= sur N-1 octets (si votre fichier contient maintenant 203 octets et que vous notez que le dernier octet est une nouvelle ligne, définissez le nombre sur 202). Vous pouvez rechercher les retours à la ligne dans un fichier en utilisant xxd script.py | tail et en vérifiant si le dernier octet est 0a (ou, dans certains cas étranges, 0d).

Le processus est identique pour un fichier .iso, il suffit de remplacer mentalement /dev/sdc par your.iso.

Notez que lorsque vous vérifiez la cible dans votre point de montage pour voir si elle fonctionne, vous devrez peut-être utiliser à nouveau strings(cette fois, en recherchant votre script) car le fichier est probablement toujours dans le cache de lecture.

0
Luc