النسخ الاحتياطي لنظام التشغيل Linux من Veeam على نظام التشغيل Elbrus. إحلال الواردات ['؟' | '.' | '!']

مرحبا.
المقالات الأخيرة عن حبري استبدال الواردات في الممارسة العملية. الجزء 1. الخيارات и لم يتم تشغيل الموسيقى لفترة طويلة... أو كيف لم يصبح نظام Elbrus OS مجانيًا أبدًا لم يتركني غير مبال. قررت دراسة هذه المشكلة في سياق مهمة النسخ الاحتياطي. علاوة على ذلك، في هذا المقال تم ذكر منتجات برنامج Veeam، مما يعني أن المشكلة قد تكون ذات صلة على وجه التحديد في سياق استبدال الواردات.

النسخ الاحتياطي لنظام التشغيل Linux من Veeam على نظام التشغيل Elbrus. إحلال الواردات ['؟' | '.' | '!']
مصدر الصورة الأصلي

بادئ ذي بدء، قررت تنزيل نظام التشغيل Elbrus، أو بالأحرى، فقط التوزيع المتاح للهندسة المعمارية x86_64، ومعرفة كيف يعمل، ومحاولة تثبيت Veeam Agent لنظام التشغيل Linux عليه. إذا كنت تريد أن تعرف ما خرج من هذا، يرجى الاطلاع على القط.

لذلك، استطراد صغير، في حالة شخص لا يعرف. "البروس" هو من هذا القبيل معالج مع نظام قيادة محدد إلى حد ما. بالإضافة إلى ذلك، هناك برنامج Elbrus OS. و- خلافًا للاعتقاد السائد - لتشغيل نظام التشغيل Elbrus، ليس من الضروري أن يكون لديك نظام أجهزة يعتمد على معالج Elbrus. يوجد "PDK "Elbrus" لـ x86" - في الواقع، ظهر في المجال العام في شكل قرص تثبيت. بالمناسبة، هناك حاشية سفلية "PDK - مجموعة أدوات تطوير النظام الأساسي، مجموعة أدوات المطورين" - رائعة، وهذا يعني أن هناك مترجمًا على الأقل.

تراجع قسري صغير آخر. الحقيقة هي أنني تعاملت ذات مرة مع البرامج المحلية، مثل MSVS وBaguette RTOS. كان لدي خبرة في العمل مع المكونات المحلية، بما في ذلك المعالج من MCST. لذلك أستطيع أن أقول بكل مسؤولية أن هناك خصوصية معينة في هذا المجال وسأحاول عدم التطرق إليها في المقال. عندما أريد ذلك حقًا، سأضع العلامة [سيتم تحديده لاحقًا]. لذلك سنحاول الاستغناء عن التصيد الصريح والأنين المبتذل. وفي النهاية، لا بد من فهم صناعة الدفاع الروسية والوكالات الحكومية. دولة كبيرة - ميزانية صغيرة.. [سيتم تحديده لاحقًا].

مرحلة الصفر - تحميل. يشار إلى أن الأخبار التي تفيد بتوفر نظام التشغيل Elbrus OS تسببت في صدى كبير لدرجة أن خادم التوزيع تعطل. [سيتم تحديده لاحقًا] شكرًا لـ Yandex والمهندس الذي فكر في نقله إلى هناك. لذا فإن سرعة التنزيل جيدة.

المرحلة الأولى - تثبيت. لقد قمت بتثبيته على برنامج Hypervisor الأول الذي كان متاحًا للاستخدام المجاني. لقد خصصت نواتين، واثنين من العربات من ذاكرة الوصول العشوائي، و 32 ميجابايت للفيديو (أعتقد أنه ستكون هناك واجهة رسومية). القرص كالمعتاد - 32 جيجا بايت.
لقد بدأت التثبيت. لم أستخدم تعليمات التثبيت، لذا لا أستطيع التعليق عليها. واجهة تثبيت TUI بسيطة للغاية.

النسخ الاحتياطي لنظام التشغيل Linux من Veeam على نظام التشغيل Elbrus. إحلال الواردات ['؟' | '.' | '!']
حسنًا، رائع، يمكننا الاستغناء عن الفأرة.

تمكنت من النافذة التالية في المحاولة الثانية. لماذا لا تحدد الجهاز الافتراضي sr0 [سيتم تحديده لاحقًا] عند التثبيت من القرص؟
حدد مصدر القرص المضغوط وانتقل.

النسخ الاحتياطي لنظام التشغيل Linux من Veeam على نظام التشغيل Elbrus. إحلال الواردات ['؟' | '.' | '!']

أثناء تحديد المنطقة الزمنية، أدركت فجأة أن النظام يستخدم عملية تمهيد init، وأنا أعمل من TTY0.

النسخ الاحتياطي لنظام التشغيل Linux من Veeam على نظام التشغيل Elbrus. إحلال الواردات ['؟' | '.' | '!']

حسنًا، فلنصنف "Elbrus" كمجتمع المؤمنون القدامى[سيتم تحديده لاحقًا]. من حيث المبدأ، هذا أمر جيد: لا تحتاج إلى طلب الكود المصدري لمعرفة كيفية عمل عملية التنزيل، حيث أن كل شيء مكتوب.

الباقي غير مهم تقريبًا: لقد وضعنا كل شيء واتفقنا. على طول الطريق، نكتشف أن النواة مستخدمة 3.14.79-13.84. حسنًا، كان لدى Debian 7 3.2 [سيتم تحديده لاحقًا].

بعد ذلك، حدد تقسيم القرص الافتراضي و... نرى تحذيرًا:

النسخ الاحتياطي لنظام التشغيل Linux من Veeam على نظام التشغيل Elbrus. إحلال الواردات ['؟' | '.' | '!']

حسنًا، بطريقة ما، لم يكن التقسيم التلقائي متوافقًا بشكل جيد مع قرص سعة 32 جيجا. لم أغير القرص، بل أكملت المهمة بتقسيم القرص يدويًا بأسلوب "الكل في واحد". اضطررت إلى تثبيت ext3، نظرًا لأن /boot لا يمكن أن يكون في ext4.
وجاء النظام دون وقوع حوادث.

المرحلة الثانية - البحث عن البدائل.
بعد البحث في محتويات القرص الثاني، أدركت أن هذا مستودع يحتوي على ملفات إضافية. في الحزم. وبالنظر إلى /etc/apt/sources.list، أدركت أنه يجب تثبيته في /mnt/cdrom. لكنني لم أجد /etc/os-release. ولكن يوجد إصدار /etc/mcst بمحتويات 3.0-rc36. ربما يكون الإصدار 3.0 هو الإصدار - يبدو مناسبًا، لكن rc36؟ بشكل عام، من المرجح ألا تتمكن برامج الطرف الثالث من التعرف على هذا التوزيع بالطريقة الكلاسيكية.

في قسم الجذر، لفت انتباهي الدليل /mcst، وهناك، بقلب غارق، اكتشفت /mcst/backup. أي أن هناك أداة نسخ احتياطي، وهي مدمجة في النظام! "رائع،" فكرت، "دعونا نرى كيف يعمل هذا!"

اتضح أن هناك برنامج نصي bash 4Kb /mcst/bin/backup يوفر نسخ الملفات. بشكل افتراضي - إلى الدليل /mcst/backup. كنت أتوقع أن أرى الأمر rsync في الكود المصدري، ولكنه ليس في التكوين الافتراضي. يقوم البرنامج النصي ببساطة بنسخ الملفات. يبدو الأمر كالتالي:

cp -rpdx <file backup> <file>

الملف بأكمله /mcst/bin/backup موجود هناأحذرك على الفور من أن هذا البرنامج النصي وحده لا يكفي لفهمه بالكامل. فهو يسحب الوظائف من /mcst/bin/source، وهو ما يشبه مكتبة الوظائف. لم أقم بتضمينه (44 كيلو بايت).

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

على الرغم من أنني ربما لم أفهم شيئًا ما؟ ربما يستطيع شخص ما أن يشرح في التعليقات: كيف يضمن هذا البرنامج النصي نسخًا احتياطيًا آمنًا وموثوقًا للبيانات؟ [سيتم تحديده لاحقًا]

بالمناسبة، يتم تضمين rsync في الوظيفة الإضافية. المستودعات. الإصدار 3.1.3. أعتقد أن استخدام rsync لا يزال بديلاً أفضل لتطبيق /mcst/bin/backup.

بعد ذلك، قررت أن أضع واحدة جديدة وكيل Veeam لنظام التشغيل Linux. سوف يسأل أحدهم: ما علاقة Veeam واستبدال الاستيراد بالموضوع؟ نعم هو غير موجود في السجل ولكنه معتمد من FSTEC مما يعني أنه في حالة عدم وجود بدائل يمكن استخدامه. قضاء خمسة عشر دقيقة على البدائل من سجل، تمكنت من العثور على 3 روابط لكلمة "احتياطي" (لا شيء يتعلق بسؤالي عن كلمة "احتياطي"). لم أقم بإجراء تحليل عميق لهذه البرامج، لذلك لن أحاول الحكم على مدى ملاءمتها للنسخ الاحتياطي للأجهزة التي تعمل بنظام التشغيل Linux. من يحتاجها سيرسم استنتاجه الخاص ويشاركه في التعليقات.

الخطوة الثالثة - تثبيت Veeam Agent لنظام التشغيل Linux.
لذلك، يتكون Veeam Agent لنظام التشغيل Linux من حزمتين: وحدة veeamsnap kernel (بالمناسبة، المصدر هنا) ورمز مساحة المستخدم الخاص في شكل حزمة veeam.

كانت هناك مشكلة صغيرة في تثبيت وحدة kernel - حزمة dkms المفقودة. هذه خدمة تتيح لك إنشاء وحدات kernel من المصدر. وكقاعدة عامة، فهو متاح في جميع توزيعات deb. اضطررت إلى تنزيله من مستودع deb لجهة خارجية. الشيء الوحيد الذي أسعدني هو أن الحزمة لا تعتمد على البنية، لذا فهي تناسب الحزمة الأصلية. لماذا لم يتم إدراجه في قائمة الحزم المتوفرة، أو بالأحرى لم يتم تطويره [سيتم تحديده لاحقًا]؟ ربما من المفترض أنه لا ينبغي لأحد إنشاء وتشغيل أي وحدات نمطية غير تابعة لـ MCST. يوجد بالفعل تناقض هنا - نظرًا لوجود رؤوس Linux. أي أنه يمكن تجميع الوحدة يدويًا، إذا رغبت في ذلك، وتشغيلها بواسطة برنامج نصي عند بدء تشغيل الجهاز. أعتقد أنه لا ينبغي عليك توقع تحديثات متكررة من MCST [سيتم تحديده لاحقًا].

"حسنًا، تم تثبيت الوحدة - انتهى الجزء الأصعب،" فكرت... حزمة veeam لمستودع deb مخصصة لمنصة amd64، ونظام التشغيل Elbrus لديه منصة x86_64 [سيتم تحديدها لاحقًا]. الفرق، بالطبع، هو فقط في الاسم، ولكن هذا الاختلاف يجعل جميع الحزم تقريبًا من مستودعات deb التابعة لجهات خارجية غير متوافقة مع نظام التشغيل Elbrus. يمكن التخلص من سوء الفهم المزعج هذا ببساطة: ما عليك سوى تفكيك الحزمة وتصحيح المعلومات المتعلقة بالهندسة المعمارية وإعادة تجميعها مرة أخرى. كيف افعلها بحثت في جوجل عنه فورا.

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

مشكلة أخرى هي التبعيات. يبدو أن الملفات الضرورية موجودة، لكن الحزم ليست كذلك. وكان الانطباع أن أسماء الطرود تختلف عن "نظيراتها المستوردة". ربما يتم تعبئة المكتبات بشكل مختلف. لم أخوض في الكثير من التفاصيل، وقمت بإزالة جميع التبعيات تقريبًا، واستمر التثبيت.

ثم ظهرت مشاكل مع رمز بدء الخدمة. كان البرنامج النصي /lib/init/vars.sh مفقودًا. لسبب ما، يدير Elbrus الأمور بدونه، لذلك سنقوم بإزالته أيضًا. بعد ذلك، كان علينا استبدال وظيفة إخراج الرسالة: كانت وظيفتا log_daemon_msg وlog_end_msg مفقودتين. بعد البحث في الملف /lib/lsb/init-functions، وجدت الدالة log_success_msg - وستكون مفيدة لنا لإجراء التجارب. بالمناسبة، في ملف /lib/lsb/init-functions، يوجد السطر "# Source SuSE`s rc jobs" في بداية الملف [TBD].

بعد هذه المعالجة التقريبية للحزمة مع الملف، تم إطلاق النسخة الاحتياطية للجهاز بالكامل على مشاركة NFS بنجاح. كان التثبيت الاحتياطي ناجحًا أيضًا. لذلك، أعتقد أنه من أجل عمل نسخة احتياطية لجهاز باستخدام Elbrus PDK، تم تنزيله "تمامًا بهذه الطريقة" دون أي التزامات، فإن Veeam Agent for Linux مناسب بالتأكيد. حتى بعد كل التعديلات مع الملف.

بالطبع، مجموعة توزيع Elbrus OS غير مدعومة رسميًا، لأنها غير مدرجة في قائمة المجموعات المدعومة. بالإضافة إلى ذلك، لم يتم اختبار Veeam Agent لنظام Linux عليه من قبل قسم ضمان الجودة، لذا فإن هؤلاء. لا يوجد دعم (على الأقل في وقت نشر المقال).

آمل أن يكون المقال مفيدًا لأولئك الذين يحاولون تنفيذ الأمر رقم 334 بتاريخ 29.06.2017 يونيو XNUMX. ملكي لك... [سيتم تحديده لاحقًا].

المصدر: www.habr.com

إضافة تعليق