Я пытаюсь добавить новое swapfile
увеличить Область подкачки следующим это учебное руководство.
swapfile
создает успешно, но, swapon
команда не примет его: говорит "пропуск - это, кажется, имеет дыры"..
Я выполняю Xubuntu 19.10 с ZFS на корне.
Вот то, что я попробовал до сих пор:
fallocate
- неудавшийсяsudo fallocate -l 8G /swapfile
fallocate: fallocate failed: Operation not supported
Это кажется fallocate, в настоящее время не поддерживает ZFS.
dd
- успехsudo dd if=/dev/zero of=/swapfile bs=1MiB count=$((8*1024))
8192+0 records in
8192+0 records out
8589934592 bytes (8.6 GB, 8.0 GiB) copied, 2.68284 s, 3.2 GB/s
sudo chmod 600 /swapfile
ls -lah /swapfile
-rw------- 1 root root 8.0G Dec 27 14:15 /swapfile
sudo mkswap /swapfile
Setting up swapspace version 1, size = 8 GiB (8589930496 bytes)
no label, UUID=db8aa64c-734c-4eba-a803-72db681ec1a1
sudo swapon /swapfile
swapon: /swapfile: skipping - it appears to have holes.
Файлы с дырами
Реализация файла подкачки в ядре ожидает мочь записать в файл непосредственно без помощи файловой системы. Это - проблема на файлах с дырами или на файлах копии на записи в файловых системах как Btrfs.
Команды как CP (1) или усеченный (1) создают файлы с дырами. Эти файлы будут отклонены swapon.
Предварительно выделенные файлы, созданные fallocate (1), могут быть интерпретированы как файлы с дырами также в зависимости от файловой системы. Предварительно выделенные файлы подкачки поддерживаются на XFS начиная с Linux 4.18.
Самое портативное решение создать файл подкачки состоит в том, чтобы использовать dd (1) и/dev/zero.
Как я могу создать своп-файл на ZFS который swapon
команда приняла бы?
sudo parted -l
Model: WDC PC SN520 SDAPNUW-512G-1002 (nvme)
Disk /dev/nvme0n1: 512GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 538MB 537MB fat32 EFI System Partition boot, esp
2 538MB 590MB 52.4MB ext4
3 590MB 2738MB 2147MB linux-swap(v1)
4 2738MB 4885MB 2147MB zfs
5 4885MB 512GB 507GB zfs
sudo zpool list -v
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
bpool 1.88G 131M 1.75G - - 0% 6% 1.00x ONLINE -
nvme0n1p4 1.88G 131M 1.75G - - 0% 6.82% - ONLINE
rpool 472G 112G 360G - - 9% 23% 1.00x ONLINE -
nvme0n1p5 472G 112G 360G - - 9% 23.8% - ONLINE
sudo zfs list
# https://pastebin.ubuntu.com/p/6jDVwbhfCT/
sudo lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 19.10
Release: 19.10
Codename: eoan
sudo uname -a
Linux iCyberRoze 5.3.0-24-generic #26-Ubuntu SMP Thu Nov 14 01:33:18 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
Учебник, на который вы ссылаетесь, не предполагает, что вашей корневой файловой системой является ZFS. Справочная страница ZFS указывает:
Тома ZFS как устройства подкачки
Тома ZFS можно использовать в качестве устройств подкачки. После создания тома с помощью команды
zfs create -V
настройте и включите область подкачки с помощью команд mkswap(8) и swapon(8). Не переключайтесь на файл в файловой системе ZFS. Конфигурация файла подкачки ZFS не поддерживается.
Вы можете следовать инструкциям в другом ответе от stratus, чтобы заставить пространство подкачки работать из zvol, которое можно использовать в качестве пространства подкачки, являющегося частью вашего пула ZFS.
Однако, если вы действительно хотите следовать рекомендациям по использованию файла подкачки , хранящегося в файловой системе ZFS:
fallocate
не работает в файловых системах ZFS, как вы уже знаете из Ошибка zfsonlinux github, которую вы уже опубликовали.Вместо использования dd
, который будет работать медленнее, поскольку он должен записывать каждую часть выходного файла, вы можете быстро создать большой разреженный файл, который можно создать в файловой системе ZFS, попробуйте truncate
, которая делает то же самое, но работает на ZFS.
sudo truncate -s 8G /swapfile
sudo chmod 600 /swapfile
sudo swapon /swapfile
По-прежнему показывает: swapon: /swapfile: пропускает — похоже, там есть дыры.
ls -lsh /swapfile
Отчеты 512 -rw------- 1 root root 8.0G Jan 17 18:27 /swapfile
показывают, что созданный файл занимает всего 512 байт вместо 8 ГБ.
Ваши настройки сжатия для файловой системы ZFS, которая будет содержать этот файл, скорее всего, приведут к тому, что вывод dd
в любом случае будет разреженным (занимает гораздо меньше места на диске, чем заявленный размер файла).
sudo dd if=/dev/zero of=/swapfile bs=1M count=8k status=progress
ls -lsh /swapfile
Отчеты 512 -rw-rw-r-- 1 root root 8.0G 17 января 18:39 /swapfile
показывают, что настройки сжатия файловой системы ZFS сделали полный файл размером 8 ГБ размером 512 байт.
Вместо использования сильно сжимаемого ввода в dd
из /dev/zero
вы можете использовать несжимаемый /dev/urandom
так, чтобы он фактически занял до 8 ГБ места на жестком диске. Однако, судя по моим тестам, swapon по-прежнему отклоняет его:
sudo dd if=/dev/urandom of=/swapfile bs=1M count=8k status=progress
sudo chmod 600 /swapfile
sudo swapon /swapfile
Он по-прежнему показывает: swapon: /swapfile: пропускает — похоже, в нем есть дыры.
Еще один эксперимент может состоять в том, чтобы попробовать это в файловой системе ZFS с отключенным сжатием.
sudo zfs create rpool/swap -o compression=off -o mountpoint=/swap/
sudo dd if=/dev/zero of=/swap/swapfile bs=1M count=8k status=progress
И на этот раз он действительно записывает все 0 на диск.
ls -lsh /swap/swapfile
Это возвращает 8.0G -rw-r--r-- 1 root root 8.0G 17 янв. 18:52 /swap/swapfile
sudo chmod 600 /swap/swapfile
sudo swapon /swap/swapfile
По-прежнему показывает: swapon: /swapfile: пропуск — похоже, что в нем есть дыры.
Мой вывод состоит в том, что я не могу сказать, есть ли способ обойти его отказ использовать файл, расположенный в файловой системе ZFS, в качестве файла подкачки.
Вне рамок этого вопроса альтернативой использованию пространства подкачки в этой системе может быть раздел подкачки (который, как я вижу, у вас уже есть раздел подкачки 590 МБ
или помещение файла подкачки на файловая система, отличная от ZFS, например, в разделе ext4, или если на диске нет места, используйте Zswap (сжатые блоки ОЗУ, используемые в качестве пространства подкачки) или vramfs (пространство подкачки, которое находится на оперативной памяти вашей видеокарты).
Я думаю, что Вы хотите, на самом деле хорошо документируется на страница
ZFSOnlinux TLDR;
# To set swap on a zfs drive:
zfs create -V 8G -b $(getconf PAGESIZE) -o logbias=throughput -o sync=always -o primarycache=metadata -o com.sun:auto-snapshot=false VMs/swap
mkswap -f /dev/zvol/VMs/swap
swapon /dev/zvol/VMs/swap
# IN FSTAB
/dev/zvol/VMs/swap none swap discard 0 0