Linux Backup mula sa Veeam sa Elbrus OS. Import substitution ['?' | '.' | '!']

Kumusta lahat.
Mga kamakailang artikulo sa HabrΓ© Import substitution sa pagsasanay. Bahagi 1. Mga Pagpipilian ΠΈ Hindi nagtagal ang musika... o kung paano hindi naging libre ang Elbrus OS hindi ako iniwan na walang malasakit. Nagpasya akong pag-aralan ang isyung ito sa konteksto ng backup na gawain. Bukod dito, sa artikulong ito Binanggit ang mga produkto ng Veeam Software, na nangangahulugan na ang isyu ay maaaring partikular na nauugnay sa konteksto ng pagpapalit ng pag-import.

Linux Backup mula sa Veeam sa Elbrus OS. Import substitution ['?' | '.' | '!']
orihinal na pinagmulan ng larawan

Una sa lahat, nagpasya akong i-download ang Elbrus OS, o sa halip, ang magagamit na pamamahagi lamang para sa x86_64 architecture, tingnan kung paano ito gumagana, at subukang i-install ang Veeam Agent para sa Linux dito. Kung gusto mong malaman kung ano ang lumabas dito, mangyaring tingnan ang pusa.

Kaya, isang maliit na digression, kung sakaling may hindi nakakaalam. "Elbrus" ay ganyan processor na may medyo tiyak na command system. Bilang karagdagan dito, mayroong software ng Elbrus OS. At - salungat sa popular na paniniwala - upang mapatakbo ang Elbrus OS, hindi kinakailangan na magkaroon ng isang sistema ng hardware batay sa processor ng Elbrus. Mayroong "PDK "Elbrus" para sa x86 - sa katunayan, lumitaw ito sa pampublikong domain sa anyo ng isang disk sa pag-install. Oo nga pala, may footnote na "PDK - platform development kit, developer kit" - mahusay, ibig sabihin mayroong kahit isang compiler doon.

Isa pang maliit na sapilitang pag-urong. Ang katotohanan ay minsan akong nakipag-usap sa domestic software, tulad ng MSVS at Baguette RTOS. Mayroon akong karanasan sa pagtatrabaho sa mga domestic na bahagi, kabilang ang isang processor mula sa MCST. Samakatuwid, maaari kong sabihin nang may buong responsibilidad na mayroong isang tiyak na pagtitiyak sa lugar na ito at susubukan kong huwag hawakan ito sa artikulo. Kapag gusto ko talaga, ilalagay ko ang tag [TBD]. Kaya susubukan naming gawin nang walang tahasang trolling at banal na daing. Sa huli, ang industriya ng pagtatanggol ng Russia at mga ahensya ng gobyerno ay kailangang maunawaan. Malaking bansa - maliit na badyet.. [TBD].

Zero yugto - download. Kapansin-pansin na ang balita na naging available ang Elbrus OS ay nagdulot ng resonance, kaya't bumaba ang distribution server. [TBD] Salamat sa Yandex at sa engineer na naisipang ilipat ito doon. Kaya ang bilis ng pag-download ay mabuti.

Ang unang yugto - pag-install. Na-install ko ito sa unang hypervisor na magagamit para sa libreng paggamit. Naglaan ako ng dalawang core, isang pares ng mga gig ng RAM, 32 MB para sa video (magkakaroon ng isang graphical na interface, naisip ko). Ang disk ay gaya ng dati - 32 GB.
Sinimulan ko ang pag-install. Hindi ko ginamit ang mga tagubilin sa pag-install, kaya hindi ako makapagkomento dito. Ang interface ng pag-install ng TUI ay lubhang minimalistic.

Linux Backup mula sa Veeam sa Elbrus OS. Import substitution ['?' | '.' | '!']
Well, mahusay, magagawa natin nang walang mouse.

Pinamahalaan ko ang susunod na window sa pangalawang pagsubok. Bakit hindi piliin ang default na device sr0 [TBD] kapag nag-i-install mula sa disk?
Piliin ang pinagmulan ng CD-ROM at magpatuloy.

Linux Backup mula sa Veeam sa Elbrus OS. Import substitution ['?' | '.' | '!']

Habang pinipili ang time zone, bigla kong napagtanto na ginagamit ng system ang proseso ng init boot, at nagtatrabaho ako mula sa TTY0.

Linux Backup mula sa Veeam sa Elbrus OS. Import substitution ['?' | '.' | '!']

OK, pagkatapos ay uriin natin ang "Elbrus" bilang isang komunidad Mga Matandang Mananampalataya[TBD]. Sa prinsipyo, ito ay mabuti: hindi mo kailangang humingi ng source code upang makita kung paano gumagana ang proseso ng pag-download, dahil ang lahat ay naka-script.

Ang natitira ay halos hindi mahalaga: inilalagay namin ang lahat at sumasang-ayon. Sa daan, nalaman namin na ang kernel ay ginagamit 3.14.79-13.84. Hmm, ang Debian 7 ay may 3.2 [TBD].

Susunod, piliin ang default na disk partitioning at... Nakikita namin ang isang babala:

Linux Backup mula sa Veeam sa Elbrus OS. Import substitution ['?' | '.' | '!']

Hmm, kahit papaano ay hindi nakayanan ng awtomatikong paghati ang isang 32 gig disk. Hindi ko binago ang disk; nakumpleto ko ang paghahanap gamit ang manual disk partitioning sa istilong "all-in-one". Kailangan kong mag-install ng ext3, dahil ang /boot ay hindi maaaring nasa ext4.
Ang sistema ay nabuo nang walang insidente.

Ang pangalawang yugto - maghanap ng mga alternatibo.
Matapos halukayin ang mga nilalaman ng pangalawang disk, napagtanto ko na ito ay isang imbakan na may karagdagang. sa mga pakete. At sa pagtingin sa /etc/apt/sources.list, napagtanto ko na kailangan itong i-mount sa /mnt/cdrom. Ngunit hindi ko nakita ang /etc/os-release. Ngunit mayroong /etc/mcst-version na may mga nilalaman na 3.0-rc36. 3.0 ay marahil ang bersyon - ito ay tila magkasya, ngunit rc36? Sa pangkalahatan, malamang na hindi makikilala ng software ng third-party ang pamamahagi na ito sa klasikal na paraan.

Sa root partition, ang /mcst na direktoryo ay nakakuha ng aking mata, at doon, na may lumulubog na puso, natuklasan ko ang /mcst/backup. Iyon ay, mayroong isang backup na tool, at ito ay binuo sa system! "Mahusay," naisip ko, "Tingnan natin kung paano ito gumagana!"

Ito ay lumabas na mayroong isang 4Kb bash script /mcst/bin/backup na nagbibigay ng pagkopya ng file. Bilang default - sa /mcst/backup na direktoryo. Sa source code inaasahan kong makita ang rsync command, ngunit wala ito sa default na configuration. Kinokopya lang ng script ang mga file. Ang utos ay mukhang ganito:

cp -rpdx <file backup> <file>

Ang buong file /mcst/bin/backup ay naritoBinabalaan kita kaagad na ang script na ito lamang ay hindi sapat upang lubos na maunawaan. Kinukuha nito ang mga function mula sa /mcst/bin/source, na parang library ng mga function. Hindi ko ito isinama (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

Bagaman, marahil ay may hindi ako naiintindihan? Baka may makapagpaliwanag sa mga komento: paano tinitiyak ng script na ito ang ligtas at maaasahang pag-backup ng data? [TBD]

rsync, sa pamamagitan ng paraan, ay kasama sa add-on. mga repositoryo. Bersyon 3.1.3. Sa palagay ko ang paggamit ng rsync ay isang mas mahusay na alternatibo sa /mcst/bin/backup na application.

Susunod, nagpasya akong maglagay ng bago Veeam Agent para sa Linux. May magtatanong: "Ano ang kinalaman ng Veeam at import substitution dito?" Oo, wala ito sa rehistro, ngunit ito ay sertipikado ng FSTEC, na nangangahulugan na sa kawalan ng mga alternatibo maaari itong magamit. Paggugol ng labinlimang minuto sa mga alternatibo mula sa pagpapatala, nakahanap ako ng 3 link para sa salitang "backup" (walang nauugnay sa tanong ko para sa salitang "reserba"). Hindi pa ako nakagawa ng malalim na pagsusuri sa mga programang ito, kaya hindi ko susubukang husgahan kung gaano sila angkop para sa pag-back up ng mga makina na nagpapatakbo ng Linux. Ang sinumang nangangailangan nito ay gagawa ng kanyang sariling konklusyon at ibabahagi ito sa mga komento.

stage tatlong β€” pag-install ng Veeam Agent para sa Linux.
Kaya, ang Veeam Agent para sa Linux ay binubuo ng dalawang pakete: ang veeamsnap kernel module (nga pala, source dito) at proprietary user-space code sa anyo ng veeam package.

Nagkaroon ng isang maliit na problema sa pag-install ng kernel module - ang nawawalang dkms package. Ito ay isang serbisyo na nagbibigay-daan sa iyong bumuo ng mga kernel module mula sa pinagmulan. Bilang panuntunan, available ito sa lahat ng mga distribusyon ng deb. Kinailangan kong i-download ito mula sa isang third-party na deb repository. Ang isang bagay na nagpasaya sa akin ay ang pakete ay hindi nakasalalay sa arkitektura, kaya ito ay umaangkop tulad ng isang katutubong. Bakit hindi ito kasama sa listahan ng mga available na package, o sa halip, hindi binuo [TBD]? Marahil ay ipinapalagay na walang dapat bumuo at magpatakbo ng anumang non-MCST kernel modules. Talagang may pagkakaiba dito - dahil may mga linux-header. Iyon ay, ang module, kung ninanais, ay maaaring tipunin sa pamamagitan ng kamay at ilunsad ng isang script kapag nagsimula ang makina. Sa tingin ko hindi mo dapat asahan ang madalas na mga update mula sa MCST [TBD].

"OK, naka-install na ang module - tapos na ang pinakamahirap na bahagi," naisip ko... Ang veeam package para sa deb repository ay para sa amd64 platform, at ang Elbrus OS ay may x86_64 [TBD] platform. Ang pagkakaiba, siyempre, ay nasa pangalan lamang, ngunit ang pagkakaibang ito ay gumagawa ng halos lahat ng mga pakete mula sa mga third-party na deb repository na hindi tugma sa Elbrus OS. Ang nakakainis na hindi pagkakaunawaan na ito ay maaaring alisin nang simple: i-disassemble lang ang package, itama ang impormasyon tungkol sa arkitektura at ibalik ito nang magkasama. Paano ito gagawin I-Google ito kaagad.

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

Ang isa pang problema ay dependencies. Ang mga kinakailangang file ay tila naroroon, ngunit ang mga pakete ay wala. Ang impresyon ay ang mga pangalan ng mga pakete ay naiiba sa kanilang "na-import na mga analogue". Marahil ay iba ang pagkaka-package ng mga aklatan. Hindi ako nagpunta sa masyadong maraming detalye, inalis ang halos lahat ng dependencies, at natuloy ang pag-install.

Pagkatapos ay lumitaw ang mga problema sa code ng pagsisimula ng serbisyo. Nawawala ang script /lib/init/vars.sh. Para sa ilang kadahilanan, namamahala ang Elbrus nang wala ito, kaya aalisin din namin ito. Susunod, kinailangan naming palitan ang function ng output ng mensahe: nawawala ang log_daemon_msg at log_end_msg function. Pagkatapos maghalungkat sa /lib/lsb/init-functions file, nakita ko ang log_success_msg function - ito ay magiging mabuti para sa amin para sa mga eksperimento. Sa pamamagitan ng paraan, sa /lib/lsb/init-functions file ang linyang β€œ# Source SuSE`s rc functions” ay nasa simula ng [TBD] file.

Matapos ang gayong magaspang na pagproseso ng package gamit ang isang file, matagumpay na nailunsad ang buong-machine backup sa bahagi ng NFS. Naging matagumpay din ang backup mount. Kaya, naniniwala ako na para sa pag-back up ng makina gamit ang Elbrus PDK, na-download na "ganun lang" nang walang anumang obligasyon, ang Veeam Agent para sa Linux ay talagang angkop. Kahit na pagkatapos ng lahat ng mga pagbabago sa isang file.

Siyempre, ang Elbrus OS distribution kit ay hindi pormal na sinusuportahan, dahil hindi ito kasama sa listahan ng mga sinusuportahan. Bilang karagdagan, ang Veeam Agent para sa Linux ay hindi nasubok dito ng departamento ng QA, kaya ang mga iyon. walang suporta (hindi bababa sa oras ng paglalathala ng artikulo).

Umaasa ako na ang artikulo ay magiging kapaki-pakinabang sa mga nagsisikap na ipatupad ang order No. 334 ng Hunyo 29.06.2017, XNUMX. Ang akin sa iyo... [TBD].

Pinagmulan: www.habr.com

Magdagdag ng komento