Elbrus 操作系统上来自 Veeam 的 Linux 备份。 导入替换 ['?' | '.' | '!']

您好!
关于哈布雷的最新文章 实践中的进口替代。 第 1 部分. 选项 и 音乐没有播放很长时间……或者厄尔布鲁士操作系统从未免费 并没有让我无动于衷。 我决定在备份任务的背景下研究这个问题。 此外,在 本文 提到了 Veeam Software 产品,这意味着该问题可能与进口替代相关。

Elbrus 操作系统上来自 Veeam 的 Linux 备份。 导入替换 ['?' | '.' | '!']
原始图像来源

首先,我决定下载 Elbrus OS,或者更确切地说,仅下载 x86_64 架构的可用发行版,看看它是如何工作的,并尝试在其上安装 Veeam Agent for Linux。 如果你想知道这是怎么回事,请看猫。

所以,题外话,以防有人不知道。 “厄尔布鲁士峰”就是这样 处理器 有一个相当具体的命令系统。 除此之外,还有 Elbrus OS 软件。 而且,与普遍的看法相反,要运行 Elbrus 操作系统,并不需要拥有基于 Elbrus 处理器的硬件系统。 有“PDK “Elbrus” for x86” - 事实上,它以安装盘的形式出现在公共领域。 顺便说一句,有一个脚注“PDK - 平台开发套件,开发人员套件” - 太棒了,这意味着那里至少有一个编译器。

又是一次小规模的被迫撤退。 事实是我曾经接触过国产软件,比如MSVS、Baguette RTOS。 我有使用国产组件的经验,包括 MCST 的处理器。 因此,我可以负责任地说,这个领域有一定的特殊性,我会尽量不在文章中触及它。 当我真的想要的时候,我会贴上标签[TBD]。 因此,我们将尽量避免公然的恶搞和平庸的抱怨。 最后,俄罗斯国防工业和政府机构需要被理解。 大国 - 小预算..[待定]。

零阶段 - 下载。 值得注意的是,Elbrus操作系统上线的消息引起了轩然大波,甚至导致分发服务器瘫痪。 [TBD] 感谢 Yandex 和考虑将其移至此处的工程师。 所以下载速度还是不错的。

第一阶段 - 安装。 我将其安装在第一个可供免费使用的虚拟机管理程序上。 我分配了两个核心、几GB RAM、32 MB 用于视频(我想会有一个图形界面)。 磁盘与往常一样 - 32 GB。
我开始安装。 我没有使用安装说明,所以无法评论。 TUI 安装界面极其简约。

Elbrus 操作系统上来自 Veeam 的 Linux 备份。 导入替换 ['?' | '.' | '!']
好吧,太好了,我们可以不用鼠标了。

我在第二次尝试中成功进入了下一个窗口。 从磁盘安装时为什么不选择默认设备 sr0 [TBD]?
选择 CD-ROM 源并继续。

Elbrus 操作系统上来自 Veeam 的 Linux 备份。 导入替换 ['?' | '.' | '!']

在选择时区时,我突然意识到系统使用了init引导进程,而我正在从TTY0工作。

Elbrus 操作系统上来自 Veeam 的 Linux 备份。 导入替换 ['?' | '.' | '!']

好的,那么我们将“Elbrus”归类为一个社区 老信徒[待定]。 原则上,这很好:您不需要询问源代码来查看下载过程如何工作,因为一切都是脚本化的。

其余的几乎不重要:我们把一切都放在一起并达成一致。 一路上我们发现使用的内核是3.14.79-13.84。 嗯,Debian 7 有 3.2 [TBD]。

接下来,选择默认磁盘分区并...我们看到一条警告:

Elbrus 操作系统上来自 Veeam 的 Linux 备份。 导入替换 ['?' | '.' | '!']

嗯,不知何故,自动分区不能很好地处理 32 GB 磁盘。 我没有更换磁盘;我以“一体式”方式通过手动磁盘分区完成了任务。 我必须安装 ext3,因为 /boot 不能在 ext4 中。
系统顺利启动。

第二阶段 - 寻找替代方案。
在翻阅第二个磁盘的内容后,我意识到这是一个带有附加内容的存储库。 在包裹中。 查看/etc/apt/sources.list,我意识到它需要安装在/mnt/cdrom中。 但我没有找到/etc/os-release。 但 /etc/mcst-version 的内容为 3.0-rc36。 3.0 可能是版本 - 看起来很合适,但是 rc36? 一般来说,第三方软件很可能无法以经典方式识别此发行版。

在根分区中,/mcst目录引起了我的注意,在那里,我心一沉,发现了/mcst/backup。 也就是说,有一个备份工具,而且是系统内置的! “太好了,”我想,“让我们看看这是如何运作的!”

原来,有一个4Kb的bash脚本/mcst/bin/backup提供文件复制功能。 默认情况下 - 到 /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

虽然,也许我没明白什么? 也许有人可以在评论中解释一下:这个脚本是如何保证数据备份安全可靠的? [待定]

顺便说一下,rsync 包含在该附加组件中。 存储库。 版本 3.1.3。 我认为使用 rsync 仍然是 /mcst/bin/backup 应用程序的更好替代方案。

接下来我决定放一张新的 适用于 Linux 的 Veeam 代理。 有人会问:“Veeam 和进口替代有什么关系?” 是的,它不在登记册中,但它已通过 FSTEC 认证,这意味着在没有替代方案的情况下可以使用它。 花十五分钟寻找替代方案 注册处,我找到了 3 个关于“备份”一词的链接(没有一个与我对“保留”一词的问题相关)。 我还没有对这些程序进行深入分析,因此我不会尝试判断它们是否适合备份运行 Linux 的机器。 有需要的人会得出自己的结论并在评论中分享。

第三阶段 — 安装适用于 Linux 的 Veeam Agent。
因此,Veeam Agent for Linux 由两个软件包组成: veeamsnap 内核模块(顺便说一下, 来源在这里)和 veeam 包形式的专有用户空间代码。

安装内核模块时遇到一个小问题 - 缺少 dkms 软件包。 这是一项允许您从源代码构建内核模块的服务。 通常,它在所有 deb 发行版上都可用。 我必须从第三方 deb 存储库下载它。 让我高兴的一件事是该包不依赖于架构,因此它像原生包一样适合。 为什么它没有包含在可用软件包列表中,或者更确切地说,没有开发[TBD]? 也许假设没有人应该构建和运行任何非 MCST 内核模块。 这里确实存在差异 - 因为有 linux-headers。 也就是说,如果需要,可以手动组装该模块,并在机器启动时通过脚本启动该模块。 我认为您不应该期望 MCST 会频繁更新 [TBD]。

“好的,模块已安装 - 最难的部分已经结束,”我想... deb 存储库的 veeam 软件包适用于 amd64 平台,而 Elbrus 操作系统有一个 x86_64 [TBD] 平台。 当然,区别仅在于名称,但这种区别使得来自第三方 deb 存储库的几乎所有软件包与 Elbrus 操作系统都不兼容。 这种恼人的误解可以简单地消除:只需拆开包装,更正有关架构的信息,然后将其放回原处即可。 怎么做 谷歌搜索了一下 即刻。

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] 文件的开头。

经过这样一个文件打包的粗略处理,NFS共享上的整机备份就成功启动了。 备份挂载也成功。 因此,我相信,如果要使用 Elbrus PDK 备份机器(“就像这样”下载而无需任何义务),Veeam Agent for Linux 绝对适合。 即使对文件进行了所有修改。

当然,Elbrus OS 发行套件并未得到正式支持,因为它未包含在受支持的列表中。 此外,QA 部门尚未对 Veeam Agent for Linux 进行测试,所以这些。 没有支持(至少在文章发表时)。

我希望这篇文章对那些试图执行 334 年 29.06.2017 月 XNUMX 日第 XNUMX 号命令的人有用。 我的给你...[待定]。

来源: habr.com

添加评论