Zypperコマンドの使い方

#1 はじめに
zypperコマンドの使い方だけを確認したかったので、コンテナを使って確認しました。

#2 環境
VMware Workstation 12 Player上のゲストマシンを使っています。

```
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

[root@server ~]# uname -r
3.10.0-514.el7.x86_64
```

#3 openSUSEコンテナの起動方法

```
Dockerをインストールする。
[root@server ~]# yum -y install docker

Dockerを起動する。
[root@server ~]# systemctl start docker

openSUSEのイメージをダウンロードする。
[root@server ~]# docker pull opensuse:latest
[root@server ~]# docker images opensuse
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
docker.io/opensuse   latest              04129f4661e6        12 days ago         108.2 MB

コンテナ(openSUSE)を起動する。
[root@server ~]# docker run -it --rm opensuse bash
bash-4.3#

zypperコマンドの版数を確認する。
bash-4.3# zypper --version
zypper 1.13.28
```


#4 リポジトリに関する操作

##4.1 リポジトリの表示に関する捜査
###4.1.1 リポジトリを簡潔に表示する方法(lr)

```
bash-4.3# zypper lr
Repository priorities are without effect. All enabled repositories share the same priority.

# | Alias          | Name           | Enabled | GPG Check | Refresh
--+----------------+----------------+---------+-----------+--------
1 | non-oss        | NON-OSS        | Yes     | ( p) Yes  | Yes
2 | oss            | OSS            | Yes     | ( p) Yes  | Yes
3 | oss-update     | OSS Update     | Yes     | ( p) Yes  | Yes
4 | update-non-oss | Update Non-Oss | Yes     | ( p) Yes  | Yess
```

###4.1.2 リポジトリのURIを表示する方法(lr -u)

```
admin:~ # zypper lr -u
Repository priorities are without effect. All enabled repositories share the same priority.

#  | Alias                     | Name                                    | Enabled | GPG Check | Refresh | URI                                                  
---+---------------------------+-----------------------------------------+---------+-----------+---------+---------------------------------------------------------------------------------------
 1 | openSUSE-Leap-42.3-0      | openSUSE-Leap-42.3-0                    | No      | ----      | ----    | cd:///?devices=/dev/disk/by-id/ata-VMware_Virtual_IDE_CDROM_Drive_10000000000000000001
 2 | repo-debug                | openSUSE-Leap-42.3-Debug                | No      | ----      | ----    | http://download.opensuse.org/debug/distribution/leap/42.3/repo/oss/
 3 | repo-debug-non-oss        | openSUSE-Leap-42.3-Debug-Non-Oss        | No      | ----      | ----    | http://download.opensuse.org/debug/distribution/leap/42.3/repo/non-oss/
 4 | repo-debug-update         | openSUSE-Leap-42.3-Update-Debug         | No      | ----      | ----    | http://download.opensuse.org/debug/update/leap/42.3/oss/
 5 | repo-debug-update-non-oss | openSUSE-Leap-42.3-Update-Debug-Non-Oss | No      | ----      | ----    | http://download.opensuse.org/debug/update/leap/42.3/non-oss/
 6 | repo-non-oss              | openSUSE-Leap-42.3-Non-Oss              | Yes     | (r ) Yes  | Yes     | http://download.opensuse.org/distribution/leap/42.3/repo/non-oss/
 7 | repo-oss                  | openSUSE-Leap-42.3-Oss                  | Yes     | (r ) Yes  | Yes     | http://download.opensuse.org/distribution/leap/42.3/repo/oss/
 8 | repo-source               | openSUSE-Leap-42.3-Source               | No      | ----      | ----    | http://download.opensuse.org/source/distribution/leap/42.3/repo/oss/
 9 | repo-source-non-oss       | openSUSE-Leap-42.3-Source-Non-Oss       | No      | ----      | ----    | http://download.opensuse.org/source/distribution/leap/42.3/repo/non-oss/
10 | repo-update               | openSUSE-Leap-42.3-Update               | Yes     | (r ) Yes  | Yes     | http://download.opensuse.org/update/leap/42.3/oss/   
11 | repo-update-non-oss       | openSUSE-Leap-42.3-Update-Non-Oss       | Yes     | (r ) Yes  | Yes     | http://download.opensuse.org/update/leap/42.3/non-oss/
```

##4.2 リポジトリを更新する方法(refresh)
```
bash-4.3# zypper refresh
Retrieving repository 'NON-OSS' metadata ...........................................................................[done]
Building repository 'NON-OSS' cache ................................................................................[done]
Retrieving repository 'OSS' metadata ...............................................................................[done]
Building repository 'OSS' cache ....................................................................................[done]
Retrieving repository 'OSS Update' metadata ........................................................................[done]
Building repository 'OSS Update' cache .............................................................................[done]
Retrieving repository 'Update Non-Oss' metadata ....................................................................[done]
Building repository 'Update Non-Oss' cache .........................................................................[done]
All repositories have been refreshed.
```

##4.3 リポジトリを追加する方法(ar)

リポジトリの追加は下記のように実行します。
`#` zypper ar [URL] [リポジトリ名]
ここでは、ossリポジトリを追加してみます。
リポジトリのURLについては、4.8を参照してください。

```
現在のリポジトリを確認する。
bash-4.3# zypper lr
Repository priorities are without effect. All enabled repositories share the same priority.

# | Alias          | Name           | Enabled | GPG Check | Refresh
--+----------------+----------------+---------+-----------+--------
1 | non-oss        | NON-OSS        | Yes     | (r ) Yes  | Yes
2 | oss-update     | OSS Update     | Yes     | (r ) Yes  | Yes
3 | update-non-oss | Update Non-Oss | Yes     | (r ) Yes  | Yes

ossリポジトリを追加する。
bash-4.3# zypper ar http://download.opensuse.org/distribution/leap/42.3/repo/oss oss
Adding repository 'oss' ............................................................................................................................[done]
Repository 'oss' successfully added

URI         : http://download.opensuse.org/distribution/leap/42.3/repo/oss
Enabled     : Yes
GPG Check   : Yes
Autorefresh : No
Priority    : 99 (default priority)

Repository priorities are without effect. All enabled repositories share the same priority.

リポジトリを確認する。ossリポジトリ(★)が追加されたことがわかる。
bash-4.3# zypper lr
Repository priorities are without effect. All enabled repositories share the same priority.

# | Alias          | Name           | Enabled | GPG Check | Refresh
--+----------------+----------------+---------+-----------+--------
1 | non-oss        | NON-OSS        | Yes     | (r ) Yes  | Yes
2 | oss ★         | oss            | Yes     | ( p) Yes  | No
3 | oss-update     | OSS Update     | Yes     | (r ) Yes  | Yes
4 | update-non-oss | Update Non-Oss | Yes     | (r ) Yes  | Yes

リポジトリの状態を更新する。ossリポジトリの状態が更新されたことがわかる。
bash-4.3# zypper ref
Repository 'NON-OSS' is up to date.
Retrieving repository 'oss' metadata ...............................................................................................................[done]
Building repository 'oss' cache ....................................................................................................................[done]
Retrieving repository 'OSS Update' metadata ........................................................................................................[done]
Building repository 'OSS Update' cache .............................................................................................................[done]
Retrieving repository 'Update Non-Oss' metadata ....................................................................................................[done]
Building repository 'Update Non-Oss' cache .........................................................................................................[done]
All repositories have been refreshed.
```

##4.4 リポジトリを削除する方法(rr)

```
"fonts"リポジトリを削除する。
bash-4.3# zypper rr fonts
Removing repository 'fonts' .........................................................................................................[done]
Repository 'fonts' has been removed.

リポジトリを確認する。"fonts"リポジトリが削除されたことがわかる。
bash-4.3# zypper lr
Repository priorities are without effect. All enabled repositories share the same priority.

# | Alias          | Name           | Enabled | GPG Check | Refresh
--+----------------+----------------+---------+-----------+--------
1 | non-oss        | NON-OSS        | Yes     | (r ) Yes  | Yes
2 | oss            | OSS            | Yes     | (r ) Yes  | Yes
3 | oss-update     | OSS Update     | Yes     | (r ) Yes  | Yes
4 | update-non-oss | Update Non-Oss | Yes     | (r ) Yes  | Yes
```


##4.5 リポジトリを自動更新する方法(modifyrepo -r)
```
"fonts"リポジトリの自動更新を有効にする。
bash-4.3# zypper modifyrepo -r fonts
Autorefresh has been enabled for repository 'fonts'.

リポジトリを確認する。"fonts"リポジトリの自動更新が有効になったことがわかる(★)。
bash-4.3# zypper lr
Repository priorities are without effect. All enabled repositories share the same priority.

# | Alias          | Name           | Enabled | GPG Check | Refresh
--+----------------+----------------+---------+-----------+--------
1 | fonts          | fonts          | Yes     | ( p) Yes  | Yes★
2 | non-oss        | NON-OSS        | Yes     | (r ) Yes  | Yes
3 | oss            | OSS            | Yes     | (r ) Yes  | Yes
4 | oss-update     | OSS Update     | Yes     | (r ) Yes  | Yes
5 | update-non-oss | Update Non-Oss | Yes     | (r ) Yes  | Yes
```


##4.6 リポジトリを無効にする方法(modifyrepo -d)

```
"fonts"リポジトリを無効にする。
bash-4.3# zypper modifyrepo -d fonts
Repository 'fonts' has been successfully disabled.

リポジトリを確認する。"fonts"リポジトリが無効(★)になったことがわかる。
bash-4.3# zypper lr
Repository priorities are without effect. All enabled repositories share the same priority.

# | Alias          | Name           | Enabled | GPG Check | Refresh
--+----------------+----------------+---------+-----------+--------
1 | fonts          | fonts          | No★    | ----      | ----
2 | non-oss        | NON-OSS        | Yes     | (r ) Yes  | Yes
3 | oss            | OSS            | Yes     | (r ) Yes  | Yes
4 | oss-update     | OSS Update     | Yes     | (r ) Yes  | Yes
5 | update-non-oss | Update Non-Oss | Yes     | (r ) Yes  | Yes

```

##4.7 リポジトリを有効にする方法(modifyrepo -e)

```
"fonts"リポジトリを有効にする。
bash-4.3# zypper modifyrepo -e fonts
Repository 'fonts' has been successfully enabled.

リポジトリを確認する。"fonts"リポジトリが有効(★)になったことがわかる。
bash-4.3# zypper lr
Repository priorities are without effect. All enabled repositories share the same priority.

# | Alias          | Name           | Enabled | GPG Check | Refresh
--+----------------+----------------+---------+-----------+--------
1 | fonts          | fonts          | Yes★   | ( p) Yes  | Yes
2 | non-oss        | NON-OSS        | Yes     | (r ) Yes  | Yes
3 | oss            | OSS            | Yes     | (r ) Yes  | Yes
4 | oss-update     | OSS Update     | Yes     | (r ) Yes  | Yes
5 | update-non-oss | Update Non-Oss | Yes     | (r ) Yes  | Yes
```


##4.8 現在のリポジトリ情報を取得する方法

```
リポジトリ情報をファイル(foo.repo)に保存する。
bash-4.3# zypper lr --export foo.repo
Repositories have been successfully exported to ./foo.repo.

ファイルに保存したリポジトリ情報を確認する。
non-oss,oss,oss-update,update-non-ossといったリポジトリのURL等の情報が確認できる。
bash-4.3# more foo.repo
[non-oss]
name=NON-OSS
enabled=1
autorefresh=1
baseurl=http://download.opensuse.org/distribution/leap/42.3/repo/non-oss/
path=/
type=yast2
keeppackages=0

[oss]
enabled=1
autorefresh=0
baseurl=http://download.opensuse.org/distribution/leap/42.3/repo/oss
type=yast2

[oss-update]
name=OSS Update
enabled=1
autorefresh=1
baseurl=http://download.opensuse.org/update/leap/42.3/oss/
path=/
type=rpm-md
keeppackages=0

[update-non-oss]
name=Update Non-Oss
enabled=1
autorefresh=1
baseurl=http://download.opensuse.org/update/leap/42.3/non-oss/
path=/
type=rpm-md
keeppackages=0
```


#5 パッケージに関する操作
##5.1 パッケージをインストールする方法(in）
"non-interactive"オプションを使うと、Yes/Noの問い合わせなしでパッケージをインストールできます。
yumコマンドの-yオプションに相当します。

```
keepalivedパッケージを確認する。
bash-4.3# zypper --non-interactive in keepalived
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following NEW package is going to be installed:
  keepalived

1 new package to install.
Overall download size: 190.8 KiB. Already cached: 0 B. After the operation, additional 569.3 KiB will be used.
Continue? [y/n/...? shows all options] (y): y
Retrieving package keepalived-1.2.15-6.17.x86_64                                                                     (1/1), 190.8 KiB (569.3 KiB unpacked)
Retrieving: keepalived-1.2.15-6.17.x86_64.rpm .........................................................................................[done (92.8 KiB/s)]
Checking for file conflicts: .......................................................................................................................[done]
(1/1) Installing: keepalived-1.2.15-6.17.x86_64 ....................................................................................................[done]
Additional rpm output:
Updating /etc/sysconfig/keepalived...
Failed to connect to bus: No such file or directory
Operation failed: No such file or directory

インストールしたkeepalivedの版数を確認する。
bash-4.3# keepalived --version
Keepalived v1.2.15 (07/08,2017)
```

##5.2 パッケージを削除する方法(rm)
non-interactiveモードでkeepalivedパッケージを削除します。

```
bash-4.3# zypper --non-interactive rm keepalived
-以下、略-
```

##5.3 パッケージを検索する方法(se)

```
bcパッケージを検索する。
"match-exact"オプションを使うことで、パッケージ名(bc)に正確に一致するものだけを検索します。
bash-4.3# zypper se -s --match-exact bc
Loading repository data...
Reading installed packages...

S | Name | Type    | Version       | Arch   | Repository
--+------+---------+---------------+--------+-----------
  | bc   | package | 1.06.95-11.13 | x86_64 | OSS
```


#6 ソースパッケージのインストール方法(si)

##6.1 ソースパッケージが存在するリポジトリの有効

```
リポジトリを確認する。bcのソースパッケージはrepo-sourceにあるが、現時点では無効(★)になっている。
server:~ # zypper lr
Repository priorities are without effect. All enabled repositories share the same priority.

#  | Alias                     | Name                                    | Enabled | GPG Check | Refresh
---+---------------------------+-----------------------------------------+---------+-----------+--------
 1 | openSUSE-Leap-42.3-0      | openSUSE-Leap-42.3-0                    | No      | ----      | ----
 2 | repo-debug                | openSUSE-Leap-42.3-Debug                | No      | ----      | ----
 3 | repo-debug-non-oss        | openSUSE-Leap-42.3-Debug-Non-Oss        | No      | ----      | ----
 4 | repo-debug-update         | openSUSE-Leap-42.3-Update-Debug         | No      | ----      | ----
 5 | repo-debug-update-non-oss | openSUSE-Leap-42.3-Update-Debug-Non-Oss | No      | ----      | ----
 6 | repo-non-oss              | openSUSE-Leap-42.3-Non-Oss              | Yes     | (r ) Yes  | Yes
 7 | repo-oss                  | openSUSE-Leap-42.3-Oss                  | Yes     | (r ) Yes  | Yes
 8 | repo-source               | openSUSE-Leap-42.3-Source               |★No     | ----      | ----
 9 | repo-source-non-oss       | openSUSE-Leap-42.3-Source-Non-Oss       | No      | ----      | ----
10 | repo-update               | openSUSE-Leap-42.3-Update               | Yes     | (r ) Yes  | Yes
11 | repo-update-non-oss       | openSUSE-Leap-42.3-Update-Non-Oss       | Yes     | (r ) Yes  | Yes

repo-sourceリポジトリを有効にする。
server:~ # zypper modifyrepo -e repo-source
Repository 'repo-source' has been successfully enabled.

リポジトリの状態を確認する。repo-sourceリポジトリが有効(★)になったことがわかる。
[server:~ # zypper lr
Repository priorities are without effect. All enabled repositories share the same priority.

#  | Alias                     | Name                                    | Enabled | GPG Check | Refresh
---+---------------------------+-----------------------------------------+---------+-----------+--------
 1 | openSUSE-Leap-42.3-0      | openSUSE-Leap-42.3-0                    | No      | ----      | ----
 2 | repo-debug                | openSUSE-Leap-42.3-Debug                | No      | ----      | ----
 3 | repo-debug-non-oss        | openSUSE-Leap-42.3-Debug-Non-Oss        | No      | ----      | ----
 4 | repo-debug-update         | openSUSE-Leap-42.3-Update-Debug         | No      | ----      | ----
 5 | repo-debug-update-non-oss | openSUSE-Leap-42.3-Update-Debug-Non-Oss | No      | ----      | ----
 6 | repo-non-oss              | openSUSE-Leap-42.3-Non-Oss              | Yes     | (r ) Yes  | Yes
 7 | repo-oss                  | openSUSE-Leap-42.3-Oss                  | Yes     | (r ) Yes  | Yes
 8 | repo-source               | openSUSE-Leap-42.3-Source               |★Yes    | (r ) Yes  | Yes
 9 | repo-source-non-oss       | openSUSE-Leap-42.3-Source-Non-Oss       | No      | ----      | ----
10 | repo-update               | openSUSE-Leap-42.3-Update               | Yes     | (r ) Yes  | Yes
11 | repo-update-non-oss       | openSUSE-Leap-42.3-Update-Non-Oss       | Yes     | (r ) Yes  | Yes
```


##6.2 ソースパッケージのインストール(si)

```
bcのソースパッケージをインストールする。
server:~ # zypper si bc
Reading installed packages...
Loading repository data...
Resolving package dependencies...

The following source package is going to be installed:
  bc

1 source package to install.
Overall download size: 294.8 KiB. Already cached: 0 B. After the operation, additional 293.0 KiB will be used.
Continue? [y/n/...? shows all options] (y): y
Retrieving srcpackage bc-1.06.95-11.13.noarch                                                                       (1/1)
Retrieving: bc-1.06.95-11.13.src.rpm ..............................................................................[done]
Checking for file conflicts: ......................................................................................[done]
(1/1) Installing: bc-1.06.95-11.13.src ............................................................................[done]
server:~ #

インストールしたパッケージは、/usr/src/packages配下にインストールされます。
server:~ # ls -F /usr/src/packages/
BUILD/  BUILDROOT/  RPMS/  SOURCES/  SPECS/  SRPMS/

```

##6.3 ソースの展開

```
server:/usr/src/packages/SPECS # pwd
/usr/src/packages/SPECS

server:/usr/src/packages/SPECS # ls
bc.spec

パッケージをビルドする。
server:/usr/src/packages/SPECS # rpmbuild -bp bc.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.NyC81L
+ umask 022
+ cd /usr/src/packages/BUILD
+ cd /usr/src/packages/BUILD
+ rm -rf bc-1.06.95
+ /usr/bin/bzip2 -dc /usr/src/packages/SOURCES/bc-1.06.95.tar.bz2
+ /bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd bc-1.06.95
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ echo 'Patch #1 (bc-1.06-dc_ibase.patch):'
Patch #1 (bc-1.06-dc_ibase.patch):
+ /usr/bin/cat /usr/src/packages/SOURCES/bc-1.06-dc_ibase.patch
+ /usr/bin/patch -p1 -b --suffix .dc_ibase --fuzz=0
patching file dc/numeric.c
Hunk #1 succeeded at 308 (offset 23 lines).
Hunk #2 succeeded at 327 (offset 23 lines).
Hunk #3 succeeded at 337 (offset 23 lines).
Hunk #4 succeeded at 354 (offset 23 lines).
+ echo 'Patch #2 (bc-1.06.95-memleak.patch):'
Patch #2 (bc-1.06.95-memleak.patch):
+ /usr/bin/cat /usr/src/packages/SOURCES/bc-1.06.95-memleak.patch
+ /usr/bin/patch -p1 -b --suffix .memleak --fuzz=0
patching file bc/bc.y
patching file bc/util.c
+ echo 'Patch #3 (bc-1.06.95-matlib.patch):'
Patch #3 (bc-1.06.95-matlib.patch):
+ /usr/bin/cat /usr/src/packages/SOURCES/bc-1.06.95-matlib.patch
+ /usr/bin/patch -p1 -b --suffix .matlib --fuzz=0
patching file bc/storage.c
+ echo 'Patch #4 (bc-1.06.95-sigintmasking.patch):'
Patch #4 (bc-1.06.95-sigintmasking.patch):
+ /usr/bin/patch -p1 -b --suffix .sigintmask --fuzz=0
+ /usr/bin/cat /usr/src/packages/SOURCES/bc-1.06.95-sigintmasking.patch
patching file dc/eval.c
patching file doc/dc.texi
+ exit 0
server:/usr/src/packages/SPECS #

ビルドしたソースはBUILD配下に作成されます。
server:/usr/src/packages/BUILD/bc-1.06.95 # pwd
/usr/src/packages/BUILD/bc-1.06.95

BUILD配下のファイルを確認する。BUILD配下にソースが展開されたことがわかる。
server:/usr/src/packages/BUILD/bc-1.06.95 # ls
AUTHORS      ChangeLog  INSTALL      NEWS    aclocal.m4   configure     depcomp  install-sh
COPYING      Examples   Makefile.am  README  bc           configure.in  doc      lib
COPYING.LIB  FAQ        Makefile.in  Test    config.h.in  dc            h        missing
```

#7 ソースパッケージのダウンロード方法
ここでは、ipsetパッケージのソースパッケージをダウンロードしてみます。
まず、rpmファイルの版数を確認します。

```console:版数確認
master:~ # rpm -qa|grep ipset
ipset-6.29-4.4.1.x86_64
```

src.rpmファイルをダウンロードします。

```console:src.rpmのダウンロード
master:~ # zypper in -t srcpackage -d ipset=6.29-4.4.1
(中略)

The following source package is going to be installed:
  ipset

1 source package to install.
Overall download size: 544.0 KiB. Already cached: 0 B. Download only.
Continue? [y/n/...? shows all options] (y): y
Retrieving srcpackage ipset-6.29-4.4.1.noarch                                                                                                  (1/1)
Retrieving: ipset-6.29-4.4.1.src.rpm ...........................................................................................[done (363.8 KiB/s)]
```

ダウンロードしたsrc.rpmファイルは、/var/cache/zypp配下に保存されるようです。

```console:ダウンロードしたsrc.rpmの確認
master:~ # find /var/cache -name "ipset*" -printf "%p %TY-%Tm-%Td %TH:%TM\n"
/var/cache/zypp/packages/repo-update/src/ipset-6.29-4.4.1.src.rpm 2018-11-27 16:41
```


#X 参考情報
[Zypper の使い方](https://ja.opensuse.org/SDB:Zypper_%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)
[openSUSE 13.2にパッケージリポジトリを追加する](http://note.kurodigi.com/opensuse132-addrepo/)
[追加のパッケージ・リポジトリ](https://ja.opensuse.org/%E8%BF%BD%E5%8A%A0%E3%81%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%83%BB%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA)

[SuSE パッケージ検索](https://software.opensuse.org/search)
[Package repositories](https://en.opensuse.org/Package_repositories)
[opensuse/distribution/openSUSE-current/repo/oss/suse/x86_64/](http://mirrors.kernel.org/opensuse/distribution/openSUSE-current/repo/oss/suse/x86_64/)
[第5章 SystemTap—システムデータのフィルタと分析](http://manual.geeko.cpon.org/ja/cha.tuning.systemtap.html)
[パッケージリポジトリ](https://ja.opensuse.org/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA)