Загальна відповідь на це - розпакувати ізо-файл, змінити його та знову запакувати. Схоже, "ISO Master", як згадується у відповіді dv3500ea, є гарним передовим процесом для цього.
Якщо:
- у вас не вистачає місця для цього
- ви хочете зробити хірургічну модифікацію, а не переписувати всю справу
- ви хочете змінити запам'ятовуючий пристрій, що містить файлову систему isofs (aka iso9660), не копіюючи весь пристрій, або
- якщо ви думаєте, що ця різання / перепаковка річ просто не надто хитра
Тоді ця відповідь саме для вас!
Підводячи підсумок, ми замінимо існуючий файл у файловій системі isofs на потрібний файл. Наш бажаний файл повинен бути меншим, ніж існуючий (цільовий) файл, і пробіли пробілів (або сміття) повинні бути прийнятними. Для цього потрібні лише дві команди, але будьте обережні: помилка друку може повністю знищити цільову файлову систему або навіть перезаписати вихідний файл. Резервні копії - ваш друг!
У моєму випадку я хотів зберігати скрипт у прямому завантаженні, тому мені не доведеться повторно вводити його. Сценарій є, script.py
а мій ціль (USB-накопичувач) знаходиться на /dev/sdc
. Розмір сценарію - 202 байти, тому наш перший крок - знайти файл, більший за 202 байти, щоб ми могли його перезаписати. Після його встановлення /mnt
я знайшов відповідний файл у /mnt/info.txt
.
Ми не можемо просто перезаписати info.txt
на точку монтажу, вона скаржиться, що це файлова система лише для читання. Ми все ж кореневі, тож давайте покажемо їм, що це означає! Нам потрібно розібратися, де info.txt
знаходиться у файловій системі. Знайдіть рядок, який (мабуть) є унікальним info.txt
, наприклад This is the official distribution CD of X.
, і знайдіть його на диску:
$ 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 [...]
З іншого боку , це також може бути зроблено з Grep, яка набагато швидше, але тоді ви повинні вказати його з самого початку: $ sudo grep -oba 'This is ...' /dev/sdc
.
Тепер, коли ми знаємо, де він знаходиться, нам просто потрібно замінити ці байти на наш файл:
$ sudo dd if=script.py of=/dev/sdc conv=notrunc bs=1 seek=2573588480 count=202
Цей рядок:
- копіює байти з вхідного файлу (
if
) у вихідний файл ( of
), і не байдуже, що вихідний файл насправді є пристроєм, оскільки "все - це файл".
conv=notrunc
вказує не усікати вихідний файл, тому що ми хочемо лише перезаписати кілька байтів, а не перезаписати файл з певного моменту.
bs=1
встановлює розмір блоку на 1. Ви зазвичай хочете розмір блоку 4k або вище, але це обидва дозволяє уникнути необхідності (вбудованої) математики і дозволяє нам вказати місце розташування точно до байту.
seek=N
шукає певного пункту у вихідному файлі (зауважте, seek=N
він відрізняється від того, skip=N
що skip
пропускає байти з вхідного файлу!). Ми встановлюємо його, звичайно, там, де знаходиться цільовий текст.
count=N
скопіюйте лише це багато байтів. Я думаю, що це можна опустити, оскільки він помітить кінець вхідного файлу, але я залишив це лише для впевненості.
І вуаля, файл перезаписаний!
Але зачекайте, цільовий файл був більшим, ніж наш сценарій, тому на USB-накопичувачі файл тепер щось на зразок: "поки робити, якщо run () blah; blah (); yright 2007 X Inc.". Є затяжне сміття. Два способи виправити це: збільшити наш вхідний файл довше (додати пробіли) або додати символ коментаря наприкінці. Зверніть увагу , що багато редакторів додати нову рядок в кінці, так що ви можете встановити count=
в N-1
байтах (якщо ваш файл тепер 203 байт, і ви помітите , що останній байт є символ нового рядка, набір відлік до 202). Ви можете перевірити файл на нові рядки, скориставшись xxd script.py | tail
і перевіривши, чи є останній байт 0a
(або, у дивних випадках 0d
).
Процес ідентичний для .iso
файлу, просто подумки замінити /dev/sdc
з your.iso
.
Зауважте, що перевіряючи ціль у точці монтажу, щоб побачити, чи спрацювала вона, можливо, вам доведеться strings
знову використовувати (на цей раз пошук вашого сценарію), оскільки файл, ймовірно, все ще знаходиться в кеш-пам'яті зчитування.