Saya memiliki enam volume logis Linux yang bersama-sama mendukung mesin virtual. VM saat ini sedang dimatikan, sehingga mudah untuk mengambil gambar yang konsisten.
Saya ingin mengemas semua enam gambar bersama dalam arsip. Secara sepele, saya bisa melakukan sesuatu seperti ini:
cp /dev/Zia/vm_lvraid_* /tmp/somedir
tar c /tmp/somedir | whatever
Tapi itu tentu saja membuat salinan tambahan. Saya ingin menghindari salinan tambahan.
Pendekatan yang jelas:
tar c /dev/Zia/vm_lvraid_* | whatever
tidak berfungsi, karena tar mengenali file-file khusus (symlinks dalam hal ini) dan pada dasarnya menyimpan ln -s
dalam arsip. Atau, dengan --dereference
atau langsung menunjuk /dev/dm-X
, itu mengenali mereka sebagai khusus (file perangkat) dan pada dasarnya menyimpan mknod
dalam arsip.
Saya telah mencari opsi baris perintah untuk tar untuk menimpa perilaku ini, dan tidak dapat menemukannya. Saya juga mencoba cpio
, masalah yang sama, dan tidak dapat menemukan opsi untuk menimpanya di sana, baik. Saya juga mencoba 7z
(ditto). Sama dengan pax
. Saya bahkan mencoba zip
, yang justru membuat dirinya bingung.
sunting: Melihat kode sumber GNU tar dan GNU cpio, tampaknya tidak ada yang bisa melakukan ini. Setidaknya, bukan tanpa tipu daya serius (penanganan khusus file perangkat tidak dapat dinonaktifkan). Jadi, saran tipuan serius akan dihargai atau utilitas alternatif.
TLDR: Apakah ada beberapa pengarsip yang akan mengemas beberapa gambar disk bersama-sama (diambil dari perangkat mentah) dan mengalirkan output itu, tanpa membuat salinan di-disk tambahan? Preferensi saya adalah keluaran dalam format umum, seperti POSIX atau GNU tar.
sumber
Jawaban:
Jadi baru-baru ini saya ingin melakukan ini
tar
. Beberapa investigasi menunjukkan kepada saya bahwa saya tidak bisa melakukannya. Aku memang menemukan hal aneh inisplit --filter="cat >file; tar -r ..."
, tapi, yah, itu sangat lambat. Dan semakin saya membaca tentangtar
semakin tidak masuk akal rasanya.Anda lihat,
tar
ini hanya daftar catatan yang digabungkan. File konstituen tidak diubah dengan cara apa pun - mereka utuh dalam arsip. Tapi mereka diblokir pada batas blok 512-byte , dan sebelum setiap file ada header . Itu dia. Format tajuk juga sangat, sangat sederhana.Jadi, saya menulis sendiri
tar
. Saya menyebutnya ...shitar
.Itu daging dan kentang, sungguh. Ini menulis header dan menghitung chksum - yang, secara relatif, adalah satu-satunya bagian yang sulit. Itu
ustar
format header ... mungkin . Paling tidak, ia meniru apa yangtar
tampaknya GNU anggapustar
format tajuk ke titik yang tidak dikeluhkan. Dan ada lebih dari itu, hanya saja saya belum benar-benar menggumpalnya . Di sini, saya akan menunjukkan kepada Anda:Itu
tar
. Semuanya diisi dengan\0
nol jadi saya hanya berubahem
menjadi\n
ewlines untuk dibaca. Danshitar
:KELUARAN
Saya katakan agak di atas sana karena itu bukan
shitar
tujuan -tar
sudah melakukannya dengan indah. Saya hanya ingin menunjukkan cara kerjanya - yang berarti saya perlu menyentuhchksum
. Kalau bukan karena itu saya hanya akandd
mengambil kepalatar
file dan selesai dengan itu. Itu bahkan kadang-kadang bisa berfungsi, tetapi akan berantakan ketika ada banyak anggota dalam arsip. Tetap saja, chksum sangat mudah.Pertama, buat 7 spasi - (yang merupakan hal aneh gnu, saya pikir, seperti yang dikatakan spek 8, tapi apa pun - peretasan adalah peretasan) . Kemudian tambahkan nilai oktal dari setiap byte di header. Itu chksum Anda. Jadi Anda perlu metadata file sebelum Anda melakukan header, atau Anda tidak memiliki chksum. Dan itu
ustar
sebagian besar arsip.Baik. Sekarang, apa yang harus dilakukan:
Itu membuat tiga gambar disk 500 juta, masing-masing format dan mount, dan menulis file untuk masing-masing.
Catatan - tampaknya memblokir perangkat hanya akan selalu memblokir dengan benar. Cukup berguna.
Itulah
tar
isi file perangkat disk yang di-stream dan mengirim output ke pipxz
.Sekarang, momen kebenaran ...
Hore! Ekstraksi ...
Perbandingan...
Dan gunung ...
Jadi, dalam hal ini,
shitar
berkinerja baik, kurasa. Saya lebih suka tidak membahas semua hal yang tidak akan berhasil dengan baik. Tapi, saya akan mengatakan - jangan lakukan baris baru di nama file setidaknya.Anda juga dapat melakukan - dan mungkin harus, mempertimbangkan alternatif yang saya tawarkan -ini
squashfs
. Anda tidak hanya mendapatkan arsip tunggal yang dibangun dari aliran - tetapi jugamount
dapat dan dibangun di dalam kernelvfs
:Dari pseudo-file.example :
Anda juga dapat menggunakan
btrfs (send|receive)
untuk mengalirkan subvolume ke dalamstdin
kompresor apa pun yang Anda inginkan. Subvolume ini tidak perlu ada sebelum Anda memutuskan untuk menggunakannya sebagai wadah kompresi, tentu saja.Namun, tentang
squashfs
...Saya tidak percaya saya melakukan keadilan ini. Berikut ini contoh yang sangat sederhana:
Itu hanya
-p
argumen inline untukmksquash
. Anda dapat sumber file dengan yang-pf
mengandung sebanyak yang Anda suka. Formatnya sederhana - Anda menentukan nama / jalur file target di sistem file arsip baru, Anda memberikannya mode dan pemilik, dan kemudian Anda memberi tahu proses untuk mengeksekusi dan membaca stdout dari. Anda dapat membuat sebanyak yang Anda suka - dan Anda dapat menggunakan LZMA, GZIP, LZ4, XZ ... hmm ada lebih banyak ... format kompresi yang Anda inginkan. Dan hasil akhirnya adalah arsip tempat Andacd
.Lebih lanjut tentang format:
Ini, tentu saja, bukan hanya arsip - ini adalah citra sistem file Linux yang dapat dimounting. Formatnya adalah kernel Linux - itu adalah sistem file yang didukung oleh vanilla kernel. Dengan cara ini, ini sama dengan kernel vanilla Linux. Jadi jika Anda mengatakan kepada saya Anda menjalankan sistem Linux vanilla di mana
tar
program tidak diinstal saya akan meragukan - tapi saya mungkin akan percaya Anda. Tetapi jika Anda mengatakan kepada saya Anda menjalankan sistem Linux vanilla di manasquashfs
filesystem tidak didukung saya tidak akan percaya Anda.sumber
input f 444 root root dd if=/dev/sda1 bs=1024 count=10
is f input file? Mungkin akan lebih baik untuk membuat perangkat mainan, mengisinya dengan data, dan menulis darinya? Dan apakah semua ini membutuhkan root?input
file tersebut adalah file dalamsquashfs
arsip - gambar filesystem yang dihasilkan dari menjalankan perintah. Ketika Anda melakukannya,mksquash
Anda dapat menentukan perintah pseudofile ini untuk perintah yang dijalankan dan dari manastdout
ditangkap pada waktu kompres.Masalah Anda membingungkan saya selama beberapa waktu, dan saya pikir saya telah menemukan solusi yang akan berhasil.
Saya pikir Anda dapat mencapai apa yang Anda inginkan dengan 7z menggunakan
-si{NAME}
bendera.Anda akan dapat beradaptasi dengan kebutuhan Anda.
EDIT : Hapus penggunaan kucing yang tidak berguna
sumber
7z
halaman manual saya tidak menyebutkan -si bisa mengambil nama file, tetapi berhasil. Ini tidak sempurna (output tidak dapat disalurkan ke suatu tempat), tetapi jelas merupakan yang terbaik sejauh ini dalam format umum.