Могу ли я получить файл подкачки на btrfs?

Современные версии Ubuntu по умолчанию используют файл подкачки вместо раздела подкачки.

Перед ядром Linux 5.0 было невозможно разместить файл подкачки на btrfs перегородка btrfs файловая система может быть повреждена.

Теперь ядра поддерживают файлы подкачки на разделах btrfs. Могу ли я использовать файл подкачки в Ubuntu, установленном на btrfs а какие возможные проблемы?

7 ответов

Решение

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

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

Предположим, что текущий своп уже отключен, / на /dev/sda1 и Ubuntu установлен с / на @ подобъём и /home на @home подобъём.

  1. Mount /dev/sda1 к /mnt.

     sudo mount /dev/sda1 /mnt
    

Если ты бежишь ls /mnt, ты увидишь @, @home и другие подтомы, которые могут там быть.

  1. Создать новый @swap подобъём.

     sudo btrfs sub create /mnt/@swap
    
  2. Размонтировать /dev/sda1 из /mnt

     sudo umount /mnt
    
  3. Создайте /swap каталог, в который мы планируем смонтировать @swap подобъём.

     sudo mkdir /swap
    
  4. Установите @swap субобъем к /swap.

     sudo mount -o subvol=@swap /dev/sda1 /swap
    
  5. Создайте файл подкачки.

     sudo touch /swap/swapfile
    
  6. Установите 600 разрешений на файл.

     sudo chmod 600 /swap/swapfile
    
  7. Отключите COW для этого файла.

     sudo chattr +C /swap/swapfile
    
  8. В качестве примера установите размер файла подкачки 4G.

     sudo fallocate /swap/swapfile -l4g
    
  9. Отформатируйте файл подкачки

    sudo mkswap /swap/swapfile
    
  10. Включите файл подкачки.

    sudo swapon /swap/swapfile
    

Теперь новый своп должен работать.

Вам также необходимо обновить /etc/fstabчтобы смонтировать все это при загрузке. Добавьте туда две строчки:

UUID=XXXXXXXXXXXXXXX /swap btrfs subvol=@swap 0 0
/swap/swapfile none swap sw 0 0

В UUID один из твоих /dev/sda1.

Комментарии и предложения приветствуются.

Обратите внимание, что для современных систем/ноутбуков с твердотельными накопителями NVME у вас есть /dev/nvme0n1p2вместо /dev/sda1и вы должны игнорировать /dev/nvme0n1p1, потому что это ваш загрузочный диск efi, созданный вашей ОС при ее установке.

Кроме того, рекомендуется добавить два параметра монтирования «по умолчанию» и «без времени». По умолчанию автоматически загружаются параметры монтирования для диска (SSD, HDD). Noatime предотвратит запись файлов, если они только открыты:

      UUID=XXXXXXXXXXXXXXX /swap btrfs defaults,noatime,subvol=@swap 0 0
/swap/swapfile none swap sw 0 0

Популярный ответ правильный, за исключением того, что вы не должны использовать fallocate(1) для выделения места для файла подкачки. Он может создавать «дыры» в файловой системе, которые несовместимы с использованием файла подкачки (для подкачки требуется 100% непрерывного пространства, поскольку файловая система не используется в пространстве подкачки). Вместо этого вы должны использовать 'dd if=/dev/zero...'. Смотрите ответ в этой теме: fallocate vs dd для файла подкачки?Справочные страницы mkswap(8) и swapon(8) явно не рекомендуют использовать fallocate(1) для создания экземпляра файла подкачки в файловой системе.

Начиная с версии 6.1, файл подкачки можно создать одной командой .

Я попытаюсь проверить последствия следующего (например, следует ли смонтировать файл подкачки btrfs в субтоме файла подкачки, чтобы снимки можно было выполнять на родительском томе?)

Примечание. Снимок не поддерживается для подтомов, содержащих файлы подкачки, поскольку выполняются следующие требования к снимку.

      subvolume - cannot be snapshotted if it contains any active swapfiles

Используйте значение по умолчанию 8G, но если оно уже установлено, используйте то, что было установлено.

      btr_swap_size=${btr_swap_size:=8G}
btrfs subvolume create SWAP
btrfs filesystem mkswapfile --size btr_swap_size /SWAP/swapfile
swapon /swapfile

мини-скрипт

      btr_swap_size=${btr_swap_size:=8G}
btr_swap_subvolume=${btr_swap_subvolume:="/SWAP"}
btr_swap_file=${btr_swap_subvolume}/SWAP-"${btr_swap_size}".img
swapon -s|grep -q "$swapfile" /etc/fstab
if [ $? -ne 0 ]; then
# if not then create it
    echo '$swapfile not found. Adding $swapfile.'

    btrfs subvolume create ${btr_swap_subvolume}
    btrfs filesystem mkswapfile --size "${btr_swap_size}" "${btr_swap_file}"
    swapon "${btr_swap_file}"
    echo '/$swapfile none swap defaults 0 0' >> /etc/fstab
else
    echo '$swapfile found. No changes made.'
fi

Если ваш раздел зашифрован (LUKS), точка монтирования включена /dev/mapperНапример:

      /dev/mapper/nvme0n1p5_crypt /swap btrfs defaults,noatime,subvol=@swap 0 0
/swap/swapfile none swap sw 0 0 here

Чтобы получить uuidsзапустить blkidкоманда:

      /dev/mapper/nvme0n1p5_crypt: UUID="06c8c73c-1cc4-477b-a687-6c21697d645d"   UUID_SUB="7f884b26-d76e-49db-9959-311fa2a5dd20" TYPE="btrfs"
/dev/nvme0n1p1: UUID="8090a824-63fa-4087-a948-89cca1a369cd" TYPE="ext2" PARTUUID="887ff27b-01"
/dev/nvme0n1p5: UUID="46405308-2ed1-40f3-a86b-906f1118970b" TYPE="crypto_LUKS" PARTUUID="887ff27b-05"

А затем замените mapperместо с конкретным uuid

      UUID=06c8c73c-1cc4-477b-a687-6c21697d645d /swap btrfs   defaults,noatime,subvol=@swap 0 0 
/swap/swapfile none swap sw 0 0

У вас может быть обмен на btrfs, если вы позаботитесь о том, что об этом говорится в документации btrfs:

      filesystem - must be only single device
filesystem - must have only single data profile
swapfile - the containing subvolume cannot be snapshotted
swapfile - must be preallocated (i.e. no holes)
swapfile - must be NODATACOW (i.e. also NODATASUM, no compression)

Для получения дополнительной информации см. источник:

Лучший ответ для меня не получил. Я получал ошибку:

      $ sudo swapon -v --show /swap/swapfile

swapon: /swap/swapfile: swapon не удалось: недопустимый аргумент

для меня рабочее решение было из https://btrfs.readthedocs.io/en/latest/btrfs-man5.html#swapfile-support

      # truncate -s 0 swapfile
# chattr +C swapfile
# fallocate -l 2G swapfile
# chmod 0600 swapfile
# mkswap swapfile
# swapon swapfile

/etc/fstab:

      /swap/swapfile              none            swap    sw              0       0
Другие вопросы по тегам