Olá a todos.
Artigos recentes sobre Habré
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
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.
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.
Ao selecionar o fuso horário, de repente percebi que o sistema usa o processo de inicialização init e estou trabalhando em TTY0.
OK, então vamos classificar “Elbrus” como uma comunidade
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:
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
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,
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
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