Segue um script que fiz para criar um arquivo swap
Cria um arquivo do tamanho que você quer
Detecta se é um btrfs
Insere automaticamente no fstab
#!/bin/bash
# Criar arquivo swap 0.3
echo "Iniciando criação do swapfile, insira sua senha sudo para continuar o processo"
[ "$UID" != 0 ] && SUDO=sudo
FORMATO=`awk '$2 == "/" {print $3}' /etc/fstab`
if [[ $FORMATO == "btrfs" ]]; then
$SUDO truncate -s 0 /swapfile
$SUDO chattr +C /swapfile
$SUDO btrfs property set /swapfile compression none
echo "Criando um arquivo de tamanho zero, definindo o atributo No_COW nele com chattr e verificando se a compactação está desabilitada"
fi
while read -p "Insira o tamanho do arquivo em giga (numero inteiro)" -a TAMANHO ; do
[[ "$TAMANHO" -ge 1 ]] && break
[[ "$TAMANHO" = [a-z]* ]] && continue
done
DEFINIDO=$(( $TAMANHO*1024 ))
echo "Usando dd para criar um arquivo de troca do tamanho da sua escolha"
$SUDO dd if=/dev/zero of=/swapfile bs=1M count="$DEFINIDO" status=progress
echo "Definido as permissões"
$SUDO chmod 600 /swapfile
echo "Formatando o arquivo"
$SUDO mkswap /swapfile
echo "Ativando o arquivo swap"
$SUDO swapon /swapfile
echo "Definido no fstab"
echo "/swapfile none swap defaults 0 0" | $SUDO tee -a /etc/fstab
Aproveitando a deixa, um script que automatiza a hibernação com swapfile.
Ele basicamente faz o procedimento listado na Arch Wiki. Não sei se funciona em outras distros.
Aviso: não rola com LVM, e Btrfs requer uns trecos meio complicados para achar a localização real do arquivo no disco (que é necessária para hibernar).
#!/bin/sh
if [ ! -f /swapfile ]; then
echo ":: Você não tem um swapfile no lugar certo!"
exit 1
fi
if [ ! "$(id -u)" = 0 ]; then
echo ":: Não tenho root. Chamando sudo."
exec sudo -- "$0"
fi
# Atalho para não ter que digitar isso muitas vezes
alias fsinfo='findmnt -T / -no'
# Obter tipo de arquivo
FSTYPE=$(fsinfo fstype)
# Detectar se temos um update-grub pronto
UPDATE_GRUB='update-grub'
if test ! -x "$(command -v "$UPDATE_GRUB")" 2>/dev/null; then
UPDATE_GRUB='grub-mkconfig -o /boot/grub/grub.cfg'
fi
case "$FSTYPE" in
(btrfs|zfs)
echo >&2 "Hiberanação em swapfile em $FSTYPE é possível, mas não é suportada por essa ferramenta."
;;
(*)
LSBLK=$(fsinfo 'MAJ:MIN')
UUID=$(fsinfo UUID)
OFFSET="$(filefrag -v /swapfile | awk '$1 == "0:" { print $4+0; exit}')"
(
set -exf
: 'Adicionando parâmetros à inicialização do kernel.'
sed -E -e '
/^GRUB_CMDLINE_LINUX_DEFAULT=/ {
# Remover informações antigas de swap
s/resume(_offset)?=[^[:space:]]*//g
# Acrescentar novas
s/\s*"?\s*$/ resume=UUID='"$UUID"' resume_offset='"$OFFSET"'"/
}
' -i.bak /etc/default/grub
: 'Restaure /etc/default/grub.bak se houver erros.'
: 'Regerando a configuração do GRUB...'
$UPDATE_GRUB
: 'Permitindo a hibernação agora...'
echo $LSBLK > /sys/power/resume
echo "$OFFSET" > /sys/power/resume_offset
: 'Adicionando RESUME no initramfs.'
if [ -f /etc/mkinitcpio.conf ]; then
if [ ! "$(sed -n '/^HOOKS=/{/resume/p}' /etc/mkinitcpio.conf)" ]; then
sed -i.bak '/^HOOKS=/s/udev/udev resume/' /etc/mkinitcpio.conf
mkinitcpio -P
: 'Restaure /etc/mkinitcpio.conf.bak se houver problemas.'
else
: 'Sua mkinitcpio já está configurada para resume.'
fi
else
: 'Sua distribuição possui um outro esquema de configuração para initramfs.'
: 'Infelizmente só sei usar o do Arch Linux.'
fi
) || echo >&2 ':: Houve um erro!'
;;
esac