sábado, 22 de dezembro de 2012

Servidor PXE

A utilização de um servidor PXE numa rede permitirá que os clientes da rede possam arrancar através da rede. Isto permitirá por exemplo:

  • fazer instalações por rede;
  • utilizar o Clonezilla Live para fazer o upload/download de imagens de discos;
  • executar ferramentas de teste: memtest;
  • executar LiveCD por rede;
  • etc...

0. Resumo

  • Servidor com ubuntu server 12.04 LTS
  • Instalação do serviço TFTP
  • Configuração do serviço DHCP para suporte ao arranque por PXE

1. Instalação

O serviço TFTP pode ser instalado a partir de vários pacotes, contudo o que melhor suporte dá ao pxelinux é o tftpd-hpa [www].
sudo aptitude install tftpd-hpa
O ficheiro de configuração por defeito pode ser editado para confirmar os diretórios a utilizar pelo servidor TFTP:
sudo nano /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

Neste caso o diretório será: /tftpboot

1. Instalação

Como o serviço vai necessitar de vários ficheiros, será criada a seguinte estrutura de ficheiros e diretórios para melhor os organizar:
/tftpboot/
|-- pxelinux.0

|-- pxelinux.cfg/
    |-- default
    |-- local.cfg

    |-- menu.conf
    |-- splash.png

    |-- vesamenu.c32

|-- install/
    |-- install.cfg

    |-- ubuntu_12.04/
        |-- amd64

        |-- i386/ 

|-- live/
    |-- live.cfg
    |-- core/

|-- utils

    |-- utils.cfg

    |-- memtest/
    |-- clonezilla/

        |-- amd64

        |-- i486 


Os ficheiros .cfg serão criados de forma a permitir ter as opções de arranque necessárias.
Cada diretório está destinado a um tipo de utilização que pode conter diversos sistemas. Em cada sistema poderá existir depois uma separação por arquitetura (i386, amd64, etc).

É necessário obter então os ficheiros necessários ao arranque por PXE:
wget http://archive.ubuntu.com/ubuntu/dists/precise/main/installer-i386/current/images/netboot/netboot.tar.gz

tar -zxvf netboot.tar.gz

sudo mv ubuntu-installer/i386/pxelinux.0 /tftpboot
sudo mv ubuntu-installer/i386/boot-screens/syslinux.cfg /tftpboot/pxelinux.cfg/default
sudo mv ubuntu-installer/i386/boot-screens/* /tftpboot/pxelinux.cfg/
rm -r ubuntu-installer/i386/boot-screens

rm -r ubuntu-installer/i386/pxelinux.cfg

sudo mv ubuntu-installer/i386 /tftpboot/install/ubuntu_12.04/

A partir daqui toda a configuração será feita nos ficheiros existentes em /tftpboot/pxelinux.cfg/:
sudo nano pxelinux.cfg/default
include pxelinux.cfg/menu.cfg
default pxelinux.cfg/vesamenu.c32
prompt 0
timeout 0





2. Configurar servidor DHCP

É necessário adicionar:
allow booting;
allow bootp;

next-server 192.168.2.101;
filename "pxelinux.0";


3. Personalização

3.1 INCLUDE
Permite incluir o conteúdo de outro ficheiro de configuração no local em que é invocado.

3.2 LABEL
String que descreve o kernel e as opções, tem que ser único depois de convertido para um nome de ficheiro DOS (8 caracteres mais extensão).
Pode ser seguida de diversos comandos.

KERNEL - indica o ficheiro que vai arrancar.
Em alternativa pode ser utilizado:
LINUX image - para arrancar uma imagem de kernel linux
BOOT image - para arrancar um bootstrap (.bs ou .bin)
FDIMAGE image - para arrancar uma floppy disk image (.img)
CONFIG file - para reiniciar o bootloader com um ficheiro de configuração diferente.

APPEND - permite adicionar opções ao comando do kernel.

INITRD initrd_file - permite definir um initrd ou vários, separados por vírgulas.

LOCALBOOT 0 - permite arrancar o disco local.


3.3 DEFAULT
Indica o comando por defeito introduzido no boot:.

3.4 Módulos para User Interface
Podem ser selecionados diferentes modos de interface: menu.c32 ou vesamenu.c32)

PROMPT flag - caso a flag seja 1, mostra sempre o prompt de boot:; caso a flag seja 0, apenas mostra o prompt de boot: se for pressionada a tecla Shift ou Alt.

NOESCAPE flag - caso a flag seja 1, ignora as teclas para mostrar ao prompt de boot; caso a flag seja 0 e esteja definido PROMPT 0, será arrancado boot definido por default.

NOCOMPLETE flag - caso a flag seja 1, a tecla 'tab' não mostra as labels definidas no prompt de boot:.

ALLOWOPTIONS flag - por defeito a flag é 1, e permite carregar as opções definidas no APPEND; caso a flag seja 0 o utilizador não poderá especificar qualquer opção.

TIMEOUT timeout - Indica quanto tempo pausa no prompt de boot, a unidade é 1/10 segundos. O timeout é cancelado quando se pressiona qualquer tecla. Por defeito é 0 o que indica que não tem qualquer timeout.

SAY mensagem - apresenta a mensagem no ecrã.

DISPLAY filename - Apresenta o ficheiro indicado no arranque antes do prompt de boot:.
F1 filename
F2 filename
...etc...
F9 filename
F10 filename
F11 filename
F12 filename

A imagem splash.png tem que ter a resolução 640x480 e o modo de cor indexado com 256 cores.

quarta-feira, 19 de dezembro de 2012

Raspbian - Rpi

Raspbian é um sistema operativo baseado na versão wheezy do Debian GNU/Linux e especialmente adaptado ao Raspberry Pi.

1. Instalação

1.1. Obter a imagem do Raspbian

É possível obter a imagem a partir do site do Raspberry: http://www.raspberrypi.org/downloads

1.2. Gravar a imagem Raspbian num cartão SD

Neste caso foi utilizado um cartão SDHC Samsung 8GB Categoria 6.
O processo de gravação da imagem é relativamente rápido, menos de 5 minutos.
dd bs=4M if=2012-12-16-wheezy-raspbian.img of=/dev/sdb

Tue Dec 18 16:22:03 WET 2012
462+1 records in 462+1 records out 1939865600 bytes (1.9 GB) copied, 286.539 s, 6.8 MB/s
Tue Dec 18 16:26:49 WET 2012

2. Utilização

Depois de introduzir o SD no Raspberry Pi basta arrancar o mesmo e realizar os passos de configuração inicial que permitirão definir as opções mais comuns, incluindo o arranque automático do ambiente gráfico.

2.1. Autenticação

Os dados de acesso por defeito são:
utilizador: pi
palavra-passe: raspberry

3. Resolução de Problemas

3.1. Problemas com a deteção do teclado

Apesar da na instalação o teclado Logitech K400 ter sido detetado corretamente, nos arranques normais nem sempre era detetado (75% das vezes).

A resolução do problema passa por desligar/ligar o recetor USB do Rpi.

Para uma solução permanente sem esta necessidade, basta seguir os passos do Jan Karger aqui.

Editar o ficheiro /etc/rc.local
sudo nano /etc/rc.local

E acrescentar a seguinte linha antes do exit 0
sleep 5
rmmod hid-logitch-dj
modprobe hid-logitech-dj

3.2. Problemas com o layout do teclado

Apesar de corretamente definido no sistema, no ambiente gráfico LXDE o layout não era reconhecido.
A solução passa por editar o ficheiro /etc/xdg/lxsession/LXDE/autosatart e no final acrescentar a linha:
setxkbmap -layout "pt"

sexta-feira, 14 de dezembro de 2012

Configurações pxelinux

Comandos Principais


INCLUDE

Permite incluir o conteúdo de outro ficheiro de configuração no local em que é invocado.

LABEL

String que descreve o kernel e as opções, tem que ser único depois de convertido para um nome de ficheiro DOS (8 caracteres mais extensão).
Pode ser seguida de diversos comandos.
Para não conter nenhum valor colocar o símbolo '-' (LABEL - ).

KERNEL

Define o ficheiro que vai arrancar.
Em alternativa podem ser utilizadas outras designações para situações específicas:
LINUX image - para arrancar uma imagem de kernel linux
BOOT image - para arrancar um bootstrap (.bs ou .bin)
FDIMAGE image - para arrancar uma floppy disk image (.img)
CONFIG file - para reiniciar o bootloader com um ficheiro de configuração diferente.

APPEND

Permite adicionar opções ao comando do kernel.

INITRD initrd_file

Permite definir um initrd ou vários, separados por vírgulas.

LOCALBOOT 0

Permite arrancar o disco local.

Módulos para User Interface

Podem ser selecionados diferentes modos de interface: menu.c32 ou vesamenu.c32.

PROMPT flag - caso a flag seja 1, mostra sempre o prompt de boot:; caso a flag seja 0, apenas mostra o prompt de boot: se for pressionada a tecla Shift ou Alt.

NOESCAPE flag - caso a flag seja 1, ignora as teclas para mostrar ao prompt de boot; caso a flag seja 0 e esteja definido PROMPT 0, será arrancado boot definido por default.

NOCOMPLETE flag - caso a flag seja 1, a tecla 'tab' não mostra as labels definidas no prompt de boot:.

ALLOWOPTIONS flag - por defeito a flag é 1, e permite carregar as opções definidas no APPEND; caso a flag seja 0 o utilizador não poderá especificar qualquer opção.

TIMEOUT timeout - Indica quanto tempo pausa no prompt de boot, a unidade é 1/10 segundos. O timeout é cancelado quando se pressiona qualquer tecla. Por defeito é 0 o que indica que não tem qualquer timeout.

ONTIMEOUT tagname - Ao atingir o timeout arranca a tagname indicada.

SAY message - apresenta a mensagem no ecrã.

DISPLAY filename - Apresenta o ficheiro indicado no arranque antes do prompt de boot:.
É possível indicar os ficheiros associados a cada uma das teclas de função: F1 a F10 da seguinte forma:
F1 filename
F2 filename
...etc...
F9 filename
F10 filename
F11 filename
F12 filename

Menus

MENU TITLE title

Permite especificar o título de um menu, no topo deste e ao centro

MENU BEGIN [tagname] | MENU END

Permite criar um menu, opcionalmente com uma designação definida em tagname. O conteúdo do menu estará entre as linhas MENU BEGIN e MENU END.

MENU LABEL label

Apenas válido após um comando LABEL anterior. Permite alterar o texto apresentado para um entrada do menu e definir a tecla de atalho através do símbolo ^.
Ao contrário das LABEL normais, estas não precisam de ser únicas.

MENU SEPARATOR

Insere uma linha em branco.

MENU INDENT count

Permite colocar count espaços antes.

MENU DISABLE

Define a entrada como não selecionável. Útil para criar secções.

MENU DEFAULT

Define a entrada como a selecionada por defeito.

TEXT HELP | ENDTEXT

Permite colocar várias linhas de texto de ajuda entre a linha que contém TEXT HELP e a que contém ENDTEXT

MENU EXIT [tagname]

Permite sair do menu para o menu anterior ou para o menu com o nome definido em tagname.

MENU GOTO tagname

Permite ir para o menu com o nome definido em tagname.

MENU BACKGROUND background

Define a imagem de fundo.

MENU COLOR element ansi foreground background shadow

Permite especificar as cores a utilizar por cada um dos elementos:
  • element
screen Rest of the screen
border Border area
title Title bar
unsel Unselected menu item
hotkey Unselected hotkey
sel Selection bar
hotsel Selected hotkey
disabled Disabled menu item
scrollbar Scroll bar
tabmsg Press [Tab] message
cmdmark Command line marker
cmdline Command line
pwdborder Password box border
pwdheader Password box header
pwdentry Password box contents
timeout_msg Timeout message
timeout Timeout counter
help Help text
msgXX  Message (F-key) file attribute XX
  • ansi - é uma sequência de valores separadas por ponto-e-vírgula (;):
0 reset all attributes to their defaults
1 set bold
4 set underscore (simulated with color on a color display)
5 set blink
7 set reverse video
22 set normal intensity
24 underline off
25 blink off
27 reverse video off
30 set black foreground
31 set red foreground
32 set green foreground
33 set brown foreground
34 set blue foreground
35 set magenta foreground
36 set cyan foreground
37 set white foreground
38 set underscore on, set default foreground color
39 set underscore off, set default foreground color
40 set black background
41 set red background
42 set green background
43 set brown background
44 set blue background
45 set magenta background
46 set cyan background
47 set white background
49 set default background color

  • background e foreground são valores na forma #AARRGGBB - AA alpha, RR red, GG green e BB blue.
    Onde #00000000 é totalmente transparente e #ffffffff é branco opaco.
  • shadow - permite controlar a sombra com: "none" (sem sombra); "std"|"standard" (foreground mais elevado); "all" (tanto foreground como background estão elevados); "rev"|"reverse" (background mais elevado).
Se qualquer das opções for "*" ou omitida (no final da linha), o seu valor não será alterado.

MENU MSGCOLOR fg_filter bg_filter shadow - permite especificar o mesmo estilo a todas as caixas de mensagem de ajuda.

Posicionamento

Os valores por defeito são os indicados abaixo, que podem ser alterados.
O ecrã tem 80 colunas e 28 linhas (com vesamenu.c32), valores negativos de linha são calculados a partir deste valor.

MENU WIDTH 80
MENU MARGIN 10
MENU PASSWORDMARGIN 3
MENU ROWS 12
MENU TABMSGROW 18
MENU CMDLINEROW 18
MENU ENDROW -1
MENU PASSWORDROW 11
MENU TIMEOUTROW 20
MENU HELPMSGROW 22
MENU HELPMSGENDROW -1
MENU HIDDENROW -2
MENU HSHIFT 0
MENU VSHIFT 0


quarta-feira, 21 de novembro de 2012

Instalação do Cinelerra

Instalação do Cinelerra no Linux Caixa Mágica 18 LTS (baseado em ubuntu 12.04 LTS).

Foi necessário remover o pacote mpeg3-utils para se conseguirem instalar os pacotes de dependência do cinelerra.

Servidor NFS

Ficheiro a editar: /etc/exports

# Partilha para um host específico 192.168.0.2
/srv/images      192.168.0.2/255.255.255.0(no_root_squash,rw,async,no_subtree_check)
# Partilha para a rede
/srv/images      192.168.0.0/255.255.255.0(no_root_squash,rw,async,no_subtree_check)

# Partilha para todas as redes
/srv/images      *(no_root_squash,rw,async,no_subtree_check)
Para carregar as alterações:
# exportfs -ra

quarta-feira, 31 de outubro de 2012

Alteração do nome das interfaces de rede

Por vezes a designação das interfaces de rede de uma máquina não é a mais "correta", podendo ter interfaces salteadas entre elas.

Quando montei um servidor ubuntu 12.04 LTS com LAN onboard e mais três placas PCI, fiquei com a seguinte ordem:

  • eth0 - PCI1
  • eth1 - PCI3
  • eth2 - onboard
  • eth3 - PCI2
Para resolver a situação segui as preciosas instruções do Paolo Iannelli[1]:

  • Editar o ficheiro /etc/udev/rules.d/70-persistent-net.rules
  • Procurar uma linha imensa que começa e depois termina
    SUBSYSTEM=="net", ACTION=="add", (...) KERNEL=="eth1", NAME="eth1"
  • Alterar o valor do eth do NAME para o valor desejado e guardar.
  • Alterar as configurações de rede e afins em conformidade com os novos nomes
  • Reiniciar o serviço de rede

Recursos:

[1] http://www.paoloiannelli.com/2011/05/25/how-to-rename-network-interface-in-ubuntu-debian-suse-linux/ - Página de Paolo Iannelli que explica a alteração da designação das interfaces

terça-feira, 30 de outubro de 2012

iptables - Bloqueio de um cliente NAT

Após muitas pesquisas, nunca consegui resolver este problema:

Utilizando um router linux com iptables e NAT, como bloquear a rede a apenas um cliente.

Vários tutoriais e afins indicam a ação sobre a chain INPUT algo do género:
iptables -A INPUT -s 192.168.x.y -j DROP

Contudo, o cliente continua a enviar e a receber pacotes...

Como dizem que uma imagem vale mais do que mil palavras, só percebi realmente o funcionamento do iptables após, por acaso, deparar-me com um site[1] muito extenso e que no meio continha a seguinte imagem:
Após analisar o fluxo, e efetuar alguns testes, percebi finalmente que depois do NAT os pacotes poderiam ter dois caminhos, e testei o segundo: utilizar a chain FORWARD.

Assim, para bloquear o acesso de um cliente NAT por IP:
iptables -A FORWARD -s 192.168.10.10 -j DROP


Para bloquear o acesso de um cliente NAT por MAC:
iptables -A FORWARD -m mac --mac-source aa:bb:cc:dd:ee:ff -j DROP






Notas:
[1] http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html - Um tutorial muito interessante que permitiu finalmente chegar à solução.
[2] http://www.linuxguruz.com/forum/viewforum.php?f=35 - Coleção de diversos scripts e ligações sobre firewalls

quarta-feira, 11 de julho de 2012

Debian Squeeze + MiniDLNA

Instalação do serviço MiniDLNA num servidor com Debian Squeeze (stable).

0. Pré-requisitos

1. Descarregar o software necessário
2. Instalar dependências e instalar o MiniDLNA
3. Configurar o MiniDLNA
4. Iniciar o MiniDLNA

1. Descarregar o software

Descarregar minidlna_1.0.24_static.tar.gz minidlna_1.0.24_src.tar.gz a partir do site oficial.
O ficheiro static contém o binário e o ficheiro de configuração, o ficheiro com o código fonte (src) é necessário apenas para copiar o script de init.d.

1. Instalar MiniDLNA

1.1. Descarregar código-fonte

Descarregar a última versão a partir de http://sourceforge.net/projects/minidlna/files/minidlna/, extrair e entrar no diretório.

1.2.a. Compilar em ubuntu 10.04 LTS KO - versões muito antigas

1.2.b. Compilar em ubuntu 12.04 LTS OK - funciona!

# apt-get install autopoint
$ sh autogen.sh
Dependências:
# apt-get install libavcodec-dev libavformat-dev libavutil-dev libjpeg-dev libsqlite3-dev libexif-dev libid3tag0-dev libogg-dev libvorbis-dev libflac-dev
$ ./configure
$ make
$ make install

2. Instalar dependências e instalar o MiniDLNA

2.1. Instalar dependências

As dependências necessárias são instaladas através:
# apt-get install libexif12 libjpeg62 libid3tag0 libflac8 libvorbisfile3 sqlite3 libavformat52 libuuid1 gcc

2.2. Instalar o MiniDLNA

  • Descompactar o ficheiro static com:
# tar zxvf minidlna_1.0.24_static.tar.gz
  • Copiar o ficheiro binário:
# cp usr/sbin/minidlna /usr/sbin
  • Copiar o ficheiro de configuração:
# cp etc/minidlna.conf /etc/
  • Descompactar o ficheiro src com:
# tar zxvf minidlna_1.0.24_src.tar.gz
  • Copiar o script para o init.d:
cp minidlna-1.0.24/linux/minidlna.init.d.script /etc/init.d/minidlna
  • Ativar as permissões de execução:
# chmod 755 /etc/init.d/minidlna
  • Adicionar o serviço ao arranque do sistema:
# update-rc.d minidlna defaults

3. Configurar o MiniDLNA

O ficheiro de configuração /etc/minidlna.conf permite especificar o funcionamento do serviço, devendo ser personalizado:
  • Localização da base de dados relativa aos ficheiros e localização do log:
db_dir=/var/cache/minidlna
log_dir=/var/log
  • Modo automático de descoberta de ficheiros:
inotify=yes
  • Pastas a partilhar (é possível especificar diferentes pastas para diferentes tipos de media, conforme é explicado no próprio ficheiro de configuração):
media_dir=/srv/media
  • Nome do servidor na rede
friendly_name=DLNA Server

4. Iniciar o MiniDLNA

Após a instalação e configuração é possível arrancar o serviço com:
# service minidlna start

O primeiro arranque irá demorar algum tempo até estar concluída a indexação dos ficheiros existentes, é possível acompanhar o desempenho através do comando top e esperando que o minidlna deixe de ocupar o processador de forma intensiva.

Após a indexação é possível aceder ao serviço nos dispositivos com suporte para DLNA.

5. Outras opções

  • Para reiniciar o serviço:
# service minidlna restart
  • Para reconstruir a base de dados:
# service minidlna stop
# minidlna -R
# service minidlna start

sábado, 7 de julho de 2012

Proxmox VE v.2 - Software RAID

Instalação do servidor de virtualização Proxmox Virtual Environment versão 2 utilizando software RAID (não suportado nativamente).

Tutorial: petercarrero.com

0. Pré-requisitos:

  1. Instalar software necessário
  2. Preparar os discos para RAID
  3. Colocar /boot em /dev/md0
  4. Mover o PVE LVM para /dev/md1

1. Instalar software necessário

All you really need here is the mdadm package. I also install vim because I like it better than plain vi. On Proxmox VE 1.0 you also needed the initramfs-tools, but this is already installed on VE 2.0. So, to get your system ready, type the following on the command line of your Proxmox setup:
apt-get update; apt-get install mdadm vim

The mdadm package will prompt you for information and all you need to do on that screen is press the ENTER key.

2. Prepare raid devices

Now that you have the right software setup, let's get your raid devices ready. We will copy the partition information from /dev/sda into /dev/sdb, convert the partitions on sdb to raid members, initialize the raid devices and then save the raid configuration on /etc/mdadm/mdadm.conf so it persists after reboot. All that is done with the following 6 lines:
sfdisk -d /dev/sda | sfdisk -f /dev/sdb
sfdisk -c /dev/sdb 1 fd
sfdisk -c /dev/sdb 2 fd
mdadm --create -l 1 -n 2 /dev/md0 missing /dev/sdb1
mdadm --create -l 1 -n 2 /dev/md1 missing /dev/sdb2
mdadm --detail --scan >> /etc/mdadm/mdadm.conf

3. Get /boot ready on /dev/md0

This is by far the step with the most number of commands, but we got quite a bit to do here… It may be possible to shorten some of these steps, but I wasn't successful on my attempts to simplify this and the instructions below worked pretty well for me. Anyway, let's begin by formatting and populating /dev/md0 with the contents of /boot.
mkfs.ext3 /dev/md0
mkdir /mnt/md0
mount /dev/md0 /mnt/md0
cp -ax /boot/* /mnt/md0


Now let's tell our system to use /dev/md0 after the Linux bootstrap (i.e.: grub2 will still use sda1 to boot for now).
vim /etc/fstab

Replace the line that has UUID=<your UUID here> /boot ext3 defaults 0 1 with /dev/md0 /boot ext3 defaults 0 1. If you are unfamiliar with vim, use the arrow keys to navigate to the line above, hit yypi# to make a copy of the old line and then turn the copy into a comment, use the up-arrow to go to the uncommented line, delete all the UUID=bla text and add /dev/md0. After that is done, hit the ESC key, which will take you out of insert mode, then :wq followed by the ENTER key. That will save and quit the file for you. We are now done with vim! Once you are on the command line again, reboot with the following command:
reboot


After the system reboots, let's verify that it is using the md0 device as your /boot mount point by typing the following:
mount|grep boot

You should get something like this:
/dev/md0 on /boot type ext3 (rw)

Now we go on to tell grub to use that device during boot as well on the next 10 commands:
echo '# customizations' >> /etc/default/grub
echo 'GRUB_DISABLE_LINUX_UUID=true' >> /etc/default/grub
echo 'GRUB_PRELOAD_MODULES="raid dmraid"' >> /etc/default/grub
echo raid1 >> /etc/modules
echo raid1 >> /etc/initramfs-tools/modules
grub-install /dev/sda
grub-install /dev/sdb
grub-install /dev/md0
update-grub
update-initramfs -u

Maybe you don't need all 3 grub-install commands, but for me, not having the last one there didn't work and when reverting the process during one of my tests, I ended-up having to reissue the command grub-install /dev/sda.


We are almost done with this step! All that remains to do is make /dev/sda1 part of /dev/md0 and reboot using this config to make sure all is working at it should. We get that done with the following 2 commands:
sfdisk -c /dev/sda 1 fd
mdadm --add /dev/md0 /dev/sda1

This will get /dev/md0 rebuilding, and it shouldn't take long. You can verify the progress of the process with the following command:
watch -n 5 cat /proc/mdstat

Once that is completed, reboot and we are done with this step!
reboot

4. Move the PVE LVM to /dev/md1

Now the process is pretty much similar to the old one. This step is simple, but it is the one that could take the longest time to complete, depending on how big your data partition is and how fast is your system. What we need to do is vacate /dev/sda2 so we can join it to /dev/md1, and we do this with the following commands: (warning: the pvmove command can take a long time to complete, so use it on a tty or inside a screen session)
pvcreate /dev/md1
vgextend pve /dev/md1
pvmove /dev/sda2 /dev/md1
vgreduce pve /dev/sda2
pvremove /dev/sda2
sfdisk --change-id /dev/sda 2 fd
mdadm --add /dev/md1 /dev/sda2

You will get your second raid rebuilding after the last mdadm command. This will take longer than the 1st one and you can check its progress the same way as before, with:
watch -n 5 cat /proc/mdstat

However, this time it may be good to boost the limits with which the RAID subsystem can read and write to its devices. You do that with the following commands:
echo 800000 > /proc/sys/dev/raid/speed_limit_min
echo 1600000 > /proc/sys/dev/raid/speed_limit_max


Hopefully this guide will save you some time and quite possibly a lot of head-ache and frustration! If you like it or if you have a suggestion to improve on it in any way, please leave me a comment below.