您好!
关于哈布雷的最新文章
首先,我决定下载 Elbrus OS,或者更确切地说,仅下载 x86_64 架构的可用发行版,看看它是如何工作的,并尝试在其上安装 Veeam Agent for Linux。 如果你想知道这是怎么回事,请看猫。
所以,题外话,以防有人不知道。 “厄尔布鲁士峰”就是这样
又是一次小规模的被迫撤退。 事实是我曾经接触过国产软件,比如MSVS、Baguette RTOS。 我有使用国产组件的经验,包括 MCST 的处理器。 因此,我可以负责任地说,这个领域有一定的特殊性,我会尽量不在文章中触及它。 当我真的想要的时候,我会贴上标签[TBD]。 因此,我们将尽量避免公然的恶搞和平庸的抱怨。 最后,俄罗斯国防工业和政府机构需要被理解。 大国 - 小预算..[待定]。
零阶段 - 下载。 值得注意的是,Elbrus操作系统上线的消息引起了轩然大波,甚至导致分发服务器瘫痪。 [TBD] 感谢 Yandex 和考虑将其移至此处的工程师。 所以下载速度还是不错的。
第一阶段 - 安装。 我将其安装在第一个可供免费使用的虚拟机管理程序上。 我分配了两个核心、几GB RAM、32 MB 用于视频(我想会有一个图形界面)。 磁盘与往常一样 - 32 GB。
我开始安装。 我没有使用安装说明,所以无法评论。 TUI 安装界面极其简约。
好吧,太好了,我们可以不用鼠标了。
我在第二次尝试中成功进入了下一个窗口。 从磁盘安装时为什么不选择默认设备 sr0 [TBD]?
选择 CD-ROM 源并继续。
在选择时区时,我突然意识到系统使用了init引导进程,而我正在从TTY0工作。
好的,那么我们将“Elbrus”归类为一个社区
其余的几乎不重要:我们把一切都放在一起并达成一致。 一路上我们发现使用的内核是3.14.79-13.84。 嗯,Debian 7 有 3.2 [TBD]。
接下来,选择默认磁盘分区并...我们看到一条警告:
嗯,不知何故,自动分区不能很好地处理 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 认证,这意味着在没有替代方案的情况下可以使用它。 花十五分钟寻找替代方案
第三阶段 — 安装适用于 Linux 的 Veeam Agent。
因此,Veeam Agent for Linux 由两个软件包组成: veeamsnap 内核模块(顺便说一下,
安装内核模块时遇到一个小问题 - 缺少 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