Um script em bash para criação de um aquivo swap (swapfile) - atualizado

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
15 curtidas

Ótima iniciativa. Parabéns. Ademais, recomendo que coloque a tag “Eu que fiz” e “Desenvolvimento” nessa postagem.

1 curtida

muito bom!

script atualizado

1 curtida

atualizado…

apenas modificando texto

1 curtida

Obrigado, funcionou perfeitamente aqui. :grin:

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
5 curtidas

Sabia que precisaria desse tópico mais cedo ou mais tarde. Acabei de rodar o Arch e funcionou perfeitamente.

2 curtidas