Bunun en yaygın cevabı, iso dosyasını açmak, değiştirmek ve tekrar paketlemektir. DV3500ea'nın cevabında belirtildiği gibi "ISO Master" gibi görünüyor, bunun için iyi bir ön uç.
Eğer:
- bunun için yeterli yeriniz yok
- her şeyi yeniden yazmak yerine sadece cerrahi bir değişiklik yapmak istiyorsun
- Tüm cihazı kopyalamadan bir isofs dosya sistemi (aka iso9660) içeren bir depolama cihazını değiştirmek istiyorsanız, veya
- Bu açma / yeniden paketleme işlemini sadece yeterince sahte olmadığını düşünüyorsanız
O zaman bu cevap tam size göre!
Özetle, isofs dosya sistemindeki mevcut bir dosyayı istediğimiz dosya ile değiştireceğiz. İstediğimiz dosya mevcut (hedef) dosyadan daha küçük olmalı ve takip eden boşluk (veya çöp) kabul edilebilir olmalıdır.Bu aslında sadece iki komut gerektirir ancak dikkatli olun: Bir yazım hatası hedef dosya sistemini tamamen tahrip edebilir, hatta kaynak dosyanın üzerine yazabilir. Yedekler senin arkadaşın!
Benim durumumda, bir betiği canlı bir açılışta saklamak istedim, böylece her seferinde yeniden yazmak zorunda kalmayacağım. Komut dosyası şu anda script.py
ve hedefim (bir USB bellek çubuğu) /dev/sdc
. Komut dosyasının boyutu 202 bayttır, bu nedenle ilk adımımız 202 bayttan daha büyük bir dosya bulmak, böylece üzerine yazabiliriz. Montajdan sonra /mnt
uygun bir dosya buldum /mnt/info.txt
.
Bağlantı info.txt
noktasında sadece üzerine yazamayız, bunun salt okunur bir dosya sistemi olduğundan şikayet edecektir. Yine de kökünüz, öyleyse onlara bunun ne anlama geldiğini gösterelim! info.txt
Dosya sisteminin neresinde olduğunu bulmamız gerek . info.txt
Örneğin This is the official distribution CD of X.
, belki de benzersiz olan bir dize bulun ve diskte arayın:
$ 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 [...]
Alternatif olarak, bu daha hızlı olan grep ile de yapılabilir, ancak daha sonra baştan belirtmeniz gerekir: $ sudo grep -oba 'This is ...' /dev/sdc
.
Artık nerede olduğunu bildiğimize göre, bu baytları dosyamızla değiştirmemiz gerekiyor:
$ sudo dd if=script.py of=/dev/sdc conv=notrunc bs=1 seek=2573588480 count=202
Bu hat:
- Baytları girdi dosyasından (
if
) çıktı dosyasına kopyalar.of
) ve çıktı dosyasının gerçekte bir cihaz olduğu umrunda değildir, çünkü "her şey bir dosyadır".
conv=notrunc
çıktı dosyasını kesmemesini söyler, çünkü sadece bir kaç byte yazmak istiyoruz, dosyanın üzerine bir noktadan itibaren yazmak istemiyoruz.
bs=1
blok boyutunu 1 olarak ayarlar. Genellikle 4k veya daha büyük bir blok boyutu istersiniz, ancak her ikisi de (satır içi) matematik yapmak zorunda kalmaz ve bayt için tam olarak konum belirtmemize izin verir.
seek=N
notta (çıkış dosyasında belli bir noktaya arar seek=N
farklıdır skip=N
çünküskip
atlama giriş dosyasından bayt!). Elbette hedef metnin olduğu yere ayarladık.
count=N
sadece bu çok bayt kopyala. Girdi dosyasının sonunun farkına varacağı için bunun ihmal edilebileceğini düşünüyorum, ancak emin olmak için bıraktım.
Ve işte, dosyanın üzerine yazılmıştır!
Ancak bekleyin, hedef dosya komut dosyamızdan daha büyüktü, bu yüzden USB çubuğunda dosya şimdi şöyle bir şeydi: "(run () blah; blah (blah (); yright 2007 X Inc.)." Sonunda çöp var. Bunu düzeltmenin iki yolu: giriş dosyamızı daha uzun hale getirin (boşluk ekleyin) veya sonunda bir yorum sembolü ekleyin. Eğer sette isteyebilirsiniz kadar çok editörler, sonunda bir yeni satır eklemek Not count=
için N-1
bayt (dosya şimdi 203 bayt ise, ve sonuncu bayt bir satır, 202 set sayısı olduğunu fark). xxd script.py | tail
Son bayt olup olmadığını kontrol ederek yeni satırlar için bir dosyayı kontrol edebilirsiniz 0a
(veya tuhaf durumlarda 0d
).
Bu işlem bir .iso
dosya için aynıdır , sadece zihinsel olarak /dev/sdc
bununla değiştirin your.iso
.
Çalışıp çalışmadığını görmek için bağlama noktanızdaki hedefi kontrol ettiğinizde strings
, dosya muhtemelen okuma önbelleğinde olduğundan, yeniden kullanmanız gerekebilir (bu kez komut dosyanızı ararken).