Bagaimana saya bisa mengisi / swapfile tanpa menghapus apa yang membuatnya menjadi swapfile?

8

Saya memiliki skrip yang saya jalankan untuk mengoptimalkan ruang disk sebelum mencadangkan tamu virtual (benar-benar tidak masalah terlalu banyak hypervisor yang digunakan).

Versi Ubuntu modern (mis. 18.04) tampaknya default untuk menggunakan /swapfiledaripada partisi untuk tujuan itu. Itu baik juga.

Namun, saya ingin melakukan zerofill file swap bersama dengan partisi root yang mengandungnya.

Dengan partisi swap, ini relatif tidak menyakitkan karena selalu ada cara untuk mengekstrak yang ada $UUIDdari partisi swap dan - setelah zerofilling partisi - jalankan mkswap -U $UUIDuntuk membuat kembali partisi swap tersebut.

Namun, dengan /swapfilesaya tidak tahu bagaimana melakukannya. Meskipun saya menyadari bahwa Anda tidak dapat memasang /swapfileUUID di /etc/fstab, saya masih ingin mempertahankan UUID.

Jadi saya rasa perlu salah satu dari yang berikut untuk melanjutkan:

  1. Saya memerlukan metode yang dapat melakukan zerofill file swap tanpa juga menghapus struktur yang menjadikannya partisi swap (yaitu menghindari harus menjalankan mkswap -U $UUID)
  2. Saya memerlukan metode untuk mengambil UUID yang ada dari file swap (sebagai lawan dari partisi di mana saya dapat menggunakan apa saja dari blkiduntuk melihat /dev/disk/by-uuid/$UUID...)
0xC0000022L
sumber

Jawaban:

15
  1. Ini tidak akan menghapus file swap secara menyeluruh seperti membuatnya kembali, tetapi jika Anda menghapusnya setelah melewatkan 4KiB pertama (sebenarnya, halaman pertama, yang tergantung pada arsitektur Anda), Anda tidak akan menyentuh salah satu struktur yang mengidentifikasi file swap.

  2. blkid berfungsi dengan baik pada file swap juga:

    $ mkswap swap
    Setting up swapspace version 1, size = 512 MiB (536866816 bytes)
    no label, UUID=7916b81f-1faa-4b7d-84ef-b0bf2f75dbbc
    
    $ blkid swap
    swap: UUID="7916b81f-1faa-4b7d-84ef-b0bf2f75dbbc" TYPE="swap"
    

Format header didefinisikan di kernel : format lama memiliki nilai ajaib di akhir halaman pertama, format baru menggabungkannya dengan area bebas 1KiB, kemudian sejumlah bidang (versi, ukuran, halaman buruk, UUID, label) yang semuanya pas dengan nyaman di halaman pertama.

Stephen Kitt
sumber
Wow, berikan jawaban tercepat yang pernah saya terima di situs StackExchange. Terima kasih. Terus terang saya tidak pernah menggunakan blkidparameter. Kira saya harus melakukan itu daripada, misalnya, menggunakan dddengan offset.
0xC0000022L
3
Benar, membaca UUID dan membuat kembali file swap mungkin adalah opsi yang lebih mudah.
Stephen Kitt
@ 0xC0000022L juga melihat ke opsi format output dari blkid. Bergantung pada versinya, Anda mungkin dapat melakukan blkid swap -o value -s uuiduntuk mengekstrak hanya UUID.
muru
@muru terima kasih, sudah melakukannya dan memilih blkid -o export <file>yang saya pipa seduntuk menambahkan local ke setiap baris dan kemudian evalmenggunakan Bash. Dengan cara ini saya memiliki nilai dalam fungsi saya sebagai variabel lingkungan lokal segera.
0xC0000022L