# Backup do Samba 4

## Introdução

Este documento visa a orientação para a configuração de backup dos dados de configurações do Samba4. Porém, não é uma solução para backup dos arquivos dos usuários, servidor de arquivos e etc. A efetivação destes procedimentos permite rápida restauração de um servidor samba com problemas ou implantação de um servidor novo baseado nas configurações restauradas de um anterior.

São utilizados scripts para a realização do backup e baseados em documentação oficial. A versão do samba que funciona corretamente com estes scripts é o Samba v4.0-v4.8. Para versões acima, existe outra abordagem oficial. Estes scripts podem funcionar no próprio host do samba que deve possuir um cliente de backup. Caso não seja possível instalar o cliente de backup, o script pode funcionar normalmente, mas após a geração dos arquivos de saída, estes devem ser enviados a um host intermediário que sofrerá o backup por meio de um cliente válido. Este segundo esquema pode ser representado pela seguinte figura:

[![esquema_Backup_gateway_SUAP.png](https://wiki.ifpe.edu.br/uploads/images/gallery/2018-09-Sep/scaled-840-0/esquema_Backup_gateway_SUAP.png)](https://wiki.ifpe.edu.br/uploads/images/gallery/2018-09-Sep/esquema_Backup_gateway_SUAP.png)

**Host** seria o servidor samba4. O **backup-gateway** é o host intermediário que recebe os dados gerados pelo script de backup do samba e possui um cliente de backup válido. O **servidor de backup** é o Bacula, Bareos ou outro servidor desejado.

### Backup do samba4

#### Preparação

Primeiro, tenha um usuário com permissões de administrador e crie um diretório no qual serão armazenados os arquivos gerados para backup. No caso, será utilizado o diretório `/root/backup/samba`.

`$ sudo mkdir /root/backup/samba -p`

Realize o download do *tarball* do samba contendo o script de backup fornecido pelos desenvolvedores.

```download
$ cd /usr/src 
$ sudo wget http://ftp.samba.org/pub/samba/samba-latest.tar.gz
$ sudo tar -xvzf samba-latest.tar.gz
```

Encontre o script em questão:

`$ find / -iname samba_backup`

Deverá aparecer uma saída apontando esta localização. Onde "x.x" é a especificação da versão do samba no seu cenário:

`/usr/src/samba-4.x.x/source4/scripting/bin/samba_backup`

Copiar para um local adequado, exemplo: **/root/scripts/**:

`$ sudo cp /usr/src/samba-4.8.4/source4/scripting/bin/samba_backup /root/scripts/`

A partir daqui preste bastante atenção. Será necessário **alterar variáveis no script original** e posteriormente inserir um trecho de código se for o seu caso. Caso seu **samba4 seja compilado**, realize da seguinte maneira:

```
$ sudo nano /root/scripts/samba_backup

DIRS="private etc sysvol"
FROMWHERE=/usr/local/samba
WHERE=/root/backup/samba
```

Caso o seu **samba4 seja instalado via pacotes** de repositórios:

```samba
$ sydi nano /root/scripts/samba_backup

DIRS="private /etc/samba sysvol"
FROMWHERE=/var/lib/samba
WHERE=/root/backup/samba
```

Agora insira (cole) o seguinte trecho de código na linha 85 se o seu **samba4 foi instalado via repositório de pacotes**:

```
elif  [ "$d" = "/etc/samba" ]; then
		# Run the backup.
		#    --warning=no-file-ignored set to suppress "socket ignored" messages.
		tar cjf ${WHERE}/${n}.${WHEN}.tar.bz2  $d --warning=no-file-ignored
		Status=$?       # Preserve $? for message, since [ alters it.
		if [ $Status -ne 0 ]; then
				echo "Error while archiving ${WHERE}/${n}.${WHEN}.tar.bz2 - status = $Status"
				exit 1
		fi
```

Este código é necessário pois sem ele uma parte dos arquivos não seria copiada.

 Ajuste permissões:

```
$ sudo chmod 750 /root/backup/samba/
$ sudo chown root:root /root/scripts/samba_backup
```

#### Execução

Antes de rodar o script é NECESSÁRIO parar o serviço do samba. Então, faça da seguinte maneira:

```
$ sudo service samba stop
$ /root/scripts/samba_backup 2>/dev/null
```

<div data-lang="" id="bkmrk-%24-sudo-service-samba-0"><textarea style="display: none;">$ sudo service samba stop $ /root/scripts/samba\_backup 2&gt;/dev/null</textarea><div><div><textarea spellcheck="false" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;" tabindex="0"></textarea></div><div><div><div></div></div></div></div></div>Os arquivos ficarão em **/root/backup/samba/:**

```
$ ls root/backup/samba/
_etc_samba.2018-08-20.tar.bz2 
samba4_private.2018-08-20.tar.bz2 
sysvol.2018-08-20.tar.bz2
```

#### Rotina de backup

Sugere-se a adição deste script à rotina do host para uma execução periódica. Porém, é importante alterar o script para que seja possível **parar o samba antes de executar o script**! Pode ser inserido tal código ao script:

```
# PARAR SAMBA, INÍCIO DO SCRIPT:
/etc/init.d/samba stop

......

# INICIAR SAMBA APÓS TODA A EXECUÇÃO DO SCRIPT, NAS ULTIMAS LINHAS:
# START SAMBA
/etc/init.d/samba start
```

### Restaurando os arquivos

<p class="callout danger">Por se tratar de procedimento **complexo** em que o sucesso depende muito das variáveis envolvidas no ambiente, não é possível garantir o sucesso dos métodos de restauração à seguir para **qualquer caso**. Assim, o administrador deve realizar os devidos ajustes para conseguir ter sucesso na operação.</p>

 Observações importantes:

- Nunca tente restaurar e realizar uma troca de versão do samba ao mesmo tempo. Sempre restaure, tenha um sistema funcional, e depois realize a atualização;
- Não troque o *hostname* nem o endereço de IP para não ter problemas com o kerberos e DNS;
- **RECOMENDADO**: restaure na mesma instância de S.O que estava executando o serviço anteriormente.
- Se for necessário reinstalar o sistema, será necessário que primeiro seja instalado corretamente o seu [*active directory controller*](https://wiki.samba.org/index.php/Setting_up_Samba_as_an_Active_Directory_Domain_Controller).

Pare o samba!

```
$ sudo /etc/init.d/samba stop
```

Remova os diretórios anteriores **caso samba4 seja compilado:**

```samba
$ sudo rm -rf /usr/local/samba/etc
$ sudo rm -rf /usr/local/samba/private
$ sudo rm -rf /usr/local/samba/var/locks/sysvol
```

**Apague os diretórios anteriores caso samba4 seja instalado via repositório de pacotes:**

```
$ sudo rm -rf /etc/samba/
$ sudo rm -rf /var/lib/samba/sysvol/
$ sudo rm -rf /var/lib/samba/private/
```

O arquivo compactado por vezes vai gerar uma estrutura de diretórios partindo da raiz "/", assim, ao copiar do backup para a pasta real, copie somente a parte do caminho que resta. Por exemplo, no caso de /etc/samba/ copie o diretório, dentro do arquivo compactado relativo ao etc, a partir do que estiver dentro de "samba", ou seja:

[![samba_backup_etc_conteudo.JPG](https://wiki.ifpe.edu.br/uploads/images/gallery/2018-09-Sep/scaled-840-0/samba_backup_etc_conteudo.JPG)](https://wiki.ifpe.edu.br/uploads/images/gallery/2018-09-Sep/samba_backup_etc_conteudo.JPG)

Estes arquivos devem ser copiados para **/etc/samba/.**

Assim, copie para os caminhos reais os conteúdos dos arquivos do "etc" (**\_etc\_samba.Timestamp.tar.bz2**), "private"(**samba4\_private.Timestamp.tar.bz2**) e "sysvol"(**sysvol.Timestamp.tar.bz2**). Os caminhos reais, como apontado anteriormente, dependem da instalação do seu samba, se compilada ou não. *Timestamp* é um data no formato *AAAA-MM-DD, Ex: 2018-08-24.*

Supondo que esteja no diretório que contém os três arquivos do backup:

```
$ sudo tar -jxf etc.{Timestamp}.tar.bz2 -C /CAMINHO/COMPILADO/OU/NÃO
$ sudo tar -jxf samba4_private.{Timestamp}.tar.bz2 -C /CAMINHO/COMPILADO/OU/NÃO
$ sudo tar -jxf sysvol.{Timestamp}.tar.bz2 -C /CAMINHO/COMPILADO/OU/NÃO
```

Renomeie os arquivos \*.ldp.bak para \*.ldb:

```
$ find /LOCAL/DO/PRIVATE -type f -name '*.ldb.bak' -print0 | while read -d $'\0' f ; do mv "$f" "${f%.bak}" ; done
```

Se o backup não contém ACLs extendidas, execute:

```
$ sudo samba-tool ntacl sysvolreset
```

 Se você utiliza o samba como backend DNS, execute o comando à seguir para consertar os hardlinks das bases DNS:

```
$ sudo samba_upgradedns --dns-backend=BIND9_DLZ
```

Então pode reiniciar o serviço do samba e realizar os devidos ajustes.

```
$ sudo /etc/init.d/samba start
```

### Referências

[https://wiki.samba.org/index.php/Using\_the\_samba\_backup\_script](https://wiki.samba.org/index.php/Using_the_samba_backup_script)

[https://wiki.samba.org/index.php/Back\_up\_and\_Restoring\_a\_Samba\_AD\_DC](https://wiki.samba.org/index.php/Back_up_and_Restoring_a_Samba_AD_DC)