Migração de disco, lvm, criptografia e configurações de serviços

Nos últimos dias o pendrive que estava utilizando como disco principal no meu NAS começou a corromper o sistema após atualizações, creio que o cupado seja o journal do filesystem porém não tive muita paciência para descobrir a real causa, resolvi migrar para um disco do NAS.

Hoje o meu NAS contém um HDD de 250GB e 2 HDDs de 1TB.
Resolvi migrar para o de 250GB e montar um esquema de particionamento mais elaborado, além de usar LVM e Criptografia nos discos extras.

Com o sistema ainda rodando no pendrive, realizei os seguintes passos para migrar de disco.

Reparticionei o disco criando duas partições, uma para o boot e outro para a LVM:
# cfdisk /dev/sdb

Criei um volume físico para LVM:
# pvcreate /dev/sdb2

Verifiquei se foi criado corretamente:
# pvdisplay

Criei o volume lógico e o esquema de particionamento na LVM:
# vgcreate LogVolSystem /dev/sdb2
# lvcreate -L 2G LogVolSystem -n root
# lvcreate -L 2G LogVolSystem -n swap
# lvcreate -L 4G LogVolSystem -n opt
# lvcreate -L 2G LogVolSystem -n tmp
# lvcreate -L 4G LogVolSystem -n usr
# lvcreate -L 4G LogVolSystem -n var
# lvcreate -l 100%FREE LogVolSystem -n home

Formatei as partições e ativei a swap:
# mkfs.ext4 -m 1 -L BOOT /dev/sdb1
# mkfs.ext4 -m 1 -L ROOT /dev/mapper/LogVolSystem-root
# mkfs.ext4 -m 1 -L OPT /dev/mapper/LogVolSystem-opt
# mkfs.ext4 -m 1 -L TMP /dev/mapper/LogVolSystem-tmp
# mkfs.ext4 -m 1 -L USR /dev/mapper/LogVolSystem-usr
# mkfs.ext4 -m 1 -L VAR /dev/mapper/LogVolSystem-var
# mkfs.ext4 -m 1 -L HOME /dev/mapper/LogVolSystem-home
# mkswap -c -L SWAP /dev/mapper/LogVolSystem-swap
# swapon /dev/mapper/LogVolSystem-swap

O esquema ficou da seguinte forma:
/boot : 500MB
/ : 2GB
SWAP : 2GB (Não mais que isso, a regra de 2x a RAM serve para servidores com menos de 1 GB)
/home : O restante livre na LVM (210GB)
/opt : 4GB
/tmp : 2GB em ext4
/usr : 4GB em ext4
/var : 4GB ou mais se disponível em ext4

Agora começando o procedimento de instalação:
# mount /dev/mapper/LogVolSystem-root /mnt/new/

Criando os diretório necessários:
# mkdir -p /mnt/new/{boot,home,opt,usr,var}
# mkdir -m 0755 -p /mnt/new/{dev,run,etc}
# mkdir -m 1777 -p /mnt/new/tmp
# mkdir -m 0555 -p /mnt/new/{sys,proc}

# mount /dev/sdb1 /mnt/new/boot/
# mount /dev/mapper/LogVolSystem-home /mnt/new/home/
# mount /dev/mapper/LogVolSystem-opt /mnt/new/opt/
# mount /dev/mapper/LogVolSystem-tmp /mnt/new/tmp/ -o strictatime,nodev,nosuid,noexec
# mount /dev/mapper/LogVolSystem-usr /mnt/new/usr/
# mount /dev/mapper/LogVolSystem-var /mnt/new/var/

# mount -t proc proc /mnt/new/proc -o nosuid,noexec,nodev
# mount -t sysfs sys /mnt/new/sys -o nosuid,noexec,nodev
# mount -t devtmpfs udev /mnt/new/dev -o mode=0755,nosuid
# mount -t devpts devpts /mnt/new/dev/pts -o mode=0620,gid=5,nosuid,noexec
# mount -t tmpfs shm /mnt/new/dev/shm -o mode=1777,nosuid,nodev,noexec
# mount -t tmpfs run /mnt/new/run -o nosuid,nodev,mode=0755

Criando os diretórios para o pacman:
# mkdir -m 0755 -p /mnt/var/{cache/pacman/pkg,lib/pacman,log}

Como já tinha os pacotes necessários instalados no pendrive, executei o seguinte comando e tirei os pacotes que instalei do AUR (hydra, spindown e plexmediaserver:
# pacman -Syuw –noconfirm
# pacman -Qq > all_pkgs.txt
# for PKG in `cat all_pkg.txt`; do pacman -r /mnt/new/ -Sy –noconfirm $PKG; done
# cp -a /etc/pacman.d/gnupg /mnt/new/etc/pacman.d/

Entrei no chroot:
# cd /mnt/new/
# chroot /mnt/new /bin/bash

Gerei e editei o fstab:
# genfstab -U / >> etc/fstab
# vim etc/fstab

/proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
/sys /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
udev /dev devtmpfs rw,nosuid,relatime,size=3980200k,nr_inodes=995050,mode=755 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
shm /dev/shm tmpfs rw,nosuid,nodev,noexec,relatime 0 0
/run /run tmpfs rw,nosuid,nodev,relatime,mode=755 0 0

# /dev/mapper/LogVolSystem-root LABEL=ROOT
UUID=67c5e549-41a5-43e4-a1e1-32b9c380f469 / ext4 rw,relatime,data=ordered 0 1
# /dev/sdd1 LABEL=BOOT
UUID=9a3e36d1-a24c-4743-8ac6-f8e7ba047a51 /boot ext4 rw,relatime,data=ordered,noexec,nosuid,nodev 0 2
# /dev/mapper/LogVolSystem-home LABEL=HOME
UUID=63eb7f5a-5369-4cb9-a4d7-393da0be62ee /home ext4 rw,relatime,data=ordered,noexec,nosuid,nodev 0 2
# /dev/mapper/LogVolSystem-opt LABEL=OPT
UUID=eab28e23-4ae5-4a1b-a546-4cc920f0a5b0 /opt ext4 rw,relatime,data=ordered,noexec,nosuid,nodev 0 2
# /dev/mapper/LogVolSystem-tmp LABEL=TMP
UUID=6026ccce-f644-4ff3-bd5b-85faacfc676d /tmp ext4 rw,relatime,data=ordered,noexec,nosuid,nodev 0 2
# /dev/mapper/LogVolSystem-usr LABEL=USR
UUID=f57142e7-f4a7-4d06-826d-c0d1d4a31d27 /usr ext4 rw,relatime,data=ordered,nodev 0 2
# /dev/mapper/LogVolSystem-var LABEL=VAR
UUID=d509ba62-493e-435d-95f5-f34d0b2a77e2 /var ext4 rw,relatime,data=ordered,nodev 0 2
# /dev/mapper/LogVolSystem-swap LABEL=SWAP
UUID=8873920c-f4d3-4f46-8877-bacfc37f959f none swap defaults,pri=-2 0 0

Editei a configuração de rede:
# vim /etc/netctl/eth0

Description=’A basic static ethernet connection’
Interface=eth0
Connection=ethernet
IP=static
Address=(‘192.168.1.10/24’)
#Routes=(‘192.168.0.0/24 via 192.168.1.2′)
Gateway=’192.168.1.1’
DNS=(‘192.168.1.1’)

## For IPv6 autoconfiguration
#IP6=stateless

## For IPv6 static address configuration
#IP6=static
#Address6=(‘1234:5678:9abc:def::1/64’ ‘1234:3456::123/96’)
#Routes6=(‘abcd::1234′)
#Gateway6=’1234:0:123::abcd’

Para garantir que o nome da interface continuasse eth0 precisamos realizar o seguinte passo:
vim /etc/udev/rules.d/80-net-name-slot.rules

# This file masks persistent renaming rules for network devices. If you
# delete this file, /usr/lib/udev/rules.d/80-net-name-slot.rules may
# rename network devices according to ID_NET_NAME_{ONBOARD,SLOT,PATH}
# properties of your network devices, with priority in that order. See
# the output of ‘udevadm test-builtin net_id /sys/class/net/$interface’
# for details on what that new name might be.
#
# http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames

Habilitamos a interface:
# netctl enable eth0

Agora vamos habilitar multi-user e evitamos habilitar o runlevel da interface gráfica:
# systemctl enable multi-user.target

Verificamos o que tem para iniciar com o sistema:
# ls -l /etc/systemd/system/multi-user.target.wants/

Popular a chaves do pacman:
# pacman-key –init
# pacman-key –populate archlinux

Configurando o sistema:
# vim /etc/hosts

127.0.0.1 archNAS.localdomain archNAS

# vim /etc/hostname

archNAS

# vim /etc/vconsole.conf

KEYMAP=br-abnt2
FONT=
FONT_MAP=
FONT_UNIMAP=

# vim /etc/locale.gen

en_US.UTF-8 UTF-8
en_US ISO-8859-1
pt_BR.UTF-8 UTF-8
pt_BR ISO-8859-1

# vim /etc/locale.conf

LANG=en_US.UTF-8
LC_MESSAGES=C
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_US.UTF-8
LC_COLLATE=en_US.UTF-8
LC_MONETARY=en_US.UTF-8
LC_MESSAGES=en_US.UTF-8
LC_PAPER=en_US.UTF-8
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
LC_ALL=en_US.UTF-8

# locale-gen
# ln -s /usr/share/zoneinfo/America/Maceio /etc/localtime
# vim /etc/timezone

America/Maceio

# vim /etc/adjtime

0.000000 1358104440 0.000000
1358104440
UTC

Agora vamos ajustar o mkinitcpio para ativarmos a LVM e a partição USR na inicialização do sistema:
# vim /etc/mkinitcpio.conf

HOOKS=”base udev autodetect modconf block lvm2 filesystems keyboard shutdown fsck usr”

Adicione lvm2, entre block e filesystem para ter suporte a LVM e shutdown, fsck e usr (nesta ordem) para ter suporte a partição usr, que está separada, na inicialização.
Dúvidas sobre estas opções, favor verificar este link e este outro.

Gere novamente a imagem do kernel:
# mkinitcpio -p linux

Edite as opções do grub e gere uma nova configuração:
# vim /etc/default/grub

GRUB_DISABLE_LINUX_UUID=false
GRUB_COLOR_NORMAL=”light-blue/black”
GRUB_COLOR_HIGHLIGHT=”light-cyan/blue”

# grub-mkconfig -o /boot/grub/grub.cfg
# grub-install –recheck /dev/sdb

Mude a senha de root, ajustando permissão no /rooot e copie os arquivos do skel:
# passwd
# chmod 750 /root
# cp -a /etc/skel/.bash* ~/

Agora limite o tempo (em segundos) que o root pode ficar sem digitar nenhum comando e faça logout automático:
# vim .bashrc

TMOUT=60

Crie o usuário e sete uma senha:
# useradd -d /home/leandrocarvalho -k /etc/skel -m -s /bin/bash leandrocarvalho
# passwd leandrocarvalho

Copie o que precisar do outro sistema:
# cp -a /usr/local/sbin/* /mnt/new/usr/local/sbin/
# cp -a /usr/local/bin/* /mnt/new/usr/local/bin/
# cp -a /var/lib/transmission/ /mnt/new/var/lib/

Agora saia do chroot e reboot para entrar já com o novo sistema:
# ^D
# reboot

Agora vamos a configuração dos serviços.
SSH:
# vim /etc/ssh/sshd_config

Port 8822
PermitRootLogin no
AuthorizedKeysFile .ssh/authorized_keys
ChallengeResponseAuthentication no
UsePAM yes
PrintMotd no # pam does that
UsePrivilegeSeparation sandbox # Default for new installations.
Subsystem sftp /usr/lib/ssh/sftp-server
AllowUsers leandrocarvalho

# systemctl enable sshd.service
# systemctl start sshd

NOIP:
# noip2 -C
# systemctl enable noip2.service
# systemctl start noip2

Smartmontools:
# systemctl enable smartd.service
# systemctl start smartd

HDDTEMP:
# systemctl enable hddtemp.service
# systemctl start hddtemp

Instale o spindo do AUR e faça:
# systemctl enable spindown
# vim /etc/spindown.conf

[General]
cycle-time = 60 # Number of seconds between cycles.

idle-time = 3600 # The time in seconds a disk has to be idle before it is spundown.
# Do not use a value that is to small (less than 3600) unless you
# know what you are doing.

syslog = 0 # Turn this on if you want spindown to log messages using syslog.
# You will not want to turn this on if you are trying to spindown
# the disk with the root filesystem on.
[Disk 0]
#id = ata-VB0250EAVER_Z2AYARBD
name = sda
spindown = 1
command = hdparm -y

[Disk 1]
#id = ata-SAMSUNG_HD103SJ_S2NWJ50BB01403
name = sdb
spindown = 1
command = hdparm -y

[Disk 2]
#id = ata-Hitachi_HDT721010SLA360_STF604MR28AR1P
name = sdc
spindown = 1
command = hdparm -y

Ajuste o service, pois o que vem no pacote não funciona adequadamente.
# vim /usr/lib/systemd/system/multi-user.target.wants/spindown.service

[Unit]
Description=Spindown Daemon
After=syslog.target

[Service]
Type=forking
ExecStart=/sbin/spindownd -d -f /run/spindown/spindownd.fifo -c /etc/spindown.conf -p /run/spindown/spindownd.pid
PIDFile=/run/spindown/spindownd.pid

[Install]
WantedBy=multi-user.target

# systemctl start spindown

Samba:
# vim /etc/samba/smb.conf

[global]
workgroup = archNAS
server string = Arch Linux Network Attached Storage
security = user
encrypt passwords = yes
hosts allow = 192.168.1. 127.
log file = /var/log/samba/%m.log
max log size = 50
dns proxy = no
follow symlinks = yes
wide links = yes
unix extensions = no
syslog = 1
load printers = no
show add printer wizard = no
printcap name = /dev/null
disable spoolss = yes

# Acesso Irrestrito
[home]
comment = Home NAS
path = /home/leandrocarvalho
valid users = leandrocarvalho
force users = leandrocarvalho
public = no
browseable = no
writable = yes
printable = no
guest ok = no

[disk1]
comment = Disco 1 – 1TB
path = /mnt/disk1
valid users = leandrocarvalho
force users = leandrocarvalho
public = no
browseable = no
writable = yes
printable = no
guest ok = no

[disk2]
comment = Disco 2 – 1TB
path = /mnt/disk2
valid users = leandrocarvalho
force users = leandrocarvalho
public = no
browseable = no
writable = yes
printable = no
guest ok = no

# systemctl enable smbd.service
# smbpasswd -a leandrocarvalho
# systemctl start smbd

Instale o plex do AUR e configure:
# systemctl enable plexmediaserver.service
# vim /etc/conf.d/plexmediaserver

PLEX_MEDIA_SERVER_USER=leandrocarvalho
PLEX_MEDIA_SERVER_HOME=/usr/lib/plexmediaserver

# the number of plugins that can run at the same time
PLEX_MEDIA_SERVER_MAX_PLUGIN_PROCS=10

# ulimit -s $PLEX_MEDIA_SERVER_MAX_STACK_SIZE
PLEX_MEDIA_SERVER_MAX_STACK_SIZE=3000

# where the mediaserver should store the transcodes
PLEX_MEDIA_SERVER_TMPDIR=/home/leandrocarvalho/plexmediaserver/tmp

# uncomment to set it to something else
PLEX_MEDIA_SERVER_APPLICATION_SUPPORT_DIR=”$(awk -F: -v v=${PLEX_MEDIA_SERVER_USER} ‘{if ($1==v) print $6}’ /etc/passwd)/plexmediaserver/var/lib/plexmediaserver”

# systemctl start plexmediaserver

Transmission:
# vim /var/lib/transmission/.config/transmission-daemon/settings.json

“rpc-username”: “leandrocarvalho”,
“rpc-whitelist”: “127.0.0.1, 192.168.1.*, 201.65.63.114, 177.47.181.76”,

# gpasswd -a transmission users
# gpasswd -a leandrocarvalho users
# gpasswd -a leandrocarvalho transmission
# systemctl start transmission

VSFTPD:
# vim /etc/vsftpd.conf

anonymous_enable=YES
anon_root=/mnt/disk1/temp
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
listen=YES

# systemctl start vsftpd

LVM e Criptografia nos outros discos:

# cfdisk /dev/sdb
# cryptsetup luksFormat /dev/sdb1
# cryptsetup luksDump /dev/sdb1
# cryptsetup luksOpen /dev/sdb1 disk1
# ls -a /dev/mapper/
# pvcreate /dev/mapper/disk1
# pvdisplay
# vgcreate LogVolDisk1 /dev/mapper/disk1
# vgdisplay
# lvcreate -l 100%FREE LogVolDisk1 -n lvdisk1
# lvdisplay
# mkfs.ext4 -m 1 -L Disk1 /dev/LogVolDisk1/lvdisk1
# mount /dev/LogVolDisk1/lvdisk1 /mnt/disk1/
# chown -R leandrocarvalho: /mnt/disk1

Se precisar adicione encrypt antes de block, para as partições criptografadas serem inicializadas juntas com o sistema.

# vim /etc/mkinitcpio.conf

HOOKS=”base udev … encrypt block lvm2 filesystems”

Alguns erros foram encontrados durante o boot, seguem os erros e soluções:

ERROS:
1. ERST: Failed to get Error Log Address Range
2. i8042: No controller found
3. ../source3/printing/print_cups.c:151(cups_connect)
../source3/printing/print_cups.c:528(cups_async_callback)
failed to retrieve printer list: NT_STATUS_UNSUCCESSFUL
Unable to connect to CUPS server /var/run/cups/cups.sock:631 – No such file or directory
4. Ignoring unknown parameter “force users”
5. tsc: Fast TSC calibration failed
6. Device: /dev/sdc [SAT], WARNING: A firmware update for this drive may be available,
see the following Seagate web pages:
http://knowledge.seagate.com/articles/en_US/FAQ/207931en
http://knowledge.seagate.com/articles/en_US/FAQ/223651en
7. ata6.00: failed to enable AA (error_mask=0x1)

SOLUÇÕES

1. http://h20000.www2.hp.com/bizsupport/TechSupport/Document.jsp?objectID=c03731635&lang=en&cc=us&taskId=101&prodSeriesId=5268290&prodTypeId=15351
2. Como não existe PS2 no computador esta mensagem é apresentada no log
3. Adicionado as opções:
load printers = no
show add printer wizard = no
printcap name = /dev/null
disable spoolss = yes
4. Mudando de “force users” para “force user”
5. Erro intermitente, não ocorre em todos os boots.
Mas esse problema pode ser resolvido com este link:
http://penguintengil.wordpress.com/2012/11/03/solving-error-0-000000-fast-tsc-calibration-failed-when-booting-in-fedora-16/
6. Precisa atualizar o firmware do HDD
7. Adicionar estas opções na linha do kernel no grub: “ide0=noprobe ide1=noprobe”

Caso você tenha alguma sugestão ou crítica, favor colocar nos comentários.

One comment

  1. Denis Falqueto disse:

    Leandro, muito legal esse artigo! Certamente vai me servir de referência no meu futuro servidor que to sonhando em montar aqui em casa 🙂

    Só gostaria de deixar uma observação: na configuração do spindown, você alterou o arquivo /usr/systemd/system/multi-user.target.wants/spindown.service.

    O local em que você colocou o arquivo não é o ideal, pois a ideia do diretório /usr/systemd é manter arquivos que são originados da distribuição que você está usando.

    O ideal seria você colocar o novo serviço em /etc/systemd/system e habilitá-lo com

    # systemctl enable spindown.service

    A linha WantedBy do serviço já vai adicioná-lo no diretório .wants correto. Além disso, é possível usar o comando systemd-delta pra ver quais alterações você implementou em relação aos arquivos originais da sua distribuição. Eu acho isso uma ótima forma de documentar as alterações.

    Abraço!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *