# % Options Settings: https://orgmode.org/manual/Export-Settings.html
#+OPTIONS: timestamp:nil ^:nil <:nil p:t prop:t tags:t tasks:t todo:t
#+LATEX_CLASS: article
#+LaTeX_CLASS_OPTIONS: [a4paper,12pt]
#+LATEX_HEADER: \usepackage{booktabs}
# % to include pdf/eps/png files
#+LATEX_HEADER: \usepackage{indentfirst}
#+LATEX_HEADER: \usepackage{graphicx}
# % useful to add 'todo' markers
#+LaTeX_HEADER: \usepackage{todonotes}
#+LaTeX_HEADER: \setlength{\marginparwidth}{2cm} % fix todonotes warning
# % hyperrefs
#+LaTeX_HEADER: \usepackage{hyperref}
# % ----------------- Code blocks ----------------
# % Dependencies: pip install pygments
# % nice source code formatting
#+LaTeX_HEADER: \usepackage{xcolor}
#+LaTeX_HEADER: \definecolor{bg}{rgb}{0.98,0.98,0.98}
#+LaTeX_HEADER: \usepackage[cache=false]{minted}
#+LaTeX_HEADER: \setminted{
#+LaTeX_HEADER:   fontsize=\small,
#+LaTeX_HEADER:   baselinestretch=1,
#+LaTeX_HEADER:   xleftmargin=4em,
#+LaTeX_HEADER:   breaklines,
#+LaTeX_HEADER:   mathescape,
#+LaTeX_HEADER:   linenos,
#+LaTeX_HEADER:   numbersep=5pt,
#+LaTeX_HEADER:   frame=leftline,
#+LaTeX_HEADER:   framesep=2mm,
#+LaTeX_HEADER:   autogobble,
#+LaTeX_HEADER:   style=tango,
#+LaTeX_HEADER:   bgcolor=bg
#+LaTeX_HEADER: }
# % change style of section headings
#+LaTeX_HEADER: \usepackage{sectsty}
#+LaTeX_HEADER: \allsectionsfont{\sffamily}
# % only required for orgmode ticked TODO items, can remove
#+LaTeX_HEADER: \usepackage{amssymb}
# % only required for underlining text
#+LaTeX_HEADER: \usepackage[normalem]{ulem}
# % often use this in differential operators:
#+LaTeX_HEADER: \renewcommand{\d}{\ensuremath{\mathrm{d}}}
# % allow more reasonable text width for most documents than LaTeX default
#+LaTeX_HEADER: \setlength{\textheight}{21cm}
#+LaTeX_HEADER: \setlength{\textwidth}{16cm}
# % reduce left and right margins accordingly
#+LaTeX_HEADER: \setlength{\evensidemargin}{-0cm}
#+LaTeX_HEADER: \setlength{\oddsidemargin}{-0cm}
# % reduce top margin
#+LaTeX_HEADER: \setlength{\topmargin}{0cm}
# % references formats
#+LaTeX_HEADER: \usepackage[round]{natbib}
# % Chinese supported
#+LATEX_HEADER: \usepackage{ctex}
# % Increase default line spacing a little
#+LATEX_HEADER: \usepackage{setspace}
#+LATEX_HEADER: \renewcommand{\baselinestretch}{1.5}
#+LATEX_HEADER: \setlength{\parskip}{0.8em}
# % Line & paragraph space end
# % item list margin
#+LATEX_HEADER: \usepackage{enumitem}
# % Breaking Page Between Title and Toc
#+LATEX_HEADER: \makeatletter \def\@maketitle{\null \begin{center} {\vskip 5em \Huge \@title} \vskip 30em {\LARGE \@author} \vskip 3em {\LARGE \@date} \end{center} \newpage} \makeatother
# % End of Breaking Page Between Title and Toc
#+LATEX_HEADER: \renewcommand\contentsname{目录}
# Generate Tex File: C-c C-e l l; then replace verbatim with minted, and must special the code language
#+LATEX_HEADER: % Generate PDF: xelatex -shell-escape <tex file>
#+AUTHOR: jouyouyun
#+EMAIL: yanbowen717@gmail.com
#+TITLE: 使用方法

#+latex: \newpage
** deepin-upgrade-manager
此命令必须使用 =root= 权限执行，可用参数：
#+begin_src shell
Usage of ./deepin-upgrade-manager:
  -action string
    	available actions: check, list, get, install, respond, rollback
  -config string
    	the upgrader configuration file (default "/osroot/os/config.json")
  -daemon
    	launch as dbus service (default true)
  -debug
    	debug mode
  -filename string
    	the upgrade file path
  -limit int
    	the max of version list (default 5)
  -mode string
    	the upgrade mode: full, incremental
  -offset int
    	the version list offset
  -response
    	the os state response (default true)
  -version string
#+end_src

+ 列出本地 repo 信息

  #+begin_src shell
  # deepin-upgrade-manager --config=<config path> --daemon=false --debug=true --action=list
  #+end_src
+ 检查更新

  #+begin_src shell
  # deepin-upgrade-manager --config=<config path> --daemon=false --debug=true --action=check --offset=<num> --limit=<max>
  #+end_src

  =offset= 表示远程 =repo= 中的 =version= 的开始索引，默认为 0； =limit= 表示本次返回的列表的最大长度，默认为 5 。
+ 获取更新文件地址

  #+begin_src shell
  # deepin-upgrade-manager --config=<config path> --daemon=false --debug=true --action=get --version=<remote version> --mode=<full/incremental>
  #+end_src

  =remote version= 必须在 =check= 命令返回的列表中； =mode= 为更新模式，必须指定。

  增量模式时，开始版本为 =local repo= 中的最新版本。

  若服务端没有相应的缓存文件，则服务端进行文件生成任务，返回等待时间，客户端等待一段时间后继续此操作。
+ 安装更新文件

  #+begin_src shell
  # deepin-upgrade-manager --config=<config path> --daemon=false --debug=true --action=install --filename=<upgrade filepath>
  #+end_src
+ 更新确认

  #+begin_src shell
  # deepin-upgrade-manager --config=<config path> --daemon=false --debug=true --action=respond --repsponse=<true/false>
  #+end_src

  此命令用于确认本次更新是否正常。
+ 回滚系统

  #+begin_src shell
  # deepin-upgrade-manager --config=<config path> --daemon=false --debug=true --action=rollback --version=<local version>
  #+end_src

  =version= 必须在 =list= 命令返回的列表中。

** deepin-os-combiner
此命令必须以 =root= 权限执行，可用参数：
#+begin_src shell
Usage of ./deepin-os-combiner:
  -config string
    	the upgrader configuration file (default "/osroot/os/config.json")
  -root string
    	the root dir (default "/")
  -version string
    	the version for rollback
#+end_src

+ 合成系统

  #+begin_src shell
  # deepin-os-combiner --config=<config path> --root=<root filesystem path> --version=<local version>
  #+end_src

  =version= 必须在 =list= 命令返回的列表中。

** 测试
本段将介绍如何构建原子更新的测试环境，用于测试整体功能。

*** Build
#+begin_src shell
make
make server
#+end_src

需要构建服务端程序。

*** 构建 remote repo

参见 [[./build_remote_repo.org][构建 remote repo]] 。

*** 启动 Server
假定 =remote repo= 的路径为 =/data/server/os/repo= ，服务 =IP= 为 =10.20.1.132= ，端口为 =9090= ，主机上已安装 =ostree, zstd, tar, squashfs-tools= 。

配置文件路径为 =/data/server/os/server.json= ，内容为：
#+begin_src json
{
    "config_version": "1.0",
    "distribution": "v23",
    "compression": "zstd",
    "sign_alg": "sha256",
    "repo_dir": "/data/server/os/repo",
    "cache_dir": "/data/server/os/cache",
    "address": "0.0.0.0",
    "port": 9090,
    "retry_seconds": 30
}
#+end_src

配置文件中涉及的目录必须存在。

执行命令 ~./deepin-upgrade-server --config=/data/server/os/server.json~ 启动服务。

*** 构建 local repo
假定 =local repo= 的路径为 =/data/os/repo= ， =remote repo= 的第一个版本为 =20211220.1.0= 。
配置文件为 =/data/os/config.json= ，内容为：
#+begin_src json
{
    "config_version": "1.0",
    "repo_dir": "/data/os/repo",
    "snapshot_dir": "/data/os/snapshot",
    "cache_dir": "/data/os/cache",
    "vendor_dir": "/data/os/vendor",
    "os_dir": "/data/os/root",
    "active_version": "",
    "compression": "zstd",
    "sign_alg": "sha256",
    "server": {
        "distribution": "v23",
        "host": "http://10.20.1.132:9090",
        "upgrade_route": "/v0/upgrade",
        "version_route": "/v0/version"
    }
}
#+end_src

配置文件中涉及的目录必须存在。

执行 ~ostree --repo=/data/os/repo init~ 初始化 =local repo= ，通过
~sudo ./deepin-upgrade-manager --config=/data/os/config.json --daemon=false --action=get --mode=full --version=20211220.1.0~
获取第一个版本的全量数据的下载链接。

然后下载文件，保存于 =/data/os/cache/20211220.1.0.tar.zst= ，执行：
~sudo ./deepin-upgrade-manager --config=/data/os/config.json --daemon=false --debug=true --action=install --filename=20211220.1.0.tar.zst~
安装初始版本。

完成 =local repo= 构建后，即可按照帮助文档进行使用。
