Câu trả lời phổ biến cho vấn đề này là giải nén tệp iso, sửa đổi và đóng gói lại. Có vẻ như "ISO Master", như được đề cập trong câu trả lời của dv3500ea, là một mặt trước tốt để làm điều đó.
Nếu:
- bạn không có đủ không gian cho việc đó
- bạn chỉ muốn thực hiện một sửa đổi phẫu thuật thay vì viết lại toàn bộ
- bạn muốn sửa đổi thiết bị lưu trữ chứa hệ thống tệp isofs (còn gọi là iso9660) mà không cần sao chép toàn bộ thiết bị hoặc
- Nếu bạn nghĩ rằng điều này giải nén / đóng gói lại chỉ là không đủ hack
Sau đó, câu trả lời này là dành cho bạn!
Tóm lại, chúng tôi sẽ thay thế một tệp hiện có trong hệ thống tệp isofs bằng tệp mong muốn của chúng tôi. Tệp mong muốn của chúng tôi phải nhỏ hơn tệp (đích) hiện tại và khoảng trắng theo dõi (hoặc rác) phải được chấp nhận. Điều này thực sự chỉ cần hai lệnh, nhưng hãy cẩn thận: một lỗi đánh máy có thể phá hủy hoàn toàn hệ thống tệp đích hoặc thậm chí ghi đè lên tệp nguồn. Sao lưu là bạn của bạn!
Trong trường hợp của tôi, tôi muốn lưu trữ một tập lệnh trong một khởi động trực tiếp để tôi không phải gõ lại nó mỗi lần. Kịch bản đang ở script.py
và mục tiêu của tôi (một thanh USB) là /dev/sdc
. Kích thước của tập lệnh là 202 byte, vì vậy bước đầu tiên của chúng tôi là tìm một tệp lớn hơn 202 byte, vì vậy chúng tôi có thể ghi đè lên tập lệnh. Sau khi gắn nó vào /mnt
, tôi tìm thấy một tập tin phù hợp tại /mnt/info.txt
.
Chúng ta không thể ghi đè lên info.txt
điểm gắn kết, nó sẽ phàn nàn rằng đó là hệ thống tệp chỉ đọc. Tuy nhiên, chúng tôi là root, vì vậy hãy cho họ thấy điều đó có nghĩa là gì! Chúng ta cần tìm ra vị trí info.txt
của hệ thống tập tin. Tìm một số chuỗi (có lẽ) là duy nhất info.txt
, ví dụ This is the official distribution CD of X.
, và tìm kiếm nó trên đĩa:
$ 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 [...]
Ngoài ra, điều này cũng có thể được thực hiện với grep, nhanh hơn rất nhiều, nhưng sau đó bạn cần chỉ định nó từ đầu : $ sudo grep -oba 'This is ...' /dev/sdc
.
Bây giờ chúng ta đã biết nó ở đâu, chúng ta chỉ cần thay thế các byte đó bằng tệp của mình:
$ sudo dd if=script.py of=/dev/sdc conv=notrunc bs=1 seek=2573588480 count=202
Đường thẳng này:
- sao chép byte từ tệp đầu vào (
if
) sang tệp đầu ra ( of
) và không quan tâm rằng tệp đầu ra thực sự là một thiết bị, bởi vì "mọi thứ đều là một tệp".
conv=notrunc
yêu cầu nó không cắt bớt tệp đầu ra, bởi vì chúng tôi chỉ muốn ghi đè lên một vài byte, không ghi đè lên tệp từ một điểm nhất định trở đi.
bs=1
đặt kích thước khối thành 1. Bạn thường muốn kích thước khối từ 4k trở lên, nhưng cả hai đều tránh phải làm toán (nội tuyến) và cho phép chúng tôi chỉ định vị trí chính xác cho byte.
seek=N
tìm kiếm một điểm nhất định trong tệp đầu ra (lưu ý seek=N
khác với skip=N
vì skip
bỏ qua byte từ tệp đầu vào!). Tất nhiên, chúng tôi đặt nó vào vị trí của văn bản đích.
count=N
chỉ sao chép nhiều byte này. Tôi nghĩ rằng điều này có thể được bỏ qua bởi vì nó sẽ thông báo kết thúc của tập tin đầu vào, nhưng tôi đã để nó chỉ để chắc chắn.
Và voila, tập tin bị ghi đè!
Nhưng chờ đã, tệp đích lớn hơn tập lệnh của chúng tôi, vì vậy trên thanh USB, tệp bây giờ giống như: "while do if run () blah; blah (); yright 2007 X Inc.". Có rác thải. Hai cách để khắc phục điều này: làm cho tệp đầu vào của chúng tôi dài hơn (thêm khoảng trắng) hoặc thêm biểu tượng nhận xét ở cuối. Lưu ý rằng nhiều trình soạn thảo thêm một dòng mới ở cuối, vì vậy bạn có thể muốn đặt count=
thành N-1
byte (nếu tệp của bạn bây giờ là 203 byte và bạn nhận thấy rằng byte cuối cùng là một dòng mới, hãy đặt đếm thành 202). Bạn có thể kiểm tra một tệp cho các dòng mới bằng cách sử dụng xxd script.py | tail
và kiểm tra xem byte cuối cùng là 0a
(hoặc, trong trường hợp lạ, 0d
).
Quá trình này là giống hệt nhau cho một .iso
tập tin, chỉ cần thay thế /dev/sdc
bằng tinh thần your.iso
.
Lưu ý rằng khi bạn kiểm tra mục tiêu trong điểm gắn kết của mình để xem liệu nó có hoạt động không, bạn có thể cần phải sử dụng strings
lại (lần này là tìm kiếm tập lệnh của bạn) vì tệp có thể vẫn còn trong bộ đệm đọc.