Backup Linux da Veeam no sistema operacional Elbrus. Substituição de importação ['?' | '.' | '!']

Olá a todos.
Artigos recentes sobre Habré Substituição de importações na prática. Parte 1. Opções и A música não tocou por muito tempo... ou como o Elbrus OS nunca se tornou gratuito não me deixou indiferente. Decidi estudar esse assunto no contexto da tarefa de backup. Além disso, em Este artigo Os produtos da Veeam Software são mencionados, o que significa que a questão pode ser relevante especificamente no contexto de substituição de importações.

Backup Linux da Veeam no sistema operacional Elbrus. Substituição de importação ['?' | '.' | '!']
fonte da imagem original

Primeiramente resolvi baixar o Elbrus OS, ou melhor, apenas a distribuição disponível para a arquitetura x86_64, ver como funciona e tentar instalar nele o Veeam Agent for Linux. Se você quiser saber o que resultou disso, consulte cat.

Então, uma pequena digressão, caso alguém não saiba. "Elbrus" é assim processador com um sistema de comando bastante específico. Além dele, existe o software Elbrus OS. E - ao contrário do equívoco comum - para que o sistema operacional Elbrus funcione, não é necessário ter um sistema de hardware baseado no processador Elbrus. Existe o “PDK “Elbrus” para x86” - na verdade, ele apareceu em domínio público na forma de um disco de instalação. A propósito, há uma nota de rodapé “PDK - kit de desenvolvimento de plataforma, kit de desenvolvedor” - ótimo, isso significa que há pelo menos um compilador lá.

Outra pequena retirada forçada. O fato é que já lidei com softwares nacionais, como MSVS e Baguette RTOS. Tive experiência trabalhando com componentes domésticos, inclusive processador da MCST. Portanto, posso afirmar com toda a responsabilidade que existe uma certa especificidade nesta área e tentarei não tocar nisso no artigo. Quando eu realmente quiser, coloco a tag [TBD]. Portanto, tentaremos fazer isso sem trollagens e gemidos banais. No final, a indústria de defesa russa e as agências governamentais precisam de ser compreendidas. País grande – orçamento pequeno.. [TBD].

Estágio zero - download. Vale ressaltar que a notícia da disponibilização do Elbrus OS causou ressonância, tanto que o servidor de distribuição caiu. [TBD] Obrigado ao Yandex e ao engenheiro que pensou em movê-lo para lá. Portanto, a velocidade de download é boa.

O primeiro estágio - instalação. Instalei-o no primeiro hipervisor disponível para uso gratuito. Aloquei dois núcleos, alguns GB de RAM, 32 MB para vídeo (haverá uma interface gráfica, pensei). O disco tem, como sempre, 32 GB.
Comecei a instalação. Não usei as instruções de instalação, por isso não posso comentar. A interface de instalação do TUI é extremamente minimalista.

Backup Linux da Veeam no sistema operacional Elbrus. Substituição de importação ['?' | '.' | '!']
Bem, ótimo, podemos passar sem mouse.

Consegui a próxima janela na segunda tentativa. Por que não selecionar o dispositivo padrão sr0 [TBD] ao instalar a partir do disco?
Selecione a fonte do CD-ROM e siga em frente.

Backup Linux da Veeam no sistema operacional Elbrus. Substituição de importação ['?' | '.' | '!']

Ao selecionar o fuso horário, de repente percebi que o sistema usa o processo de inicialização init e estou trabalhando em TTY0.

Backup Linux da Veeam no sistema operacional Elbrus. Substituição de importação ['?' | '.' | '!']

OK, então vamos classificar “Elbrus” como uma comunidade Velhos Crentes[A definir]. Em princípio, isso é bom: você não precisa pedir o código-fonte para ver como funciona o processo de download, pois tudo é scriptado.

O resto é quase sem importância: colocamos tudo e concordamos. Ao longo do caminho, descobrimos que o kernel 3.14.79-13.84 é usado. Hmm, o Debian 7 tinha 3.2 [TBD].

Em seguida, selecione o particionamento de disco padrão e... Vemos um aviso:

Backup Linux da Veeam no sistema operacional Elbrus. Substituição de importação ['?' | '.' | '!']

Hmm, de alguma forma o particionamento automático não funcionou bem com um disco de 32 GB. Não troquei o disco; completei a missão com particionamento manual do disco no estilo “tudo em um”. Tive que instalar o ext3, pois /boot não poderia estar no ext4.
O sistema surgiu sem incidentes.

A segunda etapa - procurar alternativas.
Depois de vasculhar o conteúdo do segundo disco, percebi que este é um repositório com arquivos adicionais. em pacotes. E olhando para /etc/apt/sources.list, percebi que ele precisa ser montado em /mnt/cdrom. Mas não encontrei /etc/os-release. Mas existe /etc/mcst-version com o conteúdo 3.0-rc36. 3.0 é provavelmente a versão - parece caber, mas rc36? Em geral, o software de terceiros provavelmente não será capaz de reconhecer esta distribuição da forma clássica.

Na partição raiz, o diretório /mcst chama minha atenção e lá, com o coração apertado, descobri /mcst/backup. Ou seja, existe uma ferramenta de backup e ela está embutida no sistema! “Ótimo”, pensei, “vamos ver como isso funciona!”

Descobriu-se que existe um script bash de 4 KB /mcst/bin/backup que fornece cópia de arquivos. Por padrão - para o diretório /mcst/backup. No código-fonte eu esperava ver o comando rsync, mas ele não está na configuração padrão. O script simplesmente copia os arquivos. O comando é mais ou menos assim:

cp -rpdx <file backup> <file>

O arquivo inteiro /mcst/bin/backup está aquiAviso desde já que este script por si só não é suficiente para o entendimento completo. Ele extrai funções de /mcst/bin/source, que é algo como uma biblioteca de funções. Eu não incluí (44 KB).

#!/bin/bash

unalias -a

set +vx

source $(dirname $0)/source
[[ $? != 0 ]] && exit 1

OPTIONS="hvcdrRil:L:"

usage()
{
	echo "Usage: $PROG_NAME [-$OPTIONS] [backup]"
	echo "    h            - this help"
	echo "    v vv vvv     - verbose, very verbose, extremly verbose"
	echo "    c            - create backup"
	echo "    d            - diffs backup and system"
	echo "    r            - recovery system"
	echo "    R            - remove backup"
	echo "    i            - prompt before backup removing"
	echo "    l list       - additional backup files list"
	echo "    L list       - global backup files list"
	echo "    backup       - backup directory, default /mcst/backup/backup"
}

init_prog()
{
	typeset flg=0

	while getopts $OPTIONS opt
	do
		case $opt in
		h ) usage; exit 0;;
		v ) (( verbose = verbose + 1 )); set_verbose;;
		c ) flg=1; c_flg=1;;
		d ) flg=1; d_flg=1;;
		r ) flg=1; r_flg=1;;
		R ) flg=1; R_flg=1;;
		i ) i_flg=1;;
		l ) l_flg=1; list_arg="$list_arg $OPTARG";;
		L ) L_flg=1; LIST_arg="$LIST_arg $OPTARG";;
		* ) usage "Invalid option"; exit 1;;
		esac
	done

	set_verbose

	check_su

	init_variables

	shift $((OPTIND-1))

	if (( $# > 1 ))
	then
		echo_fatal "invalid arguments number, exp 0|1, act $#"
		exit 1
	fi

	[[ $# = 1 ]] && BACKUP=$1

	echo "Backup directory is $BACKUP"

	if [[ $L_flg = 1 ]]
	then
		backup_list="$LIST_arg"
	elif [[ $c_flg != 1 && $R_flg != 1 ]]
	then
		get_output_cmd "cat $BACKUP/$BACKUP_LIST_NAME"
		backup_list="$output_cmd"
	else
		get_output_cmd "get_backup_list"
		backup_list="$output_cmd"
	fi

	if [[ $l_flg = 1 ]]
	then
		backup_list="$backup_list $list_arg"
	fi

	if [[ $flg = 0 ]]
	then
		if [[ -d $BACKUP ]]
		then
			ls -laR $BACKUP
		else
			echo_info "Cannot access $BACKUP"	
		fi
		echo "backup_list=$backup_list"
		exit 0
	fi

###	echo "Backup list: $backup_list"
}

create_file()
{
	typeset f=$1 fr=$2
	typeset fb

	[[ -z $fr ]] && fr=$f

	fb=${f#/}

	fb=$BACKUP/$fb

	xcmd="rm -rf $fb"
	set_cmd "$xcmd"
	run_cmd

	xcmd="mkdir -p $fb"
	set_cmd "$xcmd"
	run_cmd

	if [[ -a $fr ]]
	then
		xcmd="cp -rpdx $fr $fb/file"
		set_cmd "$xcmd"
		run_cmd

		xcmd="touch $fb/create"
		set_cmd "$xcmd"
		run_cmd
	else
		xcmd="touch $fb/delete"
		set_cmd "$xcmd"
		run_cmd
	fi
}

diff_file()
{
	typeset f=$1
	typeset fb

	fb=${f#/}

	fb=$BACKUP/$fb

	if [[ -f $fb/delete ]]
	then
		echo_info "$f absent"
	elif [[ -f $fb/create ]]
	then
#		echo "state: create $f"

		if [[ ! -a $f ]]
		then
			echo_info "cannot access $f"
		else
			xcmd="diff -r $f $fb/file"
			echo "$xcmd"
			set_cmd "$xcmd" "" "0 1 2"
			run_cmd
		fi
	else
		echo_fatal "wrong $f backup"
		exit 1
	fi
}

recovery_file()
{
	typeset f=$1
	typeset fb

	fb=${f#/}

	fb=$BACKUP/$fb

	if [[ ! -a $fb ]]
	then
		echo_fatal "cannot access $fb"
		exit 1
	fi

	xcmd="rm -rf $f"
	set_cmd "$xcmd"
	run_cmd

	if [[ -f $fb/delete ]]
	then
		:
	elif [[ -f $fb/create ]]
	then
		xcmd="cp -rpdx $fb/file $f"
		set_cmd "$xcmd"
		run_cmd
	else
		echo_fatal "wrong $fb backup"
		exit 1
	fi
}

remove_backup()
{
	echo "Remove backup"

	if [[ ! -d $BACKUP ]]
	then
		echo_info "Cannot access $BACKUP"
		return
	fi

	if [[ ! -f $BACKUP/$BACKUP_LIST_NAME ]]
	then
		echo_fatal "$BACKUP_LIST_NAME absent, remove backup manually"
		exit 0
	fi

	answer=
	if [[ $i_flg = 1 ]]
	then
		echo -n "Remove $BACKUP directory (yes/...)?"
		read answer
	else
		answer=yes
	fi
	if [[ $answer = yes ]]
	then
		xcmd="rm -rf $BACKUP"
		set_cmd "$xcmd"
		run_cmd
	fi
}

recovery_backup()
{
	echo "Recovery system from $BACKUP" 

	for f in $backup_list
	do
		get_output_cmd "get_mount_point $f"
		mnt=$output_cmd
		get_output_cmd "is_ro_mounted $mnt"
		mnt=$output_cmd
		if [[ ! -z $mnt ]]
		then
			remount_rw_fs $mnt
		fi 
		recovery_file $f
		if [[ ! -z $mnt ]]
		then
			remount_ro_fs $mnt
		fi 
	done

	echo "The system is ready, reboot the system manually" 
}

create_backup()
{
		echo "Create backup"

		xcmd="mkdir -pm0777 $BACKUP"
		set_cmd "$xcmd"
		run_cmd

		for v in $backup_list
		do
			f=${v%%:*}
			backup_list2="$backup_list2 $f"
			fr=${v#*:}
			create_file $f $fr
		done
		echo "$backup_list2" >$BACKUP/$BACKUP_LIST_NAME
}

diff_backup()
{
	echo "Diffs system and backup" 

	if [[ ! -d $BACKUP ]]
	then
		echo_fatal "cannot access $BACKUP"
		exit 1
	fi

	for f in $backup_list
	do
		diff_file $f
	done
}

main()
{
	typeset f mnt mnt_list answer

	if [[ $R_flg = 1 ]]
	then
		remove_backup
	fi

	if [[ $r_flg = 1 ]]
	then
		recovery_backup
	fi

	if [[ $c_flg = 1 ]]
	then
		create_backup
	fi

	if [[ $d_flg = 1 ]]
	then
		diff_backup
	fi
}

init_prog "$@"

main

exit 0

Embora, talvez eu não tenha entendido alguma coisa? Talvez alguém possa explicar nos comentários: como esse script garante backup de dados seguro e confiável? [A definir]

A propósito, o rsync está incluído no complemento. repositórios. Versão 3.1.3. Acho que usar o rsync ainda é uma alternativa melhor ao aplicativo /mcst/bin/backup.

Em seguida, decidi colocar um novo Agente Veeam para Linux. Alguém perguntará: “O que a Veeam e a substituição de importações têm a ver com isso?” Sim, não está registrado, mas é certificado pelo FSTEC, o que significa que na falta de alternativas pode ser utilizado. Gastar quinze minutos em alternativas de registro, consegui encontrar 3 links para a palavra “backup” (nenhum relacionado à minha pergunta para a palavra “reserva”). Não fiz uma análise profunda desses programas, então não tentarei julgar quão adequados eles são para fazer backup de máquinas rodando Linux. Quem precisar tirará sua própria conclusão e compartilhará nos comentários.

terceira fase — instalação do Veeam Agent para Linux.
Portanto, o Veeam Agent for Linux consiste em dois pacotes: o módulo do kernel veeamsnap (a propósito, fonte aqui) e código proprietário do espaço do usuário na forma do pacote Veeam.

Houve um pequeno problema com a instalação do módulo do kernel - o pacote dkms ausente. Este é um serviço que permite construir módulos do kernel a partir do código-fonte. Via de regra, está disponível em todas as distribuições deb. Tive que baixá-lo de um repositório deb de terceiros. Uma coisa que me deixou feliz é que o pacote não depende da arquitetura, então cabe como um nativo. Por que não foi incluído na lista de pacotes disponíveis, ou melhor, não foi desenvolvido [TBD]? Talvez se presuma que ninguém deva construir e executar módulos de kernel que não sejam MCST. Realmente há uma discrepância aqui - já que existem cabeçalhos do Linux. Ou seja, o módulo, se desejado, pode ser montado manualmente e lançado por um script na inicialização da máquina. Acho que você não deveria esperar atualizações frequentes do MCST [TBD].

“OK, o módulo está instalado - a parte mais difícil já passou”, pensei... O pacote veeam para o repositório deb é para a plataforma amd64, e o sistema operacional Elbrus tem uma plataforma x86_64 [TBD]. A diferença, claro, está apenas no nome, mas essa diferença torna quase todos os pacotes de repositórios deb de terceiros incompatíveis com o sistema operacional Elbrus. Esse incômodo mal-entendido pode ser eliminado de forma simples: basta desmontar o pacote, corrigir as informações sobre a arquitetura e montá-lo novamente. Como fazer isso Pesquisei no Google imediatamente.

mkdir tmp
dpkg-deb -R original.deb tmp
# edit DEBIAN/postinst
dpkg-deb -b tmp fixed.deb

Outro problema são as dependências. Os arquivos necessários parecem estar lá, mas os pacotes não. A impressão foi que os nomes das embalagens diferiam dos “análogos importados”. Talvez as bibliotecas sejam empacotadas de forma diferente. Não entrei em muitos detalhes, removi quase todas as dependências e a instalação seguiu em frente.

Então surgiram problemas com o código de início do serviço. O script /lib/init/vars.sh estava faltando. Por alguma razão, Elbrus consegue viver sem ele, então vamos removê-lo também. Em seguida, tivemos que substituir a função de saída de mensagens: as funções log_daemon_msg e log_end_msg estavam faltando. Depois de vasculhar o arquivo /lib/lsb/init-functions, encontrei a função log_success_msg - será boa para experimentos. A propósito, no arquivo /lib/lsb/init-functions a linha “# Source SuSE`s rcfunctions” está no início do arquivo [TBD].

Após esse processamento grosseiro do pacote com um arquivo, o backup de toda a máquina no compartilhamento NFS foi iniciado com êxito. A montagem de backup também foi bem-sucedida. Então, acredito que para fazer backup de uma máquina com Elbrus PDK, baixada “assim mesmo” sem nenhuma obrigação, o Veeam Agent for Linux é definitivamente adequado. Mesmo depois de todas as modificações com um arquivo.

Obviamente, a distribuição do Elbrus OS não é formalmente suportada, uma vez que não está incluída na lista de distribuições suportadas. Além disso, o Veeam Agent for Linux não foi testado pelo departamento de controle de qualidade, então aqueles. não há suporte (pelo menos no momento da publicação do artigo).

Espero que o artigo seja útil para quem está tentando implementar o despacho nº 334 de 29.06.2017 de junho de XNUMX. Meu para você... [TBD].

Fonte: habr.com

Adicionar um comentário