Linux Backup ад Veeam на АС "Эльбрус". Імпартазамяшчэнне ['?' | '.' | '!']

Усім прывітанне.
Нядаўнія артыкулы на хабры Імпартазамяшчэнне на практыцы. Частка 1. Варыянты и Не доўга музыка грала… ці як АС Эльбрус так і не стала вольнай не пакінулі мяне абыякавым. Я вырашыў павывучаць гэтае пытанне ў ключы задачы рэзервовага капіявання. Тым больш, што ў гэтым артыкуле прадукты Veeam Software згадваюцца, а значыць, пытанне можа быць актуальным менавіта ў ключы імпартазамяшчэння.

Linux Backup ад Veeam на АС "Эльбрус". Імпартазамяшчэнне ['?' | '.' | '!']
першакрыніца выявы

Перш за ўсё я вырашыў запампаваць АС "Эльбрус", а дакладней – толькі даступны дыстрыбутыў для архітэктуры x86_64, паглядзець, як ён уладкованы, і паспрабаваць паставіць на яго Veeam Agent for Linux. Жадаючых даведацца, што з гэтага атрымалася, прашу пад кат.

Дык вось, маленькі адступ, а то раптам нехта не ведае. «Эльбрус» - гэта такі працэсар з даволі спецыфічнай сістэмай каманд. Акрамя яго, ёсць праграмнае забеспячэнне АС "Эльбрус". І – насуперак распаўсюджанай памылцы – для працы АС «Эльбрус» не абавязкова мець апаратны комплекс на базе працэсара Эльбрус. Ёсць "PDK "Эльбрус" для x86" – уласна, ён і з'явіўся ў адкрытым доступе ў выглядзе ўсталявальнага дыска. Дарэчы, там ёсць знос «PDK – platform development kit, набор распрацоўніка» – выдатна, значыць, там ёсць як мінімум кампілятар.

Яшчэ адзін маленькі змушаны адступ. Справа ў тым, што я калісьці меў справу і з айчынным ПЗ, такім як "МСВС" і ОСРВ "Багет". Быў досвед па працы і з айчыннай элементнай базай, у тым ліку і з працэсарам ад МЦСТ. Таму з усёй адказнасцю магу сказаць, што ёсць у гэтай галіне пэўная спецыфіка і, якраз яе я пастараюся ў артыкуле не датычыцца. Калі ну прам вельмі захочацца - буду ставіць тэг [TBD]. Так што пастараемся абыйсціся без адкрытага тролінга і банальных стогнаў. У рэшце рэшт расейскую абаронку і дзяржструктуры трэба зразумець. Краіна вялікая - бюджэт малы. [TBD].

Нулявы этап - пампуем. Характэрна, што навіна аб тым, што АС "Эльбрус" стаў даступнай, выклікала рэзананс, ды такі, што сервер раздачы лёг. [TBD] Дзякуй Yandex і таму інжынеру, які здагадаўся перакласці яго туды. Так што хуткасць запампоўкі радуе.

Першы этап - Усталёўка. Ставіў я на першы які трапіў вольны для бясплатнага выкарыстання гіпервізор. Вылучыў два ядры, пару гігаў АЗП, 32 Мб на відэа (тамака ж будзе графічны інтэрфейс, падумаў я). Дысачак як звычайна - 32 Гб.
Запусціў усталёўку. Інструкцыяй па ўсталяванні я не карыстаўся, так што пракаментаваць яе не змагу. Інтэрфейс усталёўкі TUI – сурова-мінімалістычны.

Linux Backup ад Veeam на АС "Эльбрус". Імпартазамяшчэнне ['?' | '.' | '!']
Ну і добра, без мышкі, значыць, абыдземся.

З наступным акном я зладзіўся з другой спробы. Чаму б пры ўсталёўцы з дыска не абраць па змаўчанні прылада sr0 [TBD]?
Выбіраемы крыніца CD-ROM, едзем далей.

Linux Backup ад Veeam на АС "Эльбрус". Імпартазамяшчэнне ['?' | '.' | '!']

Выбіраючы часавы пояс, я нечакана зразумеў, што сістэма выкарыстоўвае працэс загрузкі init, і працую я з TTY0.

Linux Backup ад Veeam на АС "Эльбрус". Імпартазамяшчэнне ['?' | '.' | '!']

ОК, значыць аднясем «Эльбрус» да супольнасці старавераў[TBD]. У прынцыпе, гэта добра: не трэба прасіць зыходнікі, каб паглядзець, як адпрацоўвае працэс загрузкі, бо ўсё на скрыптах.

Астатняе амаль усё роўна: ставім усё і згаджаемся. Адначасна даведваемся, што ядро ​​выкарыстоўваецца 3.14.79-13.84. Хм, а ў Debian 7 было 3.2 [TBD].

Далей выбіраемы разбіццё дыска на раздзелы па змаўчанні і… Бачым папярэджанне:

Linux Backup ад Veeam на АС "Эльбрус". Імпартазамяшчэнне ['?' | '.' | '!']

Мда, неяк дрэнна аўтаматычная разметка справілася з дыскам у 32 гіга. Дыск мяняць я не стаў, прайшоў квэст з ручной разметкай дыска ў стылі "ўсё ў адным". Прыйшлося ставіць ext3, бо /boot не мог быць у ext4.
Сістэма ўстала без здарэнняў.

Другі этап - Пошук альтэрнатыў.
Пакапаўшыся са змесцівам другога дыска, я зразумеў, што гэта рэпазітар з дад. пакетамі. А зірнуўшы ў /etc/apt/sources.list, зразумеў, што мантаваць яго трэба ў /mnt/cdrom. Затое /etc/os-release я не знайшоў. Але ёсць /etc/mcst-version са зместам 3.0-rc36. 3.0 гэта, мусіць, версія накшталт сыходзіцца, а вось rc36? Увогуле, распазнаць гэты дыстрыбутыў класічным шляхам іншаму ПА хутчэй за ўсё не атрымаецца.

У рутавым падзеле ў вочы кідаецца дырэкторыя /mcst, а тамака з заміраннем сэрца я выявіў /mcst/backup. Гэта значыць сродак для рэзервовага капіявання ёсць, прычым убудаваны ў сістэму! "Выдатна", - падумаў я, - "Паглядзім як гэта працуе!"

Аказалася, што ёсць bash-скрыпт /mcst/bin/backup памерам у 4Kб, які забяспечвае капіраванне файлаў. Па змаўчанні - у дырэкторыю /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 for Linux. Хтосьці спытае: "А пры чым тут Veeam і імпартазамяшчэнне?" Так, у рэестры яго няма, але ён сертыфікаваны ФСТЭК, а значыць, пры адсутнасці альтэрнатыў яго можна выкарыстоўваць. Надаўшы хвілін пятнаццаць на альтэрнатывы з рэестра, мне ўдалося знайсці 3 спасылкі па слове «backup» (ніводнай, якая адносіцца да майго пытання, на слова «рэзерв»). Глыбокім аналізам гэтых праграм я не займаўся - таму не буду спрабаваць судзіць, наколькі яны падыходзяць для рэзервовага капіявання машын пад АС Linux. Каму трэба - сам зробіць выснову і падзеліцца ім у каментах.

этап трэці - усталёўка Veeam Agent for Linux.
Такім чынам, Veeam Agent for Linux складаецца з двух пакетаў: модуля ядра veeamsnap (дарэчы, зыходнік тут) і прапрыетарнага user-space кода ў выглядзе пакета veeam.

З усталёўкай модуля ядра паўстала адна маленькая праблема - адсутнасць пакета dkms. Гэта такі сэрвіс, які дазваляе збіраць модулі ядра з зыходнікаў. Як правіла, ён ёсць на ўсіх deb дыстрыбутывах. Прыйшлося яго спампаваць з іншага deb рэпазітара. Адно парадавала - пакет не залежыць ад архітэктуры, так што ўстаў як родны. Чаму яго не ўнеслі ў спіс даступных пакетаў, дакладней, не распрацавалі [TBD]? Магчыма, мяркуецца, што ніхто не павінен збіраць і запускаць усякія не МЦСТ модулі ядра. Тут праўда ёсць праблема - бо linux-headers ёсць. Гэта значыць, модуль, пры жаданні, можна сабраць рукамі і запускаць пры старце машыны скрыптам. Я думаю частых абнаўленняў ад МЦСТ чакаць не варта [TBD].

"OK, модуль устаў - самае складанае ззаду", - падумаў я… Пакет veeam для deb рэпазітара ёсць для платформы amd64, а ў АС "Эльбрус" платформа x86_64 [TBD]. Розніца, вядома, толькі ў назове, але гэтая розніца робіць практычна ўсе пакеты з іншых deb рэпазітараў несумяшчальнымі з АС "Эльбрус". Ухіляецца гэтае прыкрае непаразуменне элементарна: досыць разабраць пакет, паправіць інфармацыю аб архітэктуры і сабраць зваротна. Як гэта зрабіць нагуглілася маментальна.

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 functions" у пачатку файла [TBD].

Пасля такой вось грубіянскай апрацоўкі пакета напільнікам бэкап entire-machine на NFS-шару паспяхова запусціўся. Маунт бэкапу таксама прайшоў паспяхова. Так што, я мяркую, для рэзервовага капіявання машыны з PDK "Эльбрус", запампаванай за "проста так" без усялякіх абавязацельстваў, Veeam Agent for Linux сапраўды падыдзе. Нават пасля ўсіх дапрацовак напільнікам.

Вядома, фармальна дыстрыбутыў АС "Эльбрус" не падтрымліваецца, бо не ўваходзіць у пералік падтрымліваемых. Акрамя таго, Veeam Agent for Linux на ім не тэставаўся аддзелам QA, так што тых. падтрымкі няма (прынамсі на момант публікацыі артыкула).

Спадзяюся, артыкул будзе карысным тым, хто спрабуе рэалізаваць загад №334 ад 29.06.2017. Мае вам… [TBD].

Крыніца: habr.com

Дадаць каментар