La réponse commune à cela est de décompresser le fichier iso, de le modifier et de le recompresser. Il semble que "ISO Master", comme mentionné dans la réponse du dv3500ea, soit une bonne interface pour le faire.
Si:
- vous n'avez pas assez d'espace pour ça
- vous voulez seulement faire une modification chirurgicale au lieu de réécrire le tout
- vous souhaitez modifier un périphérique de stockage qui contient un système de fichiers isofs (alias iso9660) sans copier l'intégralité du périphérique, ou
- si vous pensez que ce truc de déballage / reconditionnement n'est tout simplement pas assez hacky
Alors cette réponse est pour toi!
En résumé, nous remplacerons un fichier existant dans le système de fichiers isofs par notre fichier souhaité. Notre fichier souhaité doit être plus petit que le fichier existant (cible), et les espaces de fin (ou les ordures) doivent être acceptables. En réalité, cela ne nécessite que deux commandes, mais attention: une faute de frappe peut détruire complètement le système de fichiers cible, ou même écraser le fichier source. Les sauvegardes sont votre ami!
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 est de 202 octets, donc notre première étape consiste à trouver un fichier de plus de 202 octets, afin que nous puissions l'écraser. Après l'avoir monté sur /mnt
, j'ai trouvé un fichier approprié sur /mnt/info.txt
.
Nous ne pouvons pas simplement écraser info.txt
sur le point de montage, il se plaindra qu'il s'agit d'un système de fichiers en lecture seule. Nous sommes root, cependant, montrons-leur ce que cela signifie! Nous devons déterminer où se info.txt
trouve 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 [...]
Sinon, cela peut aussi être fait avec grep, ce qui est beaucoup plus rapide, mais vous devez le préciser dès le début: $ sudo grep -oba 'This is ...' /dev/sdc
.
Maintenant que nous savons où il se trouve, il nous suffit de 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 les octets du fichier d'entrée (
if
) dans le fichier de sortie ( of
), et il ne se soucie pas que le fichier de sortie soit en fait un périphérique, car "tout est un fichier".
conv=notrunc
lui dit de ne pas tronquer le fichier de sortie, car nous voulons seulement écraser quelques octets, pas écraser le fichier à partir d'un certain point.
bs=1
définit la taille du bloc à 1. Vous voulez généralement une taille de bloc de 4k 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
c'est différent skip=N
car il skip
saute les octets du fichier d'entrée!). Nous le réglons, bien sûr, là où se trouve le texte cible.
count=N
copier uniquement 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 le tour est joué, le fichier est écrasé!
Mais attendez, le fichier cible était plus grand que notre script, donc sur la clé USB, le fichier est maintenant quelque chose comme: "while do if run () blah; blah (); yright 2007 X Inc.". Il y a des ordures traînantes. 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, vous pouvez donc définir count=
des N-1
octets (si votre fichier fait maintenant 203 octets et que vous remarquez que le dernier octet est une nouvelle ligne, définissez le nombre sur 202). Vous pouvez rechercher des sauts de ligne dans un fichier en utilisant xxd script.py | tail
et en vérifiant si le dernier octet est 0a
(ou, dans des cas étranges, 0d
).
Le processus est identique pour un .iso
fichier, il suffit de le remplacer mentalement /dev/sdc
par your.iso
.
Notez que lorsque vous vérifiez la cible dans votre point de montage pour voir si cela fonctionne, vous devrez peut-être strings
réutiliser (cette fois en recherchant votre script) car le fichier est probablement toujours dans le cache de lecture.