Как можно обнулить / swapfile, не стирая, что делает его swapfile?

8

У меня есть скрипт, который я запускаю для оптимизации дискового пространства перед резервным копированием виртуального гостя (на самом деле не имеет большого значения, какой гипервизор используется).

Современные версии Ubuntu (например, 18.04), по-видимому, используют по умолчанию /swapfileвместо раздела. Это тоже хорошо.

Однако я хотел бы обнулить файл подкачки вместе с корневым разделом, в котором он находится.

С разделами подкачки это было относительно безболезненно, поскольку всегда был способ извлечь существующий $UUIDиз раздела подкачки и - после обнуления раздела - запустить mkswap -U $UUIDдля воссоздания указанного раздела подкачки.

Тем не менее, /swapfileя не вижу, как это сделать. Хотя я понимаю, что вы не можете подключить /swapfileUUID /etc/fstab, я все равно хотел бы сохранить UUID.

Поэтому я считаю, что нужно одно из следующих действий:

  1. Мне нужен метод, который может обнулить файл подкачки, не стирая при этом те структуры, которые делают его разделом подкачки (т.е. избежать необходимости запуска mkswap -U $UUID)
  2. Мне нужен метод для извлечения существующего UUID из файла подкачки (в отличие от раздела, где я могу использовать что угодно, от blkidпросмотра /dev/disk/by-uuid/$UUID...)
0xC0000022L
источник

Ответы:

15
  1. Это не очистит файл подкачки так же тщательно, как его воссоздание, но если вы очистите его после пропуска первых 4 КБ (строго говоря, первой страницы, которая зависит от вашей архитектуры), вы не затронете ни одну из структур. которые определяют файл подкачки.

  2. blkid отлично работает и с файлами подкачки:

    $ 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"
    

Формат заголовка определен в ядре : старый формат имеет магическое значение в конце первой страницы, новый формат объединяет это со свободной областью 1 КБ, затем рядом полей (версия, размер, плохие страницы, UUID, ярлык), которые все удобно помещаются на первой странице.

Стивен Китт
источник
Вау, вручите самый быстрый ответ, который я когда-либо получал на любом сайте StackExchange. Спасибо. Я, честно говоря, никогда не использовал blkidс параметром. Думаю, я должен делать это, а не, например, использовать ddсо смещением.
0xC0000022L
3
Правильно, чтение UUID и повторное создание файла подкачки, вероятно, является более простым вариантом.
Стивен Китт
@ 0xC0000022L, также посмотрите параметры выходного формата blkid. В зависимости от версии вы можете blkid swap -o value -s uuidизвлечь только UUID.
Муру
@Muru спасибо, уже сделал и выбрал, через blkid -o export <file>который я перехожу, sedчтобы присоединиться local к каждой строке и затем evalиспользовать Bash. Таким образом, у меня есть значения в моей функции как локальные переменные среды сразу.
0xC0000022L