Skip to content

antony@notes:~/kubernetes$ cat "Deploy-RMT-Server-on-K3S-and-synchronize-it-with-Disconnected-SUMA.md"

Deploy RMT Server on K3S and synchronize it with Disconnected SUMA

2024-05-16· kubernetes

Deploy RMT Server on K3S and synchronize it with Disconnected SUMA

Preface

本篇文章主要分兩個部分 :

  1. 介紹如何在 K3S 中部屬 RMT Server
  2. 如何設定 SUSE Manager 同步 RMT Server 匯出的 Packages Repositories

可以透過點擊以下目錄,選擇想看的內容,跳轉至特定章節

:::warning

:::spoiler {state=“open”} 目錄

[TOC]

:::

1. 環境要求

  • RMT Server
    • cpu: 4 Core
    • memory: 8 G
    • 可以連上外網
    • os iso: SLE-15-SP4-Full-x86_64-QU3-Media1.iso
  • 已安裝好 SUSE Manager Server
    • Version: 4.3.12

2. Application components 介紹

Each component of the RMT application is deployed in its own container. RMT consists of the following components:

RMT server

Containerized version of the RMT application server with the ability to pass its configuration via Helm values. Storage is done on a volume that will be allocated on the Kubernetes cluster. You need to adjust the size of the storage depending on the number of repositories you need to mirror.

What is RMT?

RMT is stand for “Repository Mirroring Tool”. It allows enterprise customers to optimize the management of SUSE Linux Enterprise software updates and subscription entitlements. It establishes a proxy system for SUSE® Customer Center with repositories and registration targets. This helps you to centrally manage software updates within a firewall on a per-system basis, while maintaining your corporate security policies and regulatory compliance. image

MariaDB

The database back-end for RMT. RMT creates the required database and tables at start-up, therefore no specific post-installation task is required. If passwords are not specified in the values.yaml file, they are generated automatically.

Nginx

A Web server configured for RMT routes. Having a properly configured Web server allows you to target your Ingress traffic (for RMT) to this Nginx service directly. You do not need to configure Ingress for RMT specific paths handling, as Nginx is configured to take care of this itself.

3. OS 設定

裝 SLES 15 SP4 minimal 版

# 1. 安裝必要套件
$ zypper mr -ea
$ zypper -n in iputils yast2-network sudo wget iptables bind-utils mkisofs yast2-ntp-client
$ sudo init 6

# 2. 設定當前使用者執行 sudo 免密碼
$ curl -s https://raw.githubusercontent.com/braveantony/bash-script/main/init.sh | bash

# 3. 設定網路
$ sudo yast2 lan edit id=0 ip=192.168.11.29 netmask=255.255.255.0
$ sudo ip route add default via 192.168.11.254
$ echo 'default 192.168.11.254 - eth0' | sudo tee /etc/sysconfig/network/ifroute-eth0
$ sudo yast2 dns edit nameserver1=192.168.11.85
$ sudo hostnamectl set-hostname rmt-server

# 4. 加一顆 500G Disk,之後要儲存 Repo 的資料
$ sudo fdisk /dev/sdb
Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): e
Partition number (1-4, default 1):
First sector (2048-1048575999, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-1048575999, default 1048575999):

Created a new partition 1 of type 'Linux' and of size 500 GiB.

Command (m for help): t
Selected partition 1
Hex code or alias (type L to list all): 8e
Changed type of partition 'Linux' to 'Linux LVM'.

Command (m for help): p
Disk /dev/sdb: 500 GiB, 536870912000 bytes, 1048576000 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd5f4ed82

Device     Boot Start        End    Sectors  Size Id Type
/dev/sdb1        2048 1048575999 1048573952  500G 8e Linux LVM

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

$ sudo /sbin/pvcreate /dev/sdb1
$ sudo /sbin/vgcreate rmt-data-vg /dev/sdb1
$ sudo /sbin/lvcreate -l 100%FREE -n rmt-data rmt-data-vg

# 5. Check LVM Settings
$ sudo pvs
  PV         VG          Fmt  Attr PSize   PFree
  /dev/sda2  system      lvm2 a--   69.99g 4.99g
  /dev/sdb1  rmt-data-vg lvm2 a--  500.00g    0
$ sudo vgs
  VG          #PV #LV #SN Attr   VSize   VFree
  rmt-data-vg   1   1   0 wz--n- 500.00g    0
  system        1   2   0 wz--n-  69.99g 4.99g
$ sudo lvs
  LV       VG          Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  rmt-data rmt-data-vg -wi-a----- 500.00g
  home     system      -wi-ao----  25.00g
  root     system      -wi-ao----  40.00g

# 6. 將 LVM 格式化成 XFS 檔案系統
$ sudo /sbin/mkfs.xfs /dev/rmt-data-vg/rmt-data

# 7. 建立 RMT Server 儲存資料的目錄區
$ sudo mkdir -p /var/lib/rancher/k3s/storage

# 8. 設定開機自動將指定的 LV 掛載到指定的目錄區
$ echo '/dev/rmt-data-vg/rmt-data  /var/lib/rancher/k3s/storage  xfs  defaults 0 0' | sudo  tee -a /etc/fstab && sudo mount -a

# 9. 檢查是否掛載成功
$ lsblk /dev/sdb
NAME                        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sdb                           8:16   0  500G  0 disk
└─sdb1                        8:17   0  500G  0 part
  └─rmt--data--vg-rmt--data 254:2    0  500G  0 lvm  /var/lib/rancher/k3s/storage

4. Install K3S Server

# 1. install k3s
$ curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.30.0+k3s1 \
K3S_KUBECONFIG_MODE="644" K3S_TOKEN=SECRET sh -s - server --cluster-init

# 2. 安裝 Helm
$ curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# 3. Setup kubeconfig
$ sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config && \
sudo chmod 600 ~/.kube/config && \
sudo chown $(id -u):$(id -g) ~/.kube/config

# 4. Check pods status in all namespace
$ kubectl get pods -A
NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
kube-system   coredns-6799fbcd5-bqp26                   1/1     Running     0          61m
kube-system   helm-install-traefik-2m4xg                0/1     Completed   1          61m
kube-system   helm-install-traefik-crd-kjk2c            0/1     Completed   0          61m
kube-system   local-path-provisioner-6c86858495-ccggc   1/1     Running     0          61m
kube-system   metrics-server-54fd9b65b-h87mq            1/1     Running     0          61m
kube-system   svclb-traefik-031297b9-zbld6              2/2     Running     0          61m
kube-system   traefik-7d5f6474df-rfjn9                  1/1     Running     0          61m

5. Install RMT Server

# 1. 產生 values.yaml
## 要修改 username 和 password (SCC 的 organization credentials)

$ cat << EOF > rmt-config.yaml
---
app:
  storage:
    class: local-path
  scc:
    username: "UXXXXXXX"
    password: "PASSXXXX"
    products_enable:
      - SLES/15.3/x86_64
      - sle-module-python2/15.3/x86_64
    products_disable:
      - sle-module-legacy/15.3/x86_64
      - sle-module-cap-tools/15.3/x86_64
db:
  storage:
    class: local-path
ingress:
  enabled: true
  hosts:
    - host: rmt-server.example.com
      paths:
        - path: "/"
          pathType: Prefix
  tls:
    - secretName: rmt-cert
      hosts:
        - rmt-server.example.com
EOF


# 2. check DNS A Record
$ dig @192.168.11.85 rmt-server.example.com +short
192.168.11.29

# 3. 開始安裝
$ helm install rmtsle oci://registry.suse.com/suse/rmt-helm -f rmt-config.yaml

# 4. 檢查部屬狀態
$ kubectl get pods,svc,ing,cronjob
NAME                                READY   STATUS    RESTARTS   AGE
pod/rmtsle-app-59fcc7687d-9rqzq     1/1     Running   0          2m4s
pod/rmtsle-db-756d9dfff5-mltgk      1/1     Running   0          2m4s
pod/rmtsle-front-7ccf9d5547-sc56h   1/1     Running   0          2m4s

NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/kubernetes     ClusterIP   10.43.0.1       <none>        443/TCP    28m
service/rmtsle-app     ClusterIP   10.43.149.216   <none>        4224/TCP   2m5s
service/rmtsle-db      ClusterIP   10.43.92.212    <none>        3306/TCP   2m5s
service/rmtsle-front   ClusterIP   10.43.165.131   <none>        80/TCP     2m5s

NAME                               CLASS     HOSTS                    ADDRESS         PORTS     AGE
ingress.networking.k8s.io/rmtsle   traefik   rmt-server.example.com   192.168.11.29   80, 443   2m4s

NAME                              SCHEDULE     SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob.batch/rmtsle-app-mirror   30 2 * * *   False     0        <none>          2m4s
cronjob.batch/rmtsle-app-sync     * 1 * * *    False     0        <none>          2m4s

預設每小時會執行 rmt-cli sync,每天的凌晨 2 點 30 分鐘執行 rmt-cli mirror

6. 下載 Packages Repositories

# 1. Enable SLES for sap 12 sp5
$ rmt_server=$(kubectl get pods --no-headers -l component=app -o custom-columns=Name:.metadata.name)

# 2. 到 SUMA Web UI 確認要下載的 repos
## 以下載 SUSE Linux Enterprise Server for SAP Applications 12 SP5 x86_64 這個產品的所有必要的套件儲存庫為例
## 連到 SUSEManager Web UI ,點選左側選單的 Admin > Setup Wizard > Products > SUSE Linux Enterprise Server for SAP Applications 12 SP5 x86_64 > Show Product's channels (右邊 4 條槓的藍色按鈕),會看到以下輸出

Mandatory Channels

    * SLE-12-SP5-SAP-Updates for x86_64 not synced
     sle-12-sp5-sap-updates-x86_64
    * SLE-HA12-SP5-Pool for x86_64 SAP not synced
     sle-ha12-sp5-pool-x86_64-sap
    * SLE-HA12-SP5-Updates for x86_64 SAP not synced
     sle-ha12-sp5-updates-x86_64-sap
    * SLE-Manager-Tools12-Pool for x86_64 SAP SP5 not synced
     sle-manager-tools12-pool-x86_64-sap-sp5
    * SLE-Manager-Tools12-Updates for x86_64 SAP SP5 not synced
     sle-manager-tools12-updates-x86_64-sap-sp5
    * SLE12-SP5-SAP-Pool for x86_64 not synced
     sle12-sp5-sap-pool-x86_64
    * SLES12-SP5-Pool for x86_64 SAP not synced
     sles12-sp5-pool-x86_64-sap
    * SLES12-SP5-Updates for x86_64 SAP not synced
     sles12-sp5-updates-x86_64-sap
     
Optional Channels

     SLE-12-SP5-SAP-Debuginfo-Updates for x86_64 not synced
    sle-12-sp5-sap-debuginfo-updates-x86_64
    ...以下省略

# 3. 回到 RMT Server 的終端機
# 確認 SUSE Linux Enterprise Server for SAP Applications 12 SP5 x86_64 需要的 repos ID 分別是多少
$ kubectl exec "$rmt_server" -c rmt-app -- rmt-cli repos list --csv --all | grep -iE "SLE-12-SP5-SAP-Updates|SLE-HA12-SP5-Pool|SLE-HA12-SP5-Updates|SLE-Manager-Tools12-Pool|SLE-Manager-Tools12-Updates|SLE12-SP5-SAP-Pool|SLES12-SP5-Pool|SLES12-SP5-Updates" | grep -vE "aarch64|ppc64le|s390x" | cut -d "," -f 1 | tr -s "\n" " "
3686 3691 3687 1734 1732 3690 3652 3647

## 4. Enable repos
$ kubectl exec "$rmt_server" -c rmt-app -- rmt-cli repos enable 3686 3691 3687 1734 1732 3690 3652 3647
Repository by ID 3686 successfully enabled.
Repository by ID 3691 successfully enabled.
Repository by ID 3687 successfully enabled.
Repository by ID 1734 successfully enabled.
Repository by ID 1732 successfully enabled.
Repository by ID 3690 successfully enabled.
Repository by ID 3652 successfully enabled.
Repository by ID 3647 successfully enabled.

## 5. Double Check
$ kubectl exec "$rmt_server" -c rmt-app -- rmt-cli repos list --csv
ID,Product,Description,Mandatory?,Mirror?,Last mirrored
3686,SLE-12-SP5-SAP-Updates,SLE-12-SP5-SAP-Updates for sle-12-x86_64,true,true,2024-05-13 06:06:04 UTC
3691,SLE-HA12-SP5-Pool,SLE-HA12-SP5-Pool for sle-12-x86_64,true,true,2024-05-13 06:05:56 UTC
3687,SLE-HA12-SP5-Updates,SLE-HA12-SP5-Updates for sle-12-x86_64,true,true,2024-05-13 06:05:42 UTC
1734,SLE-Manager-Tools12-Pool,SLE-Manager-Tools12-Pool for sle-12-x86_64,true,true,
1732,SLE-Manager-Tools12-Updates,SLE-Manager-Tools12-Updates for sle-12-x86_64,true,true,
3690,SLE12-SP5-SAP-Pool,SLE12-SP5-SAP-Pool for sle-12-x86_64,true,true,2024-05-13 06:06:24 UTC
3652,SLES12-SP5-Pool,SLES12-SP5-Pool for sle-12-x86_64,true,true,2024-05-13 06:05:33 UTC
3647,SLES12-SP5-Updates,SLES12-SP5-Updates for sle-12-x86_64,true,true,2024-05-13 06:05:11 UTC

## 6. Manually Synchronize database with SUSE Customer Center
$ kubectl create job --from=cronjob/rmtsle-app-sync sync-0513

$ kubectl logs -l job-name=sync-0513 -f
Executing: /usr/share/rmt/bin/rmt-cli sync
I, [2024-05-13T06:46:27.585181 #1]  INFO -- : Downloading data from SCC
I, [2024-05-13T06:46:27.585291 #1]  INFO -- : Updating products
I, [2024-05-13T06:48:58.596235 #1]  INFO -- : Updating repositories
I, [2024-05-13T06:49:02.173838 #1]  INFO -- : Updating subscriptions

## 7. Manually Mirror repositories
$ kubectl create job --from=cronjob/rmtsle-app-mirror mirror-sles12-sp5-sap

$ kubectl logs -l job-name=mirror-sles12-sp5-sap -f

### Check 完整的 log
$ kubectl logs -l job-name=mirror-sles12-sp5-sap --tail=-1

7. Export Data

# 1. Create a export folder
$ kubectl exec "$rmt_server" -c rmt-app -- mkdir /var/lib/rmt/export

# 2. 更改目錄權限
$ kubectl exec "$rmt_server" -c rmt-app -- chown 499:486 /var/lib/rmt/export/

# 3. Export the SCC data
$ kubectl exec "$rmt_server" -c rmt-app -- rmt-cli export data /var/lib/rmt/export/
I, [2024-05-03T01:24:50.158261 #343]  INFO -- : Exporting data from SCC to /var/lib/rmt/export
I, [2024-05-03T01:24:50.158339 #343]  INFO -- : Exporting products
I, [2024-05-03T01:25:15.226819 #343]  INFO -- : Exporting repositories
I, [2024-05-03T01:25:23.412012 #343]  INFO -- : Exporting subscriptions
I, [2024-05-03T01:25:23.732233 #343]  INFO -- : Exporting orders

# 4. 檢查是否符合預期
$ rmt_path=$(kubectl get pv $(kubectl get pvc rmtsle-app --no-headers -o custom-columns=volume:.spec.volumeName) --no-headers -o custom-columns=path:.spec.local.path)

$ sudo ls -l "$rmt_path"/export
total 15284
-rw-r--r-- 1 messagebus render        2 May  3 09:25 organizations_orders.json
-rw-r--r-- 1 messagebus render  3816974 May  3 09:24 organizations_products.json
-rw-r--r-- 1 messagebus render 10976002 May  3 09:25 organizations_products_unscoped.json
-rw-r--r-- 1 messagebus render   838455 May  3 09:25 organizations_repositories.json
-rw-r--r-- 1 messagebus render    11590 May  3 09:25 organizations_subscriptions.json

# 5. Export the enabled repositories settings and packages
$ kubectl exec "$rmt_server" -c rmt-app -- bash -c "rmt-cli export settings /var/lib/rmt/export/ && rmt-cli export repos /var/lib/rmt/export/"

# 6. 檢查是否符合預期
$ sudo ls -l "$rmt_path"/export
total 15288
-rw-r--r-- 1 messagebus render        2 May  3 09:25 organizations_orders.json
-rw-r--r-- 1 messagebus render  3816974 May  3 09:24 organizations_products.json
-rw-r--r-- 1 messagebus render 10976002 May  3 09:25 organizations_products_unscoped.json
-rw-r--r-- 1 messagebus render   838455 May  3 09:25 organizations_repositories.json
-rw-r--r-- 1 messagebus render    11590 May  3 09:25 organizations_subscriptions.json
-rw-r--r-- 1 messagebus render     2397 May  3 09:33 repos.json
drwxr-xr-x 1 messagebus render       34 May  3 09:33 suma
drwxr-xr-x 1 messagebus render       30 May  3 09:33 SUSE

$ sudo du -sh "$rmt_path"/export/
56G     /var/lib/rancher/k3s/storage/pvc-0d5da7cf-0b4e-45c5-901f-2a48f1f3b830_default_rmtsle-app/export/

$ sudo mkdir "$rmt_path"/backup
$ kubectl exec "$rmt_server" -c rmt-app -- chown 499:486 /var/lib/rmt/backup
$ sudo mkisofs -joliet-long -J -R -o "$rmt_path"/backup/SLES-12-SP5-SAP_v2.iso "$rmt_path"/export/
...
99.99% done, estimate finish Mon May  6 14:45:21 2024
Total translation table size: 0
Total rockridge attributes bytes: 0
Total directory bytes: 1189888
Path table size(bytes): 908
Max brk space used 1860000
28828581 extents written (56305 MB)

$ sudo ls -lh "$rmt_path"/backup/SLES-12-SP5-SAP.iso
-rw-r--r-- 1 root root 55G May  6 14:45 /var/lib/rancher/k3s/storage/pvc-0d5da7cf-0b4e-45c5-901f-2a48f1f3b830_default_rmtsle-app/backup/SLES-12-SP5-SAP.iso

> 將 ISO 檔放到 SUSE Manager
# Disable RMT Server
$ kubectl scale deploy rmtsle-app rmtsle-db rmtsle-front --replicas=0
$ kubectl patch cronjobs rmtsle-app-mirror rmtsle-app-sync -p '{"spec" : {"suspend" : true }}'

# Enable RMT Server
$ kubectl scale deploy rmtsle-app rmtsle-db rmtsle-front --replicas=1
$ kubectl patch cronjobs rmtsle-app-mirror rmtsle-app-sync -p '{"spec" : {"suspend" : false }}'

Set up SUSE Manager Synchronization with RMT Server

1. 設定硬碟

# 1. 先新增一顆 200G 的硬碟

# 2. 切 Linux LVM Type 的 Partition 
$ fdisk /dev/sdb
Command (m for help): p
Disk /dev/sdb: 200 GiB, 214748364800 bytes, 419430400 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x226d5455

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): e
Partition number (1-4, default 1):
First sector (2048-419430399, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-419430399, default 419430399):

Created a new partition 1 of type 'Extended' and of size 200 GiB.

Command (m for help): t
Selected partition 1
Hex code or alias (type L to list all): 8e
Changed type of partition 'Extended' to 'Linux LVM'.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

# 做 LVM
$ pvcreate /dev/sdb1
$ vgcreate rmt-data-vg /dev/sdb1
$ lvcreate -l 100%FREE -n rmt-data rmt-data-vg

$ pvs
  PV         VG          Fmt  Attr PSize   PFree
  /dev/sda2  system      lvm2 a--    1.49t    0
  /dev/sdb1  rmt-data-vg lvm2 a--  200.00g    0
$ vgs
  VG          #PV #LV #SN Attr   VSize   VFree
  rmt-data-vg   1   1   0 wz--n- 200.00g    0
  system        1   6   0 wz--n-   1.49t    0
$ lvs
  LV            VG          Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  rmt-data      rmt-data-vg -wi-a----- 200.00g
  root          system      -wi-ao---- 100.00g
  srv           system      -wi-ao----  80.00g
  swap          system      -wi-ao----   2.00g
  var_cache     system      -wi-ao----  10.00g
  var_lib_pgsql system      -wi-ao----  60.00g
  var_spacewalk system      -wi-ao----   1.24t
  
$ mkfs.xfs /dev/rmt-data-vg/rmt-data
$ mkdir -p /var/lib/rmt-data
$ echo '/dev/rmt-data-vg/rmt-data  /var/lib/rmt-data  xfs  defaults 0 0' | sudo tee -a /etc/fstab && sudo mount -a

$ lsblk /dev/sdb
NAME                        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sdb                           8:16   0  200G  0 disk
└─sdb1                        8:17   0  200G  0 part
  └─rmt--data--vg-rmt--data 254:6    0  200G  0 lvm  /var/lib/rmt-data

2. 掛 ISO 檔

$ mkdir /var/lib/rmt-data/{mirrorrepo,iso}

$ mount -o loop /var/lib/rmt-data/SLES-12-SP5-SAP.iso /var/lib/rmt-data/iso

$ cd /var/lib/rmt-data/ && \
ls -l iso/
total 15284
-rw-r--r-- 1 messagebus render        2 May  6 11:38 organizations_orders.json
-rw-r--r-- 1 messagebus render  3816974 May  6 11:38 organizations_products.json
-rw-r--r-- 1 messagebus render 10976002 May  6 11:38 organizations_products_unscoped.json
-rw-r--r-- 1 messagebus render   838455 May  6 11:38 organizations_repositories.json
-rw-r--r-- 1 messagebus render    11590 May  6 11:38 organizations_subscriptions.json
-rw-r--r-- 1 messagebus render     1423 May  6 13:10 repos.json
drwxr-xr-x 2 messagebus render     2048 May  6 11:43 suma
drwxr-xr-x 4 messagebus render     2048 May  6 12:08 SUSE

$ rsync -avzh --progress --log-file=/tmp/sync-1.log iso/ mirrorrepo/
...
sent 51.76G bytes  received 427.19K bytes  43.26M bytes/sec
total size is 59.02G  speedup is 1.14

$ chown -R root:root mirrorrepo/

$ ls -lh mirrorrepo/
total 15M
-rw-r--r-- 1 root root    2 May  6 11:38 organizations_orders.json
-rw-r--r-- 1 root root 3.7M May  6 11:38 organizations_products.json
-rw-r--r-- 1 root root  11M May  6 11:38 organizations_products_unscoped.json
-rw-r--r-- 1 root root 819K May  6 11:38 organizations_repositories.json
-rw-r--r-- 1 root root  12K May  6 11:38 organizations_subscriptions.json
-rw-r--r-- 1 root root 1.4K May  6 13:10 repos.json
drwxr-xr-x 2 root root   31 May  6 11:43 suma
drwxr-xr-x 4 root root   37 May  6 12:08 SUSE

3. 修改設定檔 /etc/rhn/rhn.conf

$ echo "server.susemanager.fromdir = /var/lib/rmt-data/mirrorrepo/" >> /etc/rhn/rhn.conf

4. Restart the Tomcat service

$ systemctl restart tomcat

5. Refresh the local data:

$ mgr-sync -v -d 3 refresh

6. List Chaneel

$ mgr-sync list channels
Available Channels:


Status:
  - [I] - channel is installed
  - [ ] - channel is not installed, but is available
  - [U] - channel is unavailable

[ ] EL9-Pool for x86_64 RHEL and Liberty 9 Base [el9-pool-x86_64]
[ ] RHEL5-Pool for i386 RHEL5 Base i386 [rhel5-pool-i386]
[ ] RHEL5-Pool for x86_64 RHEL5 Base x86_64 [rhel5-pool-x86_64]
[ ] RHEL6-Pool for i386 RHEL6 Base i386 [rhel6-pool-i386]
[ ] RHEL6-Pool for x86_64 RHEL6 Base x86_64 [rhel6-pool-x86_64]
[ ] RHEL7-Pool for x86_64 RHEL7 Base x86_64 [rhel7-pool-x86_64]
[ ] RHEL8-Pool for x86_64 RHEL and Liberty 8 Base [rhel8-pool-x86_64]
[ ] SLE12-SP5-SAP-Pool for x86_64 SUSE Linux Enterprise Server for SAP Applications 12 SP5 x86_64 [sle12-sp5-sap-pool-x86_64]
[ ] SLES12-SP5-Pool for x86_64 SUSE Linux Enterprise Server 12 SP5 x86_64 [sles12-sp5-pool-x86_64]
[ ] ubuntu-16.04-pool for amd64 Ubuntu 16.04 [ubuntu-16.04-pool-amd64]
[ ] ubuntu-18.04-pool for amd64 Ubuntu 18.04 [ubuntu-18.04-pool-amd64]

7. Perform a synchronization

# 1. 同步 sle12-sp5-sap
$ mgr-sync add channel sle12-sp5-sap-pool-x86_64
Added 'sle12-sp5-sap-pool-x86_64' channel
Scheduling reposync for following channels:
- sle12-sp5-sap-pool-x86_64

# 2. 同步 sles12-sp5-pool
$ mgr-sync add channel sles12-sp5-pool-x86_64
Added 'sles12-sp5-pool-x86_64' channel
Scheduling reposync for following channels:
- sles12-sp5-pool-x86_64

Log 位置在 /var/log/rhn/reposync 目錄區

TroubleShooting

錯誤訊息如下 :

Refreshing Channel families                    [DONE]
Refreshing SUSE products                       [DONE]
Refreshing SUSE repositories                   [FAIL]
        Error: <Fault -1: 'redstone.xmlrpc.XmlRpcFault: unhandled internal exception: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [com.redhat.rhn.domain.scc.SCCRepositoryTokenAuth#10229]'>

如果遇到以上錯誤訊息,要先刪 credentials

$ mgr-sync delete credentials
Credentials:
01) 9596e8825a (primary)
Enter credentials number (1-1): 1
Really delete credentials '9596e8825a'? (y/n): y
Successfully deleted credentials: 9596e8825a

然後在重新同步

$ mgr-sync -v -d 3 refresh
Refreshing Channel families                    [DONE]
Refreshing SUSE products                       [DONE]
Refreshing SUSE repositories                   [DONE]
Refreshing Subscriptions                       [DONE]

參考資料