Sao lưu Linux từ Veeam trên hệ điều hành Elbrus. Thay người ['?' | '.' | '!']

Xin chào tất cả mọi người.
Các bài viết gần đây về Habré Thực tế thay thế nhập khẩu Phần 1. Tùy chọn и Nhạc không được phát trong thời gian dài... hoặc Elbrus OS không bao giờ trở nên miễn phí đã không để tôi thờ ơ. Tôi quyết định nghiên cứu vấn đề này trong bối cảnh nhiệm vụ sao lưu. Hơn nữa, trong bài viết này Các sản phẩm của Veeam Software được đề cập, điều đó có nghĩa là vấn đề có thể liên quan cụ thể đến bối cảnh thay thế nhập khẩu.

Sao lưu Linux từ Veeam trên hệ điều hành Elbrus. Thay người ['?' | '.' | '!']
nguồn ảnh gốc

Trước hết, tôi quyết định tải xuống hệ điều hành Elbrus, hay nói đúng hơn là chỉ tải xuống bản phân phối có sẵn cho kiến ​​​​trúc x86_64, xem cách nó hoạt động và thử cài đặt Veeam Agent cho Linux trên đó. Nếu bạn muốn biết điều gì xảy ra, hãy xem cat.

Vì vậy, có một chút lạc đề, phòng trường hợp ai đó không biết. "Elbrus" là vậy đó bộ xử lý với một hệ thống lệnh khá cụ thể. Ngoài ra còn có phần mềm Elbrus OS. Và - trái với niềm tin phổ biến - để vận hành Elbrus OS, không nhất thiết phải có hệ thống phần cứng dựa trên bộ xử lý Elbrus. Có “PDK “Elbrus” dành cho x86” - trên thực tế, nó đã xuất hiện trong phạm vi công cộng dưới dạng đĩa cài đặt. Nhân tiện, có một chú thích cuối trang “PDK - bộ công cụ phát triển nền tảng, bộ công cụ dành cho nhà phát triển” - thật tuyệt, điều đó có nghĩa là có ít nhất một trình biên dịch ở đó.

Một cuộc rút lui bắt buộc nhỏ khác. Thực tế là tôi đã từng xử lý các phần mềm trong nước, chẳng hạn như MSVS và Baguette RTOS. Tôi đã có kinh nghiệm làm việc với các linh kiện trong nước, bao gồm cả bộ xử lý của MCST. Vì vậy, tôi có thể nói với toàn bộ trách nhiệm rằng có một số đặc thù nhất định trong lĩnh vực này và tôi sẽ cố gắng không đề cập đến nó trong bài viết. Khi thực sự muốn, tôi sẽ gắn thẻ [TBD]. Vì vậy, chúng tôi sẽ cố gắng làm mà không bị troll và rên rỉ tầm thường. Cuối cùng, cần phải hiểu ngành công nghiệp quốc phòng và các cơ quan chính phủ của Nga. Nước lớn - ngân sách nhỏ.. [TBD].

Giai đoạn không - Tải xuống. Đáng chú ý là thông tin hệ điều hành Elbrus ra mắt đã gây ra tiếng vang lớn đến mức máy chủ phân phối ngừng hoạt động. [TBD] Cảm ơn Yandex và người kỹ sư đã nghĩ đến việc chuyển nó đến đó. Vì vậy tốc độ tải xuống là tốt.

Giai đoạn đầu tiên - cài đặt. Tôi đã cài đặt nó trên bộ ảo hóa đầu tiên được sử dụng miễn phí. Tôi đã phân bổ hai lõi, một vài hợp đồng RAM, 32 MB cho video (tôi nghĩ sẽ có giao diện đồ họa). Đĩa vẫn như bình thường - 32 GB.
Tôi bắt đầu cài đặt. Tôi không sử dụng hướng dẫn cài đặt nên không thể bình luận về nó. Giao diện cài đặt TUI rất tối giản.

Sao lưu Linux từ Veeam trên hệ điều hành Elbrus. Thay người ['?' | '.' | '!']
Tuyệt, chúng ta có thể làm việc mà không cần chuột.

Tôi đã quản lý được cửa sổ tiếp theo trong lần thử thứ hai. Tại sao không chọn thiết bị mặc định sr0 [TBD] khi cài đặt từ đĩa?
Chọn nguồn CD-ROM và tiếp tục.

Sao lưu Linux từ Veeam trên hệ điều hành Elbrus. Thay người ['?' | '.' | '!']

Trong khi chọn múi giờ, tôi chợt nhận ra rằng hệ thống sử dụng quy trình khởi động init và tôi đang làm việc từ TTY0.

Sao lưu Linux từ Veeam trên hệ điều hành Elbrus. Thay người ['?' | '.' | '!']

Được rồi, hãy phân loại “Elbrus” thành một cộng đồng Những tín đồ cũ[TBD]. Về nguyên tắc, điều này là tốt: bạn không cần yêu cầu mã nguồn để xem quá trình tải xuống hoạt động như thế nào vì mọi thứ đều đã được viết sẵn.

Phần còn lại gần như không quan trọng: chúng tôi đặt mọi thứ và đồng ý. Trong quá trình thực hiện, chúng tôi phát hiện ra rằng kernel được sử dụng là 3.14.79-13.84. Hmm, Debian 7 có 3.2 [TBD].

Tiếp theo, chọn phân vùng đĩa mặc định và... Chúng tôi thấy một cảnh báo:

Sao lưu Linux từ Veeam trên hệ điều hành Elbrus. Thay người ['?' | '.' | '!']

Hmm, bằng cách nào đó, việc phân vùng tự động không hoạt động tốt với đĩa 32 gig. Tôi không thay ổ đĩa mà hoàn thành nhiệm vụ phân vùng đĩa thủ công theo kiểu “tất cả trong một”. Tôi phải cài đặt ext3 vì /boot không thể ở ext4.
Hệ thống đã hoạt động mà không có sự cố.

Giai đoạn thứ hai - tìm kiếm các lựa chọn thay thế.
Sau khi lục lọi nội dung của đĩa thứ hai, tôi nhận ra rằng đây là một kho lưu trữ bổ sung. trong các gói. Và nhìn vào /etc/apt/sources.list, tôi nhận ra rằng nó cần được gắn vào /mnt/cdrom. Nhưng tôi không tìm thấy /etc/os-release. Nhưng có /etc/mcst-version với nội dung 3.0-rc36. 3.0 có lẽ là phiên bản - nó có vẻ phù hợp, nhưng RC36? Nhìn chung, phần mềm của bên thứ ba rất có thể sẽ không thể nhận ra bản phân phối này theo cách cổ điển.

Trong phân vùng gốc, thư mục /mcst thu hút sự chú ý của tôi, và ở đó, tôi thót tim khi phát hiện ra /mcst/backup. Tức là có một công cụ sao lưu và được tích hợp sẵn trong hệ thống! “Tuyệt,” tôi nghĩ, “Hãy xem nó hoạt động như thế nào!”

Hóa ra có một tập lệnh bash 4Kb /mcst/bin/backup cung cấp tính năng sao chép tệp. Theo mặc định - vào thư mục /mcst/backup. Trong mã nguồn tôi mong đợi sẽ thấy lệnh rsync nhưng nó không có trong cấu hình mặc định. Kịch bản chỉ đơn giản là sao chép các tập tin. Lệnh trông giống như thế này:

cp -rpdx <file backup> <file>

Toàn bộ tập tin /mcst/bin/backup có ở đâyTôi cảnh báo ngay với bạn rằng chỉ riêng kịch bản này là không đủ để hiểu đầy đủ. Nó lấy các hàm từ /mcst/bin/source, giống như một thư viện hàm. Tôi không bao gồm nó (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

Mặc dù, có lẽ tôi đã không hiểu điều gì đó? Có lẽ ai đó có thể giải thích trong phần nhận xét: tập lệnh này đảm bảo sao lưu dữ liệu an toàn và đáng tin cậy như thế nào? [TBD]

Nhân tiện, rsync được bao gồm trong tiện ích bổ sung. kho lưu trữ. Phiên bản 3.1.3. Tôi nghĩ sử dụng rsync vẫn là giải pháp thay thế tốt hơn cho ứng dụng /mcst/bin/backup.

Tiếp theo, tôi quyết định đặt một cái mới Đại lý Veeam cho Linux. Có người sẽ hỏi: “Veeam và việc thay thế nhập khẩu có liên quan gì đến nó?” Có, nó không có trong sổ đăng ký, nhưng nó được chứng nhận bởi FSTEC, có nghĩa là nó có thể được sử dụng trong trường hợp không có lựa chọn thay thế. Dành mười lăm phút cho các lựa chọn thay thế từ đăng ký, tôi có thể tìm thấy 3 liên kết cho từ “sao lưu” (không có liên kết nào liên quan đến câu hỏi của tôi về từ “dự trữ”). Tôi chưa phân tích sâu về các chương trình này, vì vậy tôi sẽ không đánh giá mức độ phù hợp của chúng để sao lưu các máy chạy Linux. Ai cần thì tự rút ra kết luận và chia sẻ ở phần bình luận nhé.

giai đoạn ba — cài đặt Veeam Agent cho Linux.
Vì vậy, Veeam Agent cho Linux bao gồm hai gói: mô-đun hạt nhân veeamsnap (nhân tiện, nguồn ở đây) và mã không gian người dùng độc quyền ở dạng gói veeam.

Có một vấn đề nhỏ khi cài đặt mô-đun hạt nhân - gói dkms bị thiếu. Đây là dịch vụ cho phép bạn xây dựng các mô-đun hạt nhân từ nguồn. Theo quy định, nó có sẵn trên tất cả các bản phân phối deb. Tôi đã phải tải xuống từ kho lưu trữ gỡ lỗi của bên thứ ba. Một điều làm tôi hài lòng là gói này không phụ thuộc vào kiến ​​trúc nên phù hợp như gói gốc. Tại sao nó không được đưa vào danh sách các gói có sẵn, hay nói đúng hơn là không được phát triển [TBD]? Có lẽ người ta cho rằng không ai nên xây dựng và chạy bất kỳ mô-đun hạt nhân nào không phải MCST. Thực sự có sự khác biệt ở đây - vì có các tiêu đề linux. Nghĩa là, mô-đun, nếu muốn, có thể được lắp ráp bằng tay và khởi chạy bằng tập lệnh khi máy khởi động. Tôi nghĩ bạn không nên mong đợi những cập nhật thường xuyên từ MCST [TBD].

“OK, mô-đun đã được cài đặt - phần khó nhất đã qua,” tôi nghĩ... Gói veeam cho kho lưu trữ deb dành cho nền tảng AMD64 và Hệ điều hành Elbrus có nền tảng x86_64 [TBD]. Tất nhiên, sự khác biệt chỉ nằm ở cái tên, nhưng sự khác biệt này khiến hầu hết tất cả các gói từ kho gỡ lỗi của bên thứ ba không tương thích với Elbrus OS. Sự hiểu lầm khó chịu này có thể được loại bỏ một cách đơn giản: chỉ cần tháo rời gói, sửa thông tin về kiến ​​trúc và đặt nó lại với nhau. Làm thế nào để làm nó Google nó ngay lập tức.

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

Một vấn đề khác là sự phụ thuộc. Các tập tin cần thiết dường như có ở đó, nhưng các gói thì không. Ấn tượng là tên của các gói khác với "các gói tương tự được nhập khẩu" của chúng. Có lẽ các thư viện được đóng gói khác nhau. Tôi không đi sâu vào chi tiết, loại bỏ gần như tất cả các phần phụ thuộc và quá trình cài đặt vẫn tiếp tục.

Sau đó, vấn đề nảy sinh với mã bắt đầu dịch vụ. Tập lệnh /lib/init/vars.sh bị thiếu. Vì lý do nào đó, Elbrus quản lý mà không có nó nên chúng tôi cũng sẽ loại bỏ nó. Tiếp theo, chúng tôi phải thay thế chức năng xuất thông báo: thiếu chức năng log_daemon_msg và log_end_msg. Sau khi lục lọi trong tệp /lib/lsb/init-functions, tôi đã tìm thấy hàm log_success_msg - nó sẽ tốt cho chúng ta khi thử nghiệm. Nhân tiện, trong tệp /lib/lsb/init-functions, dòng “# Source SuSE`s rc function” nằm ở đầu tệp [TBD].

Sau khi xử lý sơ bộ gói bằng một tệp như vậy, bản sao lưu toàn bộ máy trên chia sẻ NFS đã được khởi chạy thành công. Việc gắn kết dự phòng cũng thành công. Vì vậy, tôi tin rằng để sao lưu máy bằng Elbrus PDK, được tải xuống “cứ như vậy” mà không có bất kỳ nghĩa vụ nào, Veeam Agent cho Linux chắc chắn là phù hợp. Ngay cả sau tất cả các sửa đổi với một tệp.

Tất nhiên, bộ phân phối Elbrus OS không được hỗ trợ chính thức vì nó không nằm trong danh sách những bộ được hỗ trợ. Ngoài ra, Veeam Agent cho Linux chưa được bộ phận QA thử nghiệm trên nó, vì vậy những điều đó. không có hỗ trợ (ít nhất là tại thời điểm xuất bản bài viết).

Hy vọng bài viết sẽ hữu ích cho những ai đang nỗ lực thực hiện Lệnh số 334 ngày 29.06.2017/XNUMX/XNUMX. Của tôi cho bạn... [TBD].

Nguồn: www.habr.com

Thêm một lời nhận xét