Линукс резервна копија од Veeam на Elbrus OS. Замена за увоз ['?' | '.' | '!']

Здраво на сите
Неодамнешни написи на Хабре Замена на увозот во пракса. Дел 1. Опции и Музиката не свиреше долго... или како Elbrus OS никогаш не стана бесплатен не ме остави рамнодушен. Решив да го проучам ова прашање во контекст на задачата за резервна копија. Покрај тоа, во овој напис Се споменуваат производите на Veeam Software, што значи дека проблемот може да биде релевантен конкретно во контекст на замена на увозот.

Линукс резервна копија од Veeam на Elbrus OS. Замена за увоз ['?' | '.' | '!']
оригинален извор на слика

Најпрво, решив да го преземам Elbrus OS, поточно, само достапната дистрибуција за архитектурата x86_64, да видам како функционира и да се обидам да инсталирам Veeam Agent за Linux на неа. Ако сакате да знаете што излезе од ова, ве молиме погледнете мачка.

Значи, мала дигресија, ако некој не знае. „Елбрус“ е таков Процесор со прилично специфичен команден систем. Во прилог на него, постои софтвер Elbrus OS. И - спротивно на популарното верување - за ракување со Elbrus OS, не е неопходно да се има хардверски систем базиран на процесорот Elbrus. Постои „PDK „Elbrus“ за x86 - всушност, тој се појави во јавниот домен во форма на инсталациски диск. Патем, постои фуснота „PDK - комплет за развој на платформа, комплет за програмери“ - одлично, што значи дека има барем компајлер таму.

Уште едно мало принудно повлекување. Факт е дека еднаш се занимавав со домашен софтвер, како MSVS и Baguette RTOS. Имав искуство со работа со домашни компоненти, вклучително и процесор од MCST. Затоа, можам со целосна одговорност да кажам дека има одредена специфичност во оваа област и ќе се обидам да не ја допирам во статијата. Кога навистина сакам, ќе ја ставам ознаката [TBD]. Така ќе се обидеме да направиме без целосно тролање и банално стенкање. На крајот, треба да се разберат руската одбранбена индустрија и владините агенции. Голема земја - мал буџет.. [TBD].

Нулта фаза - преземете. Вреди да се одбележи дека веста дека оперативниот систем Elbrus стана достапен предизвика резонанца, толку многу што серверот за дистрибуција падна. [TBD] Благодарение на Yandex и на инженерот кој размислуваше да го премести таму. Значи, брзината на преземање е добра.

Првата фаза - инсталација. Го инсталирав на првиот хипервизор кој беше достапен за бесплатна употреба. Одвоив две јадра, неколку гига RAM, 32 MB за видео (ќе има графички интерфејс, си помислив). Дискот е како и обично - 32 GB.
Ја започнав инсталацијата. Не ги користев упатствата за инсталација, па не можам да коментирам за тоа. Интерфејсот за инсталација на TUI е строго минималистички.

Линукс резервна копија од Veeam на Elbrus OS. Замена за увоз ['?' | '.' | '!']
Па, одлично, можеме без глушец.

Успеав со следниот прозорец при вториот обид. Зошто да не го изберете стандардниот уред sr0 [TBD] при инсталирање од диск?
Изберете го изворот на CD-ROM-от и продолжете понатаму.

Линукс резервна копија од Veeam на Elbrus OS. Замена за увоз ['?' | '.' | '!']

При изборот на временската зона, наеднаш сфатив дека системот го користи процесот на подигнување иницирање и јас работам од TTY0.

Линукс резервна копија од Veeam на Elbrus OS. Замена за увоз ['?' | '.' | '!']

Добро, тогаш ајде да го класифицираме „Елбрус“ како заедница Стари верници[TBD]. Во принцип, ова е добро: не треба да го барате изворниот код за да видите како функционира процесот на преземање, бидејќи сè е скриптирано.

Останатото е речиси неважно: ставаме сè и се согласуваме. На патот, дознаваме дека кернелот се користи 3.14.79-13.84. Хм, Debian 7 имаше 3.2 [TBD].

Следно, изберете ја стандардната партиција на дискот и... Гледаме предупредување:

Линукс резервна копија од Veeam на Elbrus OS. Замена за увоз ['?' | '.' | '!']

Хм, некако автоматската партиција не се справи добро со диск од 32 гига. Не го сменив дискот; ја завршив потрагата со рачно партиционирање на дискот во стилот „сè-во-едно“. Морав да инсталирам ext3, бидејќи /boot не можеше да биде во ext4.
Системот излезе без инциденти.

Втората фаза - барај алтернативи.
Откако ја пребарував содржината на вториот диск, сфатив дека ова е складиште со дополнителни. во пакувања. И гледајќи во /etc/apt/sources.list, сфатив дека треба да се монтира во /mnt/cdrom. Но, не најдов /etc/os-release. Но, постои /etc/mcst-верзија со содржина 3.0-rc36. 3.0 е веројатно верзијата - се чини дека одговара, но rc36? Општо земено, софтверот од трета страна најверојатно нема да може да ја препознае оваа дистрибуција на класичен начин.

Во root партицијата, директориумот /mcst ми го привлекува вниманието и таму, со срце што тоне, го открив /mcst/backup. Тоа е, постои алатка за резервна копија и таа е вградена во системот! „Одлично“, си помислив, „Ајде да видиме како функционира ова!“

Се испостави дека има 4Kb баш скрипта /mcst/bin/резервна копија која обезбедува копирање на датотеки. Стандардно - во директориумот /mcst/backup. Во изворниот код очекував да ја видам командата rsync, но таа не е во стандардната конфигурација. Скриптата едноставно ги копира датотеките. Командата изгледа отприлика вака:

cp -rpdx <file backup> <file>

Целата датотека /mcst/bin/backup е тукаВеднаш ве предупредувам дека само оваа скрипта не е доволна за целосно разбирање. Ги повлекува функциите од /mcst/bin/source, што е нешто како библиотека на функции. Не го вклучив (44KB).

#!/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

Иако, можеби не разбрав нешто? Можеби некој може да објасни во коментарите: како оваа скрипта обезбедува безбедна и доверлива резервна копија на податоците? [TBD]

rsync, патем, е вклучен во додатокот. складишта. Верзија 3.1.3. Мислам дека користењето rsync е сепак подобра алтернатива за апликацијата /mcst/bin/backup.

Следно, решив да ставам свеж Veeam Agent за Linux. Некој ќе праша: „Каква врска има Veeam и замена за увоз? Да, не е во регистарот, но е сертифициран од FSTEC, што значи дека во отсуство на алтернативи може да се користи. Трошење петнаесет минути на алтернативи од регистар, успеав да најдам 3 врски за зборот „резервна копија“ (ниту една поврзана со моето прашање за зборот „резерва“). Не сум направил длабока анализа на овие програми, па нема да се обидам да судам колку се погодни за резервна копија на машини кои работат со Linux. На кој му треба, сам ќе извлече заклучок и ќе го сподели во коментар.

Третата фаза — инсталација на Veeam Agent за Linux.
Значи, Veeam Agent за Linux се состои од два пакети: модулот за кернелот veeamsnap (патем, извор овде) и комерцијален код за кориснички простор во форма на пакетот veeam.

Имаше еден мал проблем со инсталирањето на модулот на јадрото - пакетот dkms што недостасува. Ова е услуга која ви овозможува да изградите модули на јадрото од изворот. Како по правило, тој е достапен на сите деб дистрибуции. Морав да го преземам од деб складиште од трета страна. Едно нешто што ме израдува е што пакетот не зависи од архитектурата, па одговара како мајчин. Зошто не беше вклучен во списокот на достапни пакети, или подобро кажано, не беше развиен [TBD]? Можеби се претпоставува дека никој не треба да гради и стартува модули на јадрото што не се MCST. Тука навистина постои несовпаѓање - бидејќи има заглавија на Linux. Односно, модулот, по желба, може да се состави рачно и да се стартува со скрипта кога машината ќе стартува. Мислам дека не треба да очекувате чести ажурирања од MCST [TBD].

„Во ред, модулот е инсталиран - најтешкиот дел заврши“, си помислив... Пакетот veeam за складиштето deb е за платформата amd64, а оперативниот систем Elbrus има платформа x86_64 [TBD]. Разликата, се разбира, е само во името, но оваа разлика ги прави речиси сите пакети од деб складишта од трети страни некомпатибилни со Elbrus OS. Ова досадно недоразбирање може едноставно да се отстрани: само расклопете го пакетот, поправете ги информациите за архитектурата и повторно составете ги. Како да го направите тоа Го побара на Гугл веднаш.

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

Друг проблем се зависностите. Потребните датотеки се чини дека се таму, но пакетите не се. Се добиваше впечаток дека имињата на пакетите се разликуваат од нивните „увезени аналози“. Можеби библиотеките се спакувани поинаку. Не навлегував во премногу детали, ги отстранив скоро сите зависности и инсталацијата продолжи.

Потоа се појавија проблеми со кодот за почеток на услугата. Недостасуваше скриптата /lib/init/vars.sh. Поради некоја причина, Елбрус се справува без него, па и ние ќе го отстраниме. Следно, моравме да ја замениме функцијата за излез на пораката: недостасуваа функциите log_daemon_msg и log_end_msg. Откако пребарував наоколу во датотеката /lib/lsb/init-functions, ја најдов функцијата log_success_msg - ќе ни биде добро за експерименти. Патем, во датотеката /lib/lsb/init-functions линијата „# Source SuSE`s rc функции“ е на почетокот на датотеката [TBD].

По таква груба обработка на пакетот со датотека, резервната копија на целата машина на споделувањето NFS беше успешно лансирана. Резервната монтажа исто така беше успешна. Значи, верувам дека за правење резервна копија на машина со Elbrus PDK, преземена „токму така“ без никакви обврски, Veeam Agent за Linux е дефинитивно погоден. Дури и по сите модификации со датотека.

Се разбира, комплетот за дистрибуција на Elbrus OS не е формално поддржан, бидејќи не е вклучен во списокот на поддржани. Дополнително, Veeam Agent за Линукс не беше тестиран на него од одделот за QA, така што тие. нема поддршка (барем во моментот на објавување на статијата).

Се надевам дека статијата ќе биде корисна за оние кои се обидуваат да ја спроведат нарачката бр. 334 од 29.06.2017 јуни XNUMX година. Мој за тебе... [TBD].

Извор: www.habr.com

Додадете коментар