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 para Denis Falqueto Cancelar resposta

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

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.