From 95409e25aa0db54c9862eddd3ea7b339070d676d Mon Sep 17 00:00:00 2001 From: lwlonglong Date: Thu, 13 Oct 2022 10:46:28 +0800 Subject: [PATCH 1/3] migrate2opencloudos --- SOURCES/README.md | 41 +++ SOURCES/migrate2opencloudos.py | 522 +++++++++++++++++++++++++++++++++ SPECS/migrate2opencloudos.spec | 36 +++ 3 files changed, 599 insertions(+) create mode 100644 SOURCES/README.md create mode 100755 SOURCES/migrate2opencloudos.py create mode 100644 SPECS/migrate2opencloudos.spec diff --git a/SOURCES/README.md b/SOURCES/README.md new file mode 100644 index 0000000..1fef7fc --- /dev/null +++ b/SOURCES/README.md @@ -0,0 +1,41 @@ +# Migrate CentOS to OpenCloudOS + +Run migrate2opencloudos tool will switch CentOS to OpenCloudOS system packages and yum repo. +While script run complete, your centos will change to OpenCloudOS. + +## Supported versions + +This script supports CentOS Linux 8. if your enviortment is some vault centos version, like 8stream, please update it to centos 8.x, then run this script again. +Note: The risk of cross-version upgrades is still quite large. + +## Before you switch + +**IMPORTANT:** +This script is not perfect and cannot handle all possible situations. +Please ensure you have a **complete backup** of the system and data +before run this script. + +1. Ensure your CentOS `yum` or `dnf` configuration is working. +1. Ensure you have at least 10GB of free space in `/var/cache`. +1. All automatic updates, e.g. via `yum-cron` should be disabled. +1. Ensure your CentOS does not install i686 packages. + +## Usage + +1. Make sure you can run this script as root. +1. python3 enviroment required. +1. Either clone this repository or download [`migrate2opencloudos.py`][2]. +1. Run `python3 migrate2opencloudos.py -v $tlinux_version` to start converting. + +## Usage options + +* `-v` The version of OpenCloudOS + + The version OpenCloudOS, like `8` .If you do not specify this parameter, the system prompts you to select. + + * `Note that CentOS 8.x supports migration to OpenCloudOS 8`. + +* `-c` continue to migration + + When the script is interrupted during the execution of distro-sync, you can use `-c` to continue the execution after solving the problem. + diff --git a/SOURCES/migrate2opencloudos.py b/SOURCES/migrate2opencloudos.py new file mode 100755 index 0000000..01d91f0 --- /dev/null +++ b/SOURCES/migrate2opencloudos.py @@ -0,0 +1,522 @@ +#!/usr/libexec/platform-python +# Copyright (c) 2022 OpenCloudOS . +# Licensed under the MIT license. +# +# Script to migrate CentOS to the OpenCloudOS. +# + +import os +import subprocess +import re +import socket +import sys +import shutil +import argparse +import platform +import urllib.request +import json + +yum_url="https://mirrors.tencent.com/opencloudos/" +repostr_opencloudos = '''[oc_os] +name=OpenCloudOS +baseurl=http://mirrors.tencent.com/opencloudos/8.5/BaseOS/$basearch/os/ +gpgcheck=0 +enabled=1 + +[oc_appstream] +name=appstream +baseurl=http://mirrors.tencent.com/opencloudos/8.5/AppStream/$basearch/os/ +gpgcheck=0 +enabled=1 + +[oc_Extres] +name=Appstream +baseurl=http://mirrors.tencent.com/opencloudos/8.5/Extras/$basearch/os/ +gpgcheck=0 +enabled=1 +''' + +cent_packages = 'centos-backgrounds centos-logos centos-release-cr desktop-backgrounds-basic \ +centos-release-advanced-virtualization centos-release-ansible26 centos-release-ansible-27 \ +centos-release-ansible-28 centos-release-ansible-29 centos-release-azure \ +centos-release-ceph-jewel centos-release-ceph-luminous centos-release-ceph-nautilus \ +centos-release-ceph-octopus centos-release-configmanagement centos-release-dotnet centos-release-fdio \ +centos-release-gluster40 centos-release-gluster41 centos-release-gluster5 \ +centos-release-gluster6 centos-release-gluster7 centos-release-gluster8 \ +centos-release-gluster-legacy centos-release-messaging centos-release-nfs-ganesha28 \ +centos-release-nfs-ganesha30 centos-release-nfv-common \ +centos-release-nfv-openvswitch centos-release-openshift-origin centos-release-openstack-queens \ +centos-release-openstack-rocky centos-release-openstack-stein centos-release-openstack-train \ +centos-release-openstack-ussuri centos-release-opstools centos-release-ovirt42 centos-release-ovirt43 \ +centos-release-ovirt44 centos-release-paas-common centos-release-qemu-ev centos-release-qpid-proton \ +centos-release-rabbitmq-38 centos-release-samba411 centos-release-samba412 \ +centos-release-scl centos-release-scl-rh centos-release-storage-common \ +centos-release-virt-common centos-release-xen centos-release-xen-410 \ +centos-release-xen-412 centos-release-xen-46 centos-release-xen-48 centos-release-xen-common \ +libreport-centos libreport-plugin-mantisbt libreport-plugin-rhtsupport python3-syspurpose \ +python-oauth sl-logos yum-rhn-plugin centos-indexhtml' + +reposdir ='/etc/yum.repos.d/' +oclist = ['8'] +centos_major_ver = 0 +centos_minor_ver = "" + +def get_current_version(continue_after_sync = False): + global centos_major_ver + global centos_minor_ver + os_name = '' + os_release = str(subprocess.check_output("rpm -q --qf '%{NAME}' --whatprovides centos-release", shell=True), + 'utf_8') + os_version = str(subprocess.check_output("rpm -q --qf '%{VERSION}' --whatprovides centos-release", shell=True), + 'utf_8') + if os_release.__contains__("opencloudos-release") or continue_after_sync: + os_name = 'opencloudos' + if os_version.__contains__('8'): + centos_minor_ver = '8' + print("OpenCloudOS version is: %s" %os_version) + + elif os_release.__contains__('centos-release') or os_release.__contains__('centos-linux-release') or os_release.__contains__('centos-stream-release'): + os_name = 'centos' + centos_minor_ver = os_version + print("os name is: %s, os version is: %s" % (os_name, centos_minor_ver)) + else: + print("Can Not Check OSName Now, Please Check ...") + sys.exit(1) + + centos_major_ver = int(float(centos_minor_ver)) + print("centos_major_ver is: %s" % centos_major_ver) + + +def check_pkg(pkg): + if pkg.split('/')[0] == '': + if os.path.exists(pkg): + return True + else: + return False + + paths = os.environ['PATH'].split(':') + for path in paths: + if not os.path.isdir(path): + continue + for f in os.listdir(path): + if os.path.isfile(os.path.join(path, f)): + if f == pkg: + return True + return False + +def get_oc_kernel(): + oc_kernel = "" + for name in os.listdir('/boot'): + if name.startswith('vmlinuz-5.4'): + oc_kernel = name + return oc_kernel + +def clean_and_exit(): + repo_path = os.path.join(reposdir, 'switch-to-oc.repo') + if os.path.exists(repo_path): + os.remove(repo_path) + sys.exit(1) + +def get_disk_info(string): + dev_name = "" + part_name = "" + length = len(string) + for c in range(length-1, -1, -1): + if not string[c].isdigit(): + if string.find('nvme') != -1: + dev_name = string[0:c] + part_num = string[c+1:length] + else: + dev_name = string[0:c+1] + part_num = string[c+1:length] + break + return dev_name,part_num + +def add_boot_option(): + print("Current system is uefi, add boot option to boot manager.") + subprocess.run('which efibootmgr > /dev/null 2>&1 || yum install -y efibootmgr', shell=True) + disk_name = subprocess.check_output('mount | grep /boot/efi | awk \'{print $1}\'', shell=True) + disk_name = str(disk_name, 'utf-8') + disk_name = disk_name.split('\n')[0] + dev_name,part_num = get_disk_info(disk_name) + if dev_name == "" or part_num == "": + print("Parse /boot/efi disk info failed, update boot loader failed.") + return + + cmd="" + arch = platform.machine() + if arch == "x86_64": + cmd = 'efibootmgr -c -d ' + dev_name + ' -p ' + part_num + ' -l "\EFI\opencloudos\shimx64.efi" -L "OpenCloudOS"' + elif arch == "aarch64": + cmd = 'efibootmgr -c -d ' + dev_name + ' -p ' + part_num + ' -l "\EFI\opencloudos\shimaa64.efi" -L "OpenCloudOS"' + try: + subprocess.check_call(cmd, shell=True) + except: + print("Use efibootmgr update boot loader failed, please update boot loader manually.") + + +def backup_repofiles(centos_release): + global yum_url + global centos_major_ver + + repos = [] + if re.match('centos-release-'+str(centos_major_ver)+'\.*|centos-linux-release-'+str(centos_major_ver)+'\.*', centos_release): + centos_release_r = subprocess.check_output('rpm -qa centos*repos', shell=True) + centos_release_r = str(centos_release_r, 'utf-8')[:-1] + centos_release = centos_release +" "+centos_release_r + if len(centos_release_r) != 0: + repos = subprocess.check_output("rpm -ql " + centos_release_r + " | grep '\.repo$'", shell=True) + repos = str(repos, 'utf-8').split('\n')[:-1] + else: + repos = subprocess.check_output("rpm -ql centos-release | grep '\.repo$'", shell=True) + repos = str(repos, 'utf-8').split('\n')[:-1] + + num_centos_repos = subprocess.check_output('rpm -qa "centos-release*" | wc -l', shell=True) + if int(str(num_centos_repos,'utf-8')[0]) > 0: + print("process centos 8 repo files...") + addtional_repos = subprocess.check_output('rpm -qla "centos-release*"', shell=True) + addtional_repos = str(addtional_repos, 'utf-8') + if addtional_repos != '': + addtional_repos = addtional_repos.split('\n') + for r in addtional_repos: + if re.match('.*\.repo$', r): + repos.append(r) + + backup_comment = '# This yum repo config file that was disabled by\n' \ + + '# ' + __file__+ ', a script to convert CentOS to OpenCloudOS.\n' \ + + '# Please see '+yum_url+' for more information.\n\n' + + for repo in repos: + sk = '-Linux' + if sk in repo: + repo = repo.replace(sk, '') + if not os.path.isfile(repo): + continue + with open(repo, 'r') as fsrc: + content = fsrc.read() + with open(repo+'.disabled','w') as fdst: + fdst.write(repo+'\n'+backup_comment+content) + os.remove(repo) + subprocess.run("mv /etc/yum.repos.d/CentOS-centosplus.repo /etc/yum.repos.d/CentOS-centosplus.repo.disabled", shell=True) + subprocess.run("mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.disabled", shell=True) + subprocess.run("mv /etc/yum.repos.d/CentOS-HA.repo /etc/yum.repos.d/CentOS-HA.repo.disabled", shell=True) + subprocess.run("mv /etc/yum.repos.d/CentOS-Linux-AppStream.repo /etc/yum.repos.d/CentOS-Linux-AppStream.repo.disabled", shell=True) + subprocess.run("mv /etc/yum.repos.d/CentOS-Linux-BaseOS.repo /etc/yum.repos.d/CentOS-Linux-BaseOS.repo.disabled", shell=True) + subprocess.run("mv /etc/yum.repos.d/CentOS-Linux-Extras.repo /etc/yum.repos.d/CentOS-Linux-Extras.repo.disabled",shell=True) + + return centos_release + +def check_version(version): + global repostr_opencloudos + global centos_minor_ver + + if version != '8': + print("version error,please re-enter your version!") + sys.exit(1) + + if not version: + print("You have to set the version of OpenCloudOS") + print("The following version are enabled") + print(' '.join(oclist)) + version = str(input("Selected the version is : ")).strip() + if centos_major_ver >= 8 and version == "8": + print("You selected OpenCloudOS 8") + else: + print("version " + version + " not found,Please Check!") + sys.exit(1) + print("The following version are enabled") + print(' '.join(oclist)) + sys.exit(1) + + + +def process_yum_utils_install(): + print("Process yum-utils install") + yum_utils_install = False + try: + subprocess.check_call("yum -y install yum-utils", shell=True) + yum_utils_install = True + except: + print("Install yum-utils failed, try to use vault repos.") + + if yum_utils_install: + return + + if centos_major_ver != 8: + return + + repostr_centos_vault_8 = '''[centos8-vault-baseos] + name=centos8-vault - BaseOS + baseurl=http://mirrors.cloud.tencent.com/centos-vault/8.5.2111/BaseOS/$basearch/os/ + gpgcheck=0 + enabled=1 + + [centos8-vault-appstream] + name=centos8-vault - AppStream + baseurl=http://mirrors.cloud.tencent.com/centos-vault/8.5.2111/AppStream/$basearch/os/ + gpgcheck=0 + enabled=1 + ''' + + with open('/tmp/centos8_vault.repo', 'w') as f: + f.write(repostr_centos_vault_8) + + subprocess.run("yum -y install yum-utils --disablerepo=* -c /tmp/centos8_vault.repo --enablerepo=centos8-vault*", shell=True) + os.remove('/tmp/centos8_vault.repo') + if not check_pkg('yumdownloader'): + clean_and_exit() + + +def main(reinstall_all_rpms=False, verify_all_rpms=False, version=False, continue_after_sync = False): + global reposdir + global dst_rpms + + print("Checking if the tool is executed by root user") + # check if the script is executed by root user + if os.geteuid() != 0: + print("Please run the tool as root user.") + sys.exit(1) + + # check OS version and release + get_current_version(continue_after_sync) + print("Get current version Done.") + + + if centos_major_ver == 0: + print("get current version failed.") + sys.exit(1) + + if not continue_after_sync: + print("Checking the version of OpenCloudOS") + check_version(version) + + # check required packages + print('Checking required packages') + for pkg in ['rpm', 'yum', 'curl']: + if not check_pkg(pkg): + print("Could not found " + pkg) + sys.exit(1) + + print('Checking i686 packages') + i686_pkgs = subprocess.check_output('rpm -qa --qf "%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH} %{VENDOR}\n" | grep i686 | awk \'{print $1}\'', shell=True) + i686_pkgs = str(i686_pkgs, 'utf-8') + if len(i686_pkgs) != 0: + print("OpenCloudOS does not provide i686 packages, please remove them before migration.") + print("Installed i686 packages:") + print(i686_pkgs) + sys.exit(1) + + + if verify_all_rpms: + print("Creating a list of RPMs installed before the switch") + print("Verifying RPMs installed before the switch against RPM database") + out1 = subprocess.check_output('rpm -qa --qf \ + "%{NAME}|%{VERSION}|%{RELEASE}|%{INSTALLTIME}|%{VENDOR}|%{BUILDTIME}|%{BUILDHOST}|%{SOURCERPM}|%{LICENSE}|%{PACKAGER}\\n" \ + | sort > "/var/tmp/$(hostname)-rpms-list-before.log"', shell=True) + out2 = subprocess.check_output('rpm -Va | sort -k3 > "/var/tmp/$(hostname)-rpms-verified-before.log"',shell=True) + files = os.listdir('/var/tmp/') + hostname = socket.gethostname() + print("Review the output of following files:") + for f in files: + if re.match(hostname+'-rpms-(.*)\.log', f): + print(f) + + # check Distro by centos-release package + print("========= Checking: Distribution Name=========") + centos_release = subprocess.check_output("rpm -q --whatprovides /etc/redhat-release", shell=True) + centos_release = str(centos_release, 'utf-8') + centos_release = centos_release.split('\n')[:-1] + if len(centos_release) == 0: + print("You appear to be running an unsupported distribution.") + sys.exit(1) + if len(centos_release) > 1: + print("Could not determine your distribution because multiple packages are providing redhat-release:") + print('\n'.join(centos_release)) + sys.exit(1) + + centos_release = centos_release[0] + print(centos_release) + if re.match('opencloudos-release', centos_release): + print("You are already using OpenCloudOS.") + sys.exit(1) + elif re.match('centos-linux-release|centos-stream-release', centos_release): + subver = centos_release.split('-')[3] + elif re.match('redhat-release|centos-release', centos_release): + subver = centos_release.split('-')[2] + else: + print("Your are using an unsupported distribution.") + sys.exit(1) + + if not re.match(str(centos_major_ver),subver): + print("You appear to be running an unsupported distribution.") + sys.exit(1) + + base_packages=['basesystem','initscripts','plymouth','grub2','grubby'] + + print("========= Checking: yum lock ===========") + if os.path.exists('/var/run/yum.pid'): + with open('/var/run/yum.pid', 'r') as f: + pid = f.read() + with open('/proc/' + pid + '/comm', 'r') as ff: + comm = ff.read() + print('Another Process maybe holding the yum lock: ' + comm) + print('Running as pid: ' + pid) + print('Please wait it complete and run again.') + sys.exit(1) + + print("========= Looking for yumdownloader ==========") + if not check_pkg('yumdownloader'): + process_yum_utils_install() + + print("Backing up and removing old repository files...") + centos_release = backup_repofiles(centos_release) + + print("Processing contentdir in repo files...") + subprocess.run("sed -i \'s/\$contentdir/centos/g\' /etc/yum.repos.d/*.repo", shell=True) + + print("Backing up and removing 3rd-part repo config, eg: epel...") + subprocess.run("mkdir /etc/yum.repos.d/migration-bak", shell=True) + subprocess.run("mv $(find /etc/yum.repos.d/*.repo) /etc/yum.repos.d/migration-bak/", shell=True) + subprocess.run("mv /etc/yum.repos.d/migration-bak/CentOS-Epel.repo /etc/yum.repos.d/migration-bak/CentOS-Epel.repo.disabled", shell=True) + + repofile = os.path.join(reposdir, 'switch-to-oc.repo') + with open(repofile, 'w') as f: + repostr_oc=repostr_opencloudos + f.write(repostr_oc) + + + print("========= Start converting =========") + + print("Removing CentOS-specific yum config from /etc/yum.conf ...") + with open('/etc/yum.conf', 'r') as f: + content = f.read() + if re.search(r'^distroverpkg=', content, re.MULTILINE): + content = re.sub(r"\n(distroverpkg=)", r"\n#\1", content) + if re.search(r'bugtracker_url=', content, re.MULTILINE): + content = re.sub(r"\n(bugtracker_url=)", r"\n#\1", content) + with open('/etc/yum.conf', 'w') as f: + f.write(content) + + print("Downloading OpenCloudOS release package...") + dst_release = ['opencloudos-release','epel-release'] + + try: + stat = subprocess.check_output("yumdownloader "+' '.join(dst_release), shell=True) + except Exception: + print("Could not download the following packages from " + yum_url) + print('\n'.join(dst_release)) + print("An error occurred while attempting to switch this system to OpenCloudOS" + \ + "and it may be in an unstable/unbootable state. To avoid further issues, " +\ + "the script has terminated.") + clean_and_exit() + + print("Switching centos-release package with OpenCloudOS...") + dst_rpms = [s + '*.rpm' for s in dst_release] + subprocess.run('rpm -i --force ' + ' '.join(dst_rpms) + ' --nodeps', shell=True) + subprocess.run('rpm -e --nodeps ' + centos_release + ' centos-gpg-keys', shell=True) + os.remove(repofile) + # switch completed + + print("Installing base packages for OpenCloudOS...") + subprocess.run('yum clean all', shell=True) + cmd = 'yum shell -y --noautoremove < 0: + print("Reinstalling RPMs:") + print(' '.join(centos_rpms)) + subprocess.run('yum --assumeyes reinstall '+ ' '.join(centos_rpms), shell=True) + + non_oc_rpms = subprocess.check_output('rpm -qa --qf "%{NAME}-%{VERSION}-%{RELEASE}|%{VENDOR}|%{PACKAGER}\\n" \ + |grep -v opencloudos ', shell=True) + non_oc_rpms = str(non_oc_rpms, 'utf-8') + non_oc_rpms = non_oc_rpms.split('\n')[:-1] + if len(non_oc_rpms) > 0: + print("The following non-oc Pkgs installed on the system:") + print(' '.join(non_oc_rpms)) + print("This may be expected of your environment and does not necessarily indicate a problem.") + + print("Removing yum cache") + if os.path.isfile('/var/cache/yum'): + os.remove('/var/cache/yum') + elif os.path.isdir('/var/cache/yum'): + shutil.rmtree('/var/cache/yum') + if centos_major_ver ==8: + if os.path.isfile('/var/cache/dnf'): + os.remove('/var/cache/dnf') + elif os.path.isdir('/var/cache/dnf'): + shutil.rmtree('/var/cache/dnf') + + if verify_all_rpms: + print("Creating a list of RPMs installed after the switch") + print("Verifying RPMs installed after the switch against RPM database") + out1 = subprocess.check_output('rpm -qa --qf \ + "%{NAME}|%{VERSION}|%{RELEASE}|%{INSTALLTIME}|%{VENDOR}|%{BUILDTIME}|%{BUILDHOST}|%{SOURCERPM}|%{LICENSE}|%{PACKAGER}\\n" \ + | sort > "/var/tmp/$(hostname)-rpms-list-after.log"', shell=True) + out2 = subprocess.check_output('rpm -Va | sort -k3 > "/var/tmp/$(hostname)-rpms-verified-after.log"',shell=True) + files = os.listdir('/var/tmp/') + hostname = socket.gethostname() + print("Review the output of following files:") + for f in files: + if re.match(hostname+'-rpms-(.*)\.log', f): + print(f) + + print("Sync successfully, update grub.cfg.") + if os.path.isdir('/sys/firmware/efi'): + subprocess.run('rpm -e dnf-plugin-subscription-manager --nodeps', shell=True) + subprocess.run('grub2-mkconfig -o /boot/efi/EFI/opencloudos/grub.cfg', shell=True) + add_boot_option() + else: + subprocess.run('grub2-mkconfig -o /boot/grub2/grub.cfg', shell=True) + + subprocess.run('grubby --set-default=/boot/' + get_oc_kernel(), shell=True) + + print("reset 3rd-part repository files...") + subprocess.run("mv /etc/yum.repos.d/migration-bak/* /etc/yum.repos.d/", shell=True) + subprocess.run("rmdir /etc/yum.repos.d/migration-bak", shell=True) + subprocess.run("rm -rf /etc/yum.repos.d/switch-to-oc.repo", shell=True) + + dst_release = ['opencloudos-release', 'epel-release'] + dst_rpms = [s + '*.rpm' for s in dst_release] + subprocess.run('rm -f ' + ' '.join(dst_rpms) + '', shell=True) + + subprocess.run("yum clean all", shell=True) + subprocess.run("yum makecache", shell=True) + print("Switch complete. OpenCloudOS recommends rebooting this system.") + + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('-r', action='store_true', help='Reinstall all CentOS RPMs with OpenCloudOS RPMs (Note: This is not necessary for support)') + parser.add_argument('-V', action='store_true', help='Verify RPM information before and after the switch') + parser.add_argument('-v', help='Choose the version of OpenCloudOS') + parser.add_argument('-c', action='store_true', help='Continue to migration after distro-sync') + args = parser.parse_args() + sys.exit(main(args.r, args.V, args.v, args.c)) diff --git a/SPECS/migrate2opencloudos.spec b/SPECS/migrate2opencloudos.spec new file mode 100644 index 0000000..086dec8 --- /dev/null +++ b/SPECS/migrate2opencloudos.spec @@ -0,0 +1,36 @@ +Name: migrate2opencloudos +Version: 1.0 +Release: 1%{?dist} +Summary: Migrate CentOS Linux to OpenCloudOS. + +License: MIT +URL: https://www.opencloudos.org +Source0: %{name}.py +Source1: README.md + +BuildRequires: python3 +Requires: python3 + +BuildArch: noarch + +%description +This script aim to auto onvert a CentOS Linux enviroment to OpenCloudOS. +It supports migration from CentOS 8 to OpenCloudOS 8 . + + +%prep +cp %{SOURCE1} . + + +%install +mkdir -p %{buildroot}/%{_sbindir} +install -m 755 %{SOURCE0} %{buildroot}/%{_sbindir} + +%files +%{_sbindir}/%{name}.py +%doc README.md + + +%changelog +* Fri Aug 12 2022 Franklwwang +- Create migrate2opencloudos -- Gitee From c16eec572290f8962d26ec66d1145b7f86a8ac0a Mon Sep 17 00:00:00 2001 From: lwlonglong Date: Thu, 13 Oct 2022 10:49:15 +0800 Subject: [PATCH 2/3] migrate2opencloudos --- .gitignore | 0 .migrate2opencloudos.metadata | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 .gitignore create mode 100644 .migrate2opencloudos.metadata diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/.migrate2opencloudos.metadata b/.migrate2opencloudos.metadata new file mode 100644 index 0000000..e69de29 -- Gitee From 09b96422b9d3fc63a92519276f103da763f6af70 Mon Sep 17 00:00:00 2001 From: lwlonglong Date: Thu, 13 Oct 2022 10:53:35 +0800 Subject: [PATCH 3/3] migrate2opencloudos --- README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index e69de29..0000000 -- Gitee