Seluruh Sistem Linux Diff

8

Saya memiliki sistem basis Linux yang diinstal. Saya ingin menjalankan skrip pihak ketiga yang sangat besar dan kompleks yang akan membuat banyak perubahan pada berbagai bagian dari keseluruhan sistem. Perubahan ini termasuk menambahkan file baru, memodifikasi file yang ada, dan menghapus file yang ada. Setelah skrip selesai, saya akan memiliki sistem yang dimodifikasi. Modifikasi akan luas dan substansial.

Saya ingin semacam laporan pada semua file yang telah ditambahkan, dihapus, atau dimodifikasi dan analisis modifikasi baris demi baris. Sesuatu seperti keluaran dari alat diff file akan sangat bagus.

Saya menganggap saya perlu membuat semacam snapshot sebelum menjalankan skrip dan snapshot kedua setelah. Saya berasumsi bahwa saya akan memberi makan snapshot-snapshot itu menjadi semacam alat diff atau seperti-diff.

Adakah yang tahu alat apa yang harus digunakan dan bagaimana cara membedakan seluruh sistem?

Saya menggunakan Virtualbox yang memang memiliki fitur gambar yang berbeda , meskipun saya tidak tahu apakah saya bisa menyesuaikannya dengan tujuan ini. Selain itu, saya lebih suka solusi yang lebih umum jika memungkinkan.


sumber
Membedakan gambar (alias foto) bukan yang Anda cari. Tujuan mereka adalah untuk menghasilkan diff biner sekecil mungkin, bukan perbedaan teks verbose.
Dmitry Grigoryev
@DmitryGrigoryev Itulah kesan yang saya dapatkan dari tautan. Terima kasih telah mengkonfirmasi ini untuk saya.
Sebenarnya apa yang Anda inginkan cukup mudah tetapi rumit untuk dicapai. Mengingat sumber dayanya saya akan menginstal dua sistem persis sama. Aktifkan audit sistem file pada sistem yang akan memodifikasi file. Dapatkan laporan dari audit untuk mengidentifikasi apa yang ditambahkan / modfiry / hapus. Kemudian bandingkan file-file ini dengan sistem yang diinstal lainnya.
BitsOfNix
1
Anda dapat menggunakan rsyncuntuk membuat snapshot dan menjalankan lagi setelah modifikasi untuk menghasilkan laporan file yang dimodifikasi. Bagian yang berbeda mungkin akan lebih sulit.
FloHimself

Jawaban:

1

Saya pikir ide Anda tidak jauh dari solusi. Untuk menguraikan cara yang mungkin: Saya menggunakan rsnapshotuntuk cadangan. Ini menciptakan struktur direktori (cadangan-) dari semua atau bagian dari file Anda dengan titik masuk (misalnya) /backup/hourly.1/...dan /backup/hourly.0/..., di mana setiap cabang membawa seluruh data, tetapi menggunakan tautan (keras) untuk file di mana tidak ada perubahan yang telah dilakukan . Melakukan rekursif lsatau findpada kedua struktur dan membandingkan output (diurutkan, jika ditemukan) akan menampilkan file yang hilang, dan memeriksa penghitungan tautan (di ls -ldalamnya akan menjadi kolom kedua) akan menampilkan file baru (yang memiliki jumlah tautan) 1). Untuk perincian perubahan dalam file Anda dapat (untuk file yang diidentifikasi) menggunakan biasadiffalat. Seperti yang dikatakan ini adalah garis besar, akan membutuhkan beberapa pekerjaan untuk diterapkan, dan mungkin memiliki kebiasaan yang tidak jelas, jadi bawa proposal itu dengan sebutir garam

Janis
sumber
0

Saya mungkin akan melakukan ini menggunakan rsync seperti yang disarankan dalam salah satu komentar. Rsync memiliki mode menjalankan-kering dan fitur checksum yang dapat Anda gunakan untuk membuat laporan yang akurat tentang apa yang berubah.

Mengambil lebih jauh Anda mungkin bisa menulis skrip yang melakukan diff pada file yang diubah, meskipun Anda harus membuatnya menghindari file biner (tidak yakin bagaimana) ..

Atau, Anda bisa mengambil pendekatan yang sama sekali berbeda .. gunakan git. Jadi pada sistem 'base' Anda, lakukan git init di /, lalu setelah Anda menjalankan hal pihak ketiga yang bisa Anda lakukan:

git status > /tmp/changed-files.txt
git diff > /tmp/changes.txt

menggunakan git akan memberi Anda sedikit fleksibilitas. Setelah mengatakan bahwa itu mungkin memperjuangkan seluruh sistem dan mungkin bingung tentang / proc dll.

John Hunt
sumber
0

Ada sesuatu yang disebut libguestfs yang dapat Anda gunakan untuk melakukan diff. Itu yang saya gunakan di masa lalu dan saya pikir sekarang operasi itu mungkin dibangun sehingga Anda tidak perlu menggunakan shell guestfish.

Pilihan lain adalah menjalankan operasi Anda dalam wadah buruh pelabuhan dan kemudian mengekspor dan membedakan pohon file yang dihasilkan sebagai file tar.

Perlu diketahui juga bahwa jika skrip mengubah pengaturan sistem dengan menulis ke file virtual maka perubahan itu tidak akan muncul di pohon file dan Anda perlu sesuatu yang lain untuk menangkap perubahan itu. Contoh dari hal seperti itu adalah aturan iptable. Anda perlu logika khusus untuk menangkap perubahan itu.

davidk01
sumber
Kecuali jika aturannya tetap, maka harus disimpan di suatu tempat sehingga dapat dijalankan kembali / diaktifkan kembali setelah jaringan muncul, dll.
ivanivan
0

Halaman di The Linux Cookbook menunjukkan menemukan-grep modifikasi pra dan pasca, diikuti oleh diff. Ini sangat sederhana, mungkin merupakan titik awal, tetapi masalah Anda mungkin lebih baik ditangani dengan solusi yang lebih canggih yang dicatat.

Sepertinya ini hanya akan menangkap penambahan dan penghapusan, bukan modifikasi ... tepuk tangan, drl

drl
sumber
0

Semua jawaban ini mengarah ke arah yang benar dan dengan cara yang sama. Semoga juga membuang 8 bit saya di ...

Instal sistem dasar di virtualbox. Setelah pengaturan awal dan basis Anda siap, boot vm dengan beberapa media langsung lainnya. Anda kemudian dapat menambahkan atau mengekspor sistem file tanpa direktori volatile seperti /procyang terlibat.

Jalankan skrip besar Anda, dan ulangi proses ekspor.

Sekarang Anda memiliki 2 filesystem yang tersedia, Anda dapat menggunakan berbagai alat perbandingan.

diff --brief -Nr /tree1 /tree2

Akan memberi Anda daftar file bagus yang berbeda stdout, dan daftar file yang tidak ditemukan di satu pohon atau yang lainnya aktif stderr.

Untuk mengetahui perubahan aktual apa yang terjadi, Anda bisa mengurai stdoutoutput file yang berbeda dan menjalankannya secara diffindividual, mengarahkan output ke file. Atau Anda bisa memeriksa daftar dan menjalankan diff pada file yang sangat menarik bagi Anda.

Anda bisa menggabungkan semua ini menjadi satu perintah, menggunakan git. Dapat digunakan tanpa repo diinisialisasi, cukup arahkan ke 2 direktori. Memberikan output berwarna yang bagus, disingkat pagination melalui

git diff --no-index /tree1 /tree2

ivanivan
sumber