20201216のLinuxに関する記事は18件です。

オープンソース標準がISOになった日

皆さん、こんばんは。
今夜の名古屋は雪です。

2020年12月15日はオープンソースの世界の新たな歴史がまた一つ刻まれた日になりました。
Linux FoundationのOSSライセンスコンプライアンスの標準であるOpenChain2.1が、
ISO/IEC 5230:2020が国際規格として承認されたことが、
日本時間の15日夕方から16日午前中にかけて6ヶ国語で次々とプレスリリースされたのです。
オープンソース標準のISO化は14年間のLinux Foundationの歴史の中ではじめてのことです。

(原文)ISO/IEC 5230:2020 Is The International Standard For Open Source Compliance
(日本語版)オープンソース コンプライアンスの国際規格 ISO/IEC 5230:2020

ISO/IEC 5230:2020は、
「組織がライセンスを遵守してオープンソースソフトウエアを適切に利用するための仕組み」について
規定されており、組織が各項目の要求を満足する場合認証を取得することができます。
今回のISO化と共に、トヨタ自動車がISO/IEC 5230適合を発表した初めての企業になったこともプレスリリースされました。

(原文)
Toyota Is The First Company To Announce Adoption Of ISO/IEC 5230, The International Standard For Open Source Compliance
(日本語版)
トヨタ自動車株式会社がオープンソースコンプライアンスの世界標準であるISO/IEC 5230適合を発表した初めての企業に

OpenChain Projectについて詳しく知りたいという方は

・OpenChainの活動については昨年のOpenChain JWG Qiita Advent Calendar
・ISO標準については本年のOpenChain JWG Qiita Advent Calendar

でプロジェクトメンバーが解説していますのでご覧ください!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Linux] VirtualBoxにCentOSをインストールしました

自分のPC(Windows10)にVirtualBoxをインストールし、CentOSをVirtualBoxにインストールしてみました。という完全な個人的なメモでございます。すみません。

ダウンロードしたもの
・VirtualBox : VirtualBox 6.1.16
  VirtualBoxのページ:VirtualBox

・CentOS : CentOS-8.3.2011-x86_64-dvd1.iso
  CentOSのページ:CentOS

そして、インストールしてみたのですが、いちおうCentOSは起動したのですが、きちんと(?)インストールできたのか自分でも良くわからない状態です。

何の役にも立たない記事ですね。明日、もう一度やり直してみようと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

git tagdate コマンドの紹介

あるパッチがどのバージョンのkernelに入ったものかを簡単に知るために、
git tagdate というコマンドがあります。

例えば
commit 2a842acab109f40f0d7d10b38e9ca88390628996
Author: Christoph Hellwig hch@lst.de
Date: Sat Jun 3 09:38:04 2017 +0200

というパッチがメインラインに入ったのは、2017年6月3日だとわかりますが、
$ git tagdate
(snip)
Sun Sep 3 13:56:28 2017 -0700 refs/tags/v4.13
Sun Aug 27 17:20:50 2017 -0700 refs/tags/v4.13-rc7
Sun Aug 20 14:14:03 2017 -0700 refs/tags/v4.13-rc6
Sun Aug 13 16:01:40 2017 -0700 refs/tags/v4.13-rc5
Sun Aug 6 18:44:56 2017 -0700 refs/tags/v4.13-rc4
Sun Jul 30 12:40:48 2017 -0700 refs/tags/v4.13-rc3
Sun Jul 23 16:15:27 2017 -0700 refs/tags/v4.13-rc2
Sat Jul 15 15:22:25 2017 -0700 refs/tags/v4.13-rc1
Sun Jul 2 16:07:11 2017 -0700 refs/tags/v4.12
Sun Jun 25 18:30:14 2017 -0700 refs/tags/v4.12-rc7
Mon Jun 19 22:19:48 2017 +0800 refs/tags/v4.12-rc6
Sun Jun 11 16:48:27 2017 -0700 refs/tags/v4.12-rc5
Sun Jun 4 16:47:49 2017 -0700 refs/tags/v4.12-rc4  <=
Sun May 28 17:20:59 2017 -0700 refs/tags/v4.12-rc3
Sun May 21 19:30:30 2017 -0700 refs/tags/v4.12-rc2
Sat May 13 13:20:00 2017 -0700 refs/tags/v4.12-rc1
Sun Apr 30 19:48:00 2017 -0700 refs/tags/v4.11
(snip)

2017年6月3日は v4.12-rc4のタイミングに入ったというようにわかります。

でも、みなさんの git にはそんなコマンドは用意されていないですよね。
自分で用意しましょう。

~/.gitconfig
[alias]
tagdate = tag -l --format='%(taggerdate) %(refname)' --sort=-taggerdate

(注)全てのレポジトリでtagと日付がセットで出てくるとは限りません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOSからOracle Linuxへ移行する方法

1. どこに移行すべきか

各所で話題になっているように、CentOS 8からCentOS 8 Streamへの変更は大きな驚きや落胆をもって迎えられている。筆者自身も驚き、すぐに以下の記事を書いたところだ。

CentOS 7は2024年6月まで猶予はあるが、CentOS 8は2021年12月31日までだ。あと1年しか猶予がない。そこで考えられるのが以下の選択肢だ。

  1. CentOS Streamに移行する
  2. RHELに移行する
  3. Oracle Linuxに移行する
  4. Ubuntuに移行する
  5. 上記以外のLinuxディストリビューションに移行する

どれにするかは、それぞれの考えで選ぶべきだろう。CentOS Streamへの移行は、いろいろなところで語られているので、今回は以下のメリットがあるOracle Linuxへの移行方法を解説する。

  • 無料で利用できるRHEL互換ディストリビューション
  • RHELと同じ期間、アップデートパッケージを無償で利用できる
  • 必要に応じてサポート契約でき、Red Hatエンタープライズ契約ほど規約が厳しくない
  • 追加料金を払えば、通常より長いExtended Supportもある

1-1. 対象環境

  • CentOS 7 / CentOS 8
  • オンプレミスとパブリッククラウドの両方

※ 今回使用するcentos2ol.shスクリプトはCentOS 6にも対応しているが、CentOS 6はサポートが切れているので説明しない。

2. Oracle Linuxへの移行方法

移行にはいろいろな方法があり、今回は下記Oracle Linux Blogで紹介しているcentos2ol.shを使用する。

実際に手を動かす前に「Oracle Linux: A better alternative to CentOS」をサクッと眺めてほしい。また、実際の移行方法はGithubのoracle/centos2olに書かれている。

https://github.com/oracle/centos2ol

なお、このスクリプトは急に注目されているので、新しいIssues/Pull requestsが上がっている。そのため今後は、本記事の内容と違いが発生するかもしれない。

移行手順
移行の実行手順は以下のとおり。事前確認には複数のコマンドを実行する必要があるが、移行時代は最小限のコマンドで実行できる。

  1. 制限事項の確認
  2. システムバックアップ(本文では省略)
  3. 移行元CentOSの事前準備
  4. 移行スクリプト実行
  5. 手動で実施する移行作業

2. 制限事項の確認

このツールの制限事項を確認しよう。英文と合わせて書いているが一部内容を補足している。スクリプトと同様に更新頻度が高いので、原文をチェックすることを推奨する。

Limitations
1.The script currently needs to be able communicate with the CentOS and Oracle Linux yum repositories either directly or via a proxy.

CentOSとOracle LinuxのYumリポジトリに直接もしくはプロキシ経由でアクセスできる必要がある。

2.The script currently does not support instances that are registered to a third-party management tool like Spacewalk, Foreman or Uyuni.

Spacewalkのようなパッケージ集中管理ツールの管理下になっていないこと。

3.Compatibility with packages installed from third-party repositories is expected but not guaranteed. Some software doesn't like the existence of an /etc/oracle-release file, for example.

CentOSの公式リポジトリ以外からインストールしたパッケージがあるときは動作保証しない。例えば、商用パッケージなどは/etc/oracle-releaseがあると動作に支障を来すことがある。おそらくEPELやRemi、ELrepoなどは大丈夫。

4.Packages that install third-party and/or closed-source kernel modules, e.g. commercial anti-virus products, may not work after switching.

サードパーティソフトやクローズドソースのカーネルモジュールを使っていると、移行後に動作しない可能性がある。具体的には、アンチウイルスソフトのリアルタイム監視モジュールや、HWベンダが提供するデバイスドライバなどだ。これらのカーネルモジュールはリリース番号まで完全に一致しないと動作しないことが多い。

5.The script only enables the base repositories required to enable switching to Oracle Linux. Users may need to enable additional repositories to obtain updates for packages already installed (see issue #1).

centos2ol.shはCentOSのベースリポジトリだけが有効になっているシステムを対象にしている。そのためPowerToolsリポジトリ(RHELのCodeReady Builder相当)などを有効にしているときは、それに相当するリポジトリを有効にする必要がある。

3. 移行元CentOSの事前準備

事前準備では、移行スクリプトを実行する条件を整える。

なお、事前準備作業には管理者権限が必要だ。そのためコマンドの前にsudoを前につけるか、suしてrootユーザーで実行する必要がある。前者が推奨だが、見た目の簡潔さを重視してsudoを省略している。運用方法に応じて適宜読み替えてほしい。

また、CentOS 8はyumではなくdnfだが、上位互換性があるのでyumに統一する。互換性がない部分だけ別に書くことにする。

重要
本文では触れないが、万が一のトラブルに備えて必ずシステムバックアップを取得すること。

3-1. 問題があるパッケージの有無を確認する

上記の「制限事項4」に該当するパッケージがインストールされていないことを確認する。なお、RPMを使わずにソースからインストールしているときは、今回説明する方法では判断できない。そのときは構築担当者に聞いてほしい。

ここで気をつけるパッケージは、ウイルスソフトやデバイスドライバ系などのカーネルモジュールだ。それ以外のパッケージはほぼ無視できる。

CentOS以外のリポジトリからインストールしているパッケージを確認する。確認には、おもに次の方法がある。それぞれについて説明する。

  • RPMのVenderに着目する
  • インストール元リポジトリ名に着目する
  1. VenderがCentOS以外のパッケージを確認する。
# rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{VENDOR}\n' | grep -v "CentOS"

次の例ではEPEL(Fedora Project)からインストールしているが、htopはユーザー空間で動作するアプリケーションなので問題ない。問題があるのはデバイスドライバなどのカーネルモジュールだ。

epel-release-8-9.el8    Fedora Project
gpg-pubkey-2f86d6a1-5cf7cefb    (none)
gpg-pubkey-8483c65d-5ccc5b19    (none)
htop-2.2.0-6.el8        Fedora Project

2.CentOS Plusカーネルなど、baseやupdates以外からインストールしてるカーネルがあるときは、yum removeで削除する。

# rpm -qa kernel* --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{VENDOR}\n' | grep -v "CentOS"

3.インストール元リポジトリ名に着目し、デフォルト以外のリポジトリからインストールしたものを表示する。ただし、list installedでは、パッケージ名やバージョン番号が長いと、行の途中で折り返され、問題ないパッケージも表示されることがある。基本的には1の方法を信頼してほしい。

CentOS7
yum list installed | grep -v @anaconda | grep -v @base | grep -v @updates | grep -v @extras
CentOS8
dnf list installed | grep -v @anaconda | grep -v @Base | grep -i -v @AppStream | grep -v @extras

4.次にカーネルバージョンに依存したカーネルモジュール(ドライバ類)がインストールされていないか確認する。完璧な方法はないが、今回はカーネルと同じバージョン番号がついたパッケージを調べている。

現在のカーネルバージョンを確認
# uname -r
4.18.0-147.el8.x86_64

以下の例では、いずれも標準リポジトリからインストールしたものなので問題ない。anacondaやupdatesは、いずれも標準リポジトリだ。

# yum list installed | grep 4.18.0-147
kernel.x86_64                 4.18.0-147.el8          @anaconda
kernel-core.x86_64            4.18.0-147.el8          @anaconda
kernel-modules.x86_64         4.18.0-147.el8          @anaconda

3-2. ベースリポジトリが有効になっていることを確認する

  1. リポジトリが有効になっていることを確認する。次のようにリポジトリが表示されれば有効になっている。あとで使うので、有効になっているリポジトリをメモしておくこと。
# yum repolist
CentOS7の場合
repo id               repo name                             status
base/7/x86_64         CentOS-7 - Base                       10,072
extras/7/x86_64       CentOS-7 - Extras                        448
updates/7/x86_64      CentOS-7 - Updates                       778
CentOS8の場合
repo id                       repo name
AppStream                     CentOS-8 - AppStream
BaseOS                        CentOS-8 - Base
extras                        CentOS-8 - Extras

2.次のようにrepolistからrepo idの間に、「This system is」で始まる文字が表示されたときは、Spacewalkなどのパッケージ管理システムの配下になっている。移行スクリプトは使えないので、先に無効にするか、スクリプトの利用を断念する。

# yum repolist
...
This system is receiving updates from Red Hat Satellite or Spacewalk server
repo id                       repo name

ヒント
CentOS 8のPowerToolsリポジトリは、Oracle Linux 8のol8_codeready_builderリポジトリに相当する。

3.リポジトリが表示されないときは、リポジトリが無効になっているか、プロキシ等の設定が不足している可能性がある。リポジトリを有効にする方法は次のとおり。プロキシの設定は/etc/yum.confを確認してほしい。

7用
# yum-config-manager --enable base updates extras
8用
# dnf config-manager --enable BaseOS AppStream extras

4.CentOS以外のリポジトリが有効になっているときは無効にする。無効にしたリポジトリは移行後に有効にする。次の例ではEPELリポジトリを無効にしている。

7,8共通
# yum-config-manager --disable epel
8専用
# dnf config-manager --disable epel

3-3. 自動アップデートを無効にする

移行作業中に自動アップデートが動作すると正常に動作しないので無効にする。CentOSの自動アップデート機能には次の2種類がある。

  • yum-cronやdnf-automaticなど
  • デスクトップ環境に組み込まれたPackagekit

デスクトップをインストールしていないときは前者だけを気にすればよい。しかし、デスクトップをインストールしているときは両方を意識する必要がある。

CentOS 7 CentOS 8
サービス yum-cron dnf-automatic
GUIデスクトップ Packagekit Packagekit

CentOS 7とCentOS 8について、それぞれ解説する。

3-3-1. yum-cronを無効にする(CentOS 7のみ)

  1. yum-cronがインストールされているか確認する。インストールされていないときは「3-2-3. Packagekitを無効にする」に進む。
# rpm -qa | grep yum-cron
★何も表示されなければインストールされていない。

2.インストールされているときは起動しているか確認する。次の例では、自動起動が有効で、サービスも起動している。

# systemctl is-enabled yum-cron
enabled ★自動起動有効

# systemctl status yum-cron
● yum-cron.service - Run automatic yum updates as a cron job
   Loaded: loaded (/usr/lib/systemd/system/yum-cron.service; enabled; vendor preset: disabled)
   Active: ★active (exited) since Tue 2020-12-15 08:38:03 GMT; 5min ago
  Process: 18679 ExecStart=/bin/touch /var/lock/subsys/yum-cron (code=exited, status=0/SUCCESS)
 Main PID: 18679 (code=exited, status=0/SUCCESS)

Dec 15 08:38:03 centos7 systemd[1]: Starting Run automatic yum updates as a.....
Dec 15 08:38:03 centos7 systemd[1]: Started Run automatic yum updates as a ...b.
Hint: Some lines were ellipsized, use -l to show in full.

3.yum-cronが起動しているときは、サービスを停止して自動起動もオフにする。

# systemctl disable yum-cron --now

3-3-2. dnf-automaticを無効にする(CentOS 8のみ)

  1. dnf-automaticがインストールされているか確認する。インストールされていないときは「3-2-3. Packagekitを無効にする」に進む。
# rpm -qa | grep dnf-automatic
★何も表示されなければインストールされていない。

2.インストールされているときはタイマーの設定を確認する。次の例では、自動ダウンロードが有効になっている。

# systemctl list-unit-files --type=timer | grep dnf-auto
dnf-automatic-download.timer   enabled ★ダウンロードのみ自動
dnf-automatic-install.timer    disabled
dnf-automatic-notifyonly.timer disabled
dnf-automatic.timer            disabled

3.enableになっているタイマーをすべて無効にする。

# systemctl disable dnf-automatic-download.timer --now

3-3-3. Packagekitを無効にする(CentOS 7/8共通)

GUIデスクトップ環境をインストールしているときは、Packagekitによるアップデートを無効化する。yum-cronやdnf-automaticは自動インストールされないが、デスクトップ環境がインストールされているときはPackagekitはデフォルトで有効化されているので注意が必要だ。

  1. packagekitのステータスを確認する。
# systemctl status packagekit
起動しているとき
● packagekit.service - PackageKit Daemon
   Loaded: loaded (/usr/lib/systemd/system/packagekit.service; static; vendor preset: disabled)
   Active: active (running) ★起動 since Tue 2020-12-15 09:31:27 GMT; 59s ago
 Main PID: 21960 (packagekitd)
    Tasks: 3
   CGroup: /system.slice/packagekit.service
           └─21960 /usr/libexec/packagekitd

Dec 15 09:31:26 centos7 systemd[1]: Starting PackageKit Daemon...
Dec 15 09:31:27 centos7 PackageKit[21960]: daemon start
Dec 15 09:31:27 centos7 systemd[1]: Started PackageKit Daemon.
停止しているとき
● packagekit.service - PackageKit Daemon
   Loaded: loaded (/usr/lib/systemd/system/packagekit.service; static; vendor preset: disabled)
   Active: inactive (dead) ★停止

Dec 15 09:31:26 centos7 systemd[1]: Starting PackageKit Daemon...
Dec 15 09:31:27 centos7 PackageKit[21960]: daemon start
Dec 15 09:31:27 centos7 systemd[1]: Started PackageKit Daemon.
Dec 15 09:33:36 centos7 systemd[1]: Stopping PackageKit Daemon...
Dec 15 09:33:36 centos7 systemd[1]: Stopped PackageKit Daemon.
Packagekitのサービス自体がないとき
Unit packagekit.service could not be found.

2.packagekitが起動しているときは、サービスを停止して自動起動もオフにする。

# systemctl disable packagekit --now

3-3-4.スクリプトをダウンロードする

移行スクリプトは、ブラウザからダウンロードする方法と、git cloneで直接ダウンロードする方法がある。

  1. sudoが可能な一般ユーザーでダウンロードする。gitがインストールされていないときはyum install gitでインストールすること。
$ git clone https://github.com/oracle/centos2ol.git

2.ブラウザからダウンロードするときは以下のページからダウンロードする。
github-centos2ol.png

3-3-5. 残りの準備作業

  1. Yumのキャッシュをクリアする。
# yum clean all

2./var/cacheに5GB以上の空き容量があることを確認する。空きがないときはLVMを駆使してなんとかする。

# df -h /var/cache
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        30G  1.7G   28G   6% /  ★この例では28GB空いている

4. Oracle Linuxへの移行実施

すべての準備が整ったのでOracle Linuxへの移行を実施する。

  1. git cloneしたディレクトリでは、centos2olディレクトリ配下にスクリプトがダウンロードされている。
$ ls -F
centos2ol/

2.centos2ol.shがスクリプト本体である。

$ cd centos2ol/
$ ls
centos2ol.sh  CONTRIBUTING.md  LICENSE.txt  README.md  SECURITY.md

$ wc -l centos2ol.sh
514 centos2ol.sh ★このときは514行ある

3.移行スクリプトを実行して、CentOSをOracle Linuxに切り替える。なお、実行にかかる時間は、インストールされているパッケージの数や回線速度、マシン性能に依存する。わたしが試した環境では30分から90分くらいだった。

sudo bash centos2ol.sh

4.実行が終了すると、以下の行が表示される。

Switch complete. Oracle recommends rebooting this system.

5.指示通りにシステムを再起動する。

$ sudo systemctl reboot

トラブルシュート
移行スクリプトの初期段階では、移行用repoファイル生成している。そのため途中でスクリプトが異常終了すると、repoファイルが中途半端な状態になる可能性がある。そのときは次のコマンドを実行して修復すること。

repoファイルの復活方法
cd /etc/yum.repos.d
sudo rm switch-to-oraclelinux.repo
sudo rename repo.disabled repo *disabled

5. 移行後の作業

移行スクリプトのおもな挙動は以下のとおり。いくつか確認してみよう。

  • CentOSのパッケージはOracle Linuxのパッケージに置き換えられる
  • 置き換えでは、同じバージョンではなく最新のバージョンになる
  • UEKカーネルがデフォルトカーネルになる
  • 標準リポジトリ以外のパッケージは変更されない

5-1. 移行後の構成を確認する

  1. /etc/oracle-releaseが追加され、/etc/centos-releaseは削除されている。
$ cat /etc/oracle-release
Oracle Linux Server release 8.3

$ cat /etc/centos-release
cat: /etc/centos-release: No such file or directory

2.カーネルはOracle Linux専用のUEK(Unbreakable Enterprise Kernel)に変更されている。UEKとRHCK(Red Hat互換カーネル)は、ユーザー空間で動作する通常のアプリケーションは互換性がある。

$ uname -r
5.4.17-2036.101.2.el8uek.x86_6

3.CentOS 8では、残っているCentOSのパッケージほとんどなかった。CentOS 7では半分くらいが置き換わらなかった。glibcやkernelではないので特に問題はないだろう。今後のスクリプトで改良されるかもしれない。

$ rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{VENDOR}\n' | grep CentOS | sort -n
kernel-4.18.0-147.el8   CentOS
kernel-4.18.0-193.14.2.el8_2    CentOS
kernel-core-4.18.0-147.el8      CentOS
kernel-core-4.18.0-193.14.2.el8_2       CentOS
kernel-modules-4.18.0-147.el8   CentOS
kernel-modules-4.18.0-193.14.2.el8_2    CentOS

4.カーネル関連パッケージとベンダを表示する。標準リポジトリのパッケージは最新化されるので、RHCKは最新のOracle Linux版と、元のCentOS版がインストールされている。

$  rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{VENDOR}\n' | grep kernel- | sort -n
kernel-4.18.0-240.1.1.el8_3     Oracle America★最新RHCK
kernel-4.18.0-240.el8   CentOS★元のカーネル
kernel-core-4.18.0-240.1.1.el8_3        Oracle America
kernel-core-4.18.0-240.el8      CentOS
kernel-headers-4.18.0-240.1.1.el8_3     Oracle America
kernel-modules-4.18.0-240.1.1.el8_3     Oracle America
kernel-modules-4.18.0-240.el8   CentOS
kernel-tools-4.18.0-240.1.1.el8_3       Oracle America
kernel-tools-libs-4.18.0-240.1.1.el8_3  Oracle America
kernel-uek-5.4.17-2036.101.2.el8uek     Oracle America★UEK

5.有効になっているリポジトリを確認する。

# yum repolist
CentOS7の場合
repo id           repo name                                               status
ol7_UEKR6/x86_64  Latest Unbreakable Enterprise Kernel Release 6 for Orac   204
ol7_latest/x86_64 Oracle Linux 7Server Latest (x86_64)                    21394
repolist: 21598
CentOS8の場合
repo id           repo name
ol8_UEKR6         Latest Unbreakable Enterprise Kernel Release 6 for Oracle Linux 8 (x86_64)
ol8_appstream     Oracle Linux 8 Application Stream (x86_64)
ol8_baseos_latest Oracle Linux 8 BaseOS Latest (x86_64)

ヒント
Oracle Cloud Infrastructureで移行スクリプトを実行したところ、クラウド用のリポジトリ構成になっていた。

5-2. スクリプト対象外の残作業

ここではスクリプトが実行しない、残りの作業を実施する。

1.「3-2」のリポジトリの確認で、標準外のリポジトリを無効にしたときは元に戻す。CentOS 8でPowerToolsを有効にしていたときは、代わりにol8_codeready_builderを有効にする。

7用
# yum-config-manager --enable リポジトリID
8用
# dnf config-manager --enable リポジトリID

2.アップデート可能なパッケージがあるか確認する。あるときはアップデートを検討する。

# yum check-update

3.デフォルトカーネルをRHCKに変更するときは、以下のエントリを参考にすること。

6. おわりに

当初の想定より大作になったが、スクリプトの前提条件を満たしたときの移行作業は簡単なことが分かっただろう。現時点では、スクリプトも十分読める範囲の長さだ。不具合があればGithubで報告してみてはどうだろう。

7. 参考資料

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOSからOracle Linuxへスクリプトで簡単に移行する

1. どこに移行すべきか

各所で話題になっているように、CentOS 8からCentOS 8 Streamへの変更は大きな驚きや落胆をもって迎えられている。筆者自身も驚き、すぐに以下の記事を書いたところだ。

CentOS 7は2024年6月まで猶予はあるが、CentOS 8は2021年12月31日までだ。あと1年しか猶予がない。そこで考えられるのが以下の選択肢だ。

  1. CentOS Streamに移行する
  2. RHELに移行する
  3. Oracle Linuxに移行する
  4. Ubuntuに移行する
  5. 上記以外のLinuxディストリビューションに移行する

どれにするかは、それぞれの考えで選ぶべきだろう。CentOS Streamへの移行方法は、いろいろなところで語られているので、今回は以下のメリットがあるOracle Linuxへの移行方法を解説する。

  • 無料で利用できるRHEL互換ディストリビューション
  • RHELと同じ期間、アップデートパッケージを無償で利用できる
  • 必要に応じてサポート契約でき、Red Hatエンタープライズ契約ほど規約が厳しくない
  • 追加料金を払えば、通常より長いExtended Supportもある

1-1. 対象環境

  • CentOS 7 / CentOS 8
  • オンプレミスとパブリッククラウドの両方

※ 今回使用するcentos2ol.shスクリプトはCentOS 6にも対応しているが、CentOS 6はサポートが切れているので説明しない。

2. Oracle Linuxへの移行方法

移行にはいろいろな方法があり、今回は下記Oracle Linux Blogで紹介しているcentos2ol.shを使用する。

実際に手を動かす前に「Oracle Linux: A better alternative to CentOS」をサクッと眺めてほしい。また、実際の移行方法はGithubのoracle/centos2olに書かれている。

https://github.com/oracle/centos2ol

なお、このスクリプトは急に注目されているので、新しいIssues/Pull requestsが上がっている。そのため今後は、本記事の内容と違いが発生するかもしれない。

移行手順
移行の実行手順は以下のとおり。1から3の事前作業では複数のコマンドを実行する必要がある。しかし、4と5の移行作業は最小限のコマンドで実行できる。

  1. 制限事項の確認
  2. システムバックアップ(本文では省略)
  3. 移行元CentOSの事前準備
  4. 移行スクリプト実行
  5. 手動で実施する移行作業

2. 制限事項の確認

このツールの制限事項を確認しよう。英文と合わせて書いているが一部内容を補足している。スクリプトと同様に更新頻度が高いので、原文をチェックすることを推奨する。

Limitations
1.The script currently needs to be able communicate with the CentOS and Oracle Linux yum repositories either directly or via a proxy.

CentOSとOracle LinuxのYumリポジトリに直接もしくはプロキシ経由でアクセスできる必要がある。

2.The script currently does not support instances that are registered to a third-party management tool like Spacewalk, Foreman or Uyuni.

Spacewalkのようなパッケージ集中管理ツールの管理下になっていないこと。

3.Compatibility with packages installed from third-party repositories is expected but not guaranteed. Some software doesn't like the existence of an /etc/oracle-release file, for example.

CentOSの公式リポジトリ以外からインストールしたパッケージがあるときは動作保証しない。例えば、商用パッケージなどは/etc/oracle-releaseがあると動作に支障を来すことがある。おそらくEPELやRemi、ELrepoなどは大丈夫。

4.Packages that install third-party and/or closed-source kernel modules, e.g. commercial anti-virus products, may not work after switching.

サードパーティソフトやクローズドソースのカーネルモジュールを使っていると、移行後に動作しない可能性がある。具体的には、アンチウイルスソフトのリアルタイム監視モジュールや、HWベンダが提供するデバイスドライバなどだ。これらのカーネルモジュールはリリース番号まで完全に一致しないと動作しないことが多い。

5.The script only enables the base repositories required to enable switching to Oracle Linux. Users may need to enable additional repositories to obtain updates for packages already installed (see issue #1).

centos2ol.shはCentOSのベースリポジトリだけが有効になっているシステムを対象にしている。そのためPowerToolsリポジトリ(RHELのCodeReady Builder相当)などを有効にしているときは、それに相当するリポジトリを有効にする必要がある。

※PowerToolsはサードパーティーリポジトリではないので有効にしたままでも問題なさそう。

3. 移行元CentOSの事前準備

事前準備では、移行スクリプトを実行する条件を整える。

なお、事前準備作業には管理者権限が必要だ。そのためコマンドの前にsudoを前につけるか、suしてrootユーザーで実行する必要がある。前者が推奨だが、見た目の簡潔さを重視してsudoを省略している。運用方法に応じて適宜読み替えてほしい。

また、CentOS 8はyumではなくdnfだが、上位互換性があるのでyumに統一する。互換性がない部分だけ別に書くことにする。

重要
本文では触れないが、万が一のトラブルに備えて必ずシステムバックアップを取得すること。

3-1. 問題があるパッケージの有無を確認する

上記の「制限事項4」に該当するパッケージがインストールされていないことを確認する。なお、RPMを使わずにソースからインストールしているときは、今回説明する方法では判断できない。そのときは構築担当者に聞いてほしい。

注意するパッケージは、CentOSのリポジトリに含まれていないデバイスドライバやアンチウイルスソフトなどのカーネルモジュールだ。

そこで、CentOS以外のリポジトリからインストールしているパッケージを確認する。確認には、おもに次の方法がある。それぞれについて説明する。

  • RPMのVendorに着目する
  • インストール元リポジトリ名に着目する
  1. VendorがCentOS以外のパッケージを確認する。
# rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{VENDOR}\n' | grep -v "CentOS"

次の例ではEPEL(Fedora Project)からインストールしたパッケージがある。しかし、htopはユーザー空間で動作するアプリケーションなので問題ない。問題があるのはデバイスドライバなどのカーネルモジュールだ。

epel-release-8-9.el8    Fedora Project
gpg-pubkey-2f86d6a1-5cf7cefb    (none)
gpg-pubkey-8483c65d-5ccc5b19    (none)
htop-2.2.0-6.el8        Fedora Project

ただし「制限事項3」にあるように、サードパーティアプリケーションは問題になる可能性がある。

2.CentOS Plusカーネルなど、baseやupdates以外からインストールしてるカーネルがあるときは、yum removeで削除する。

# rpm -qa kernel* --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{VENDOR}\n' | grep -v "CentOS"

3.インストール元リポジトリ名に着目し、デフォルト以外のリポジトリからインストールしたものを表示する。ただし、list installedでは、パッケージ名やバージョン番号が長いと、行の途中で折り返され、問題ないパッケージも表示されることがある。基本的には1の方法を信頼してほしい。

CentOS7
yum list installed | grep -v @anaconda | grep -v @base | grep -v @updates | grep -v @extras
CentOS8
dnf list installed | grep -v @anaconda | grep -v @Base | grep -i -v @AppStream | grep -v @extras

4.次にカーネルバージョンに依存したカーネルモジュール(ドライバ類)がインストールされていないか確認する。完璧な方法はないが、今回はカーネルと同じバージョン番号がついたパッケージを調べている。

現在のカーネルバージョンを確認
# uname -r
4.18.0-147.el8.x86_64

以下の例は、いずれもベースリポジトリからインストールしたものなので問題ない。anacondaやupdatesは、いずれもベースリポジトリだ。

# yum list installed | grep 4.18.0-147
kernel.x86_64                 4.18.0-147.el8          @anaconda
kernel-core.x86_64            4.18.0-147.el8          @anaconda
kernel-modules.x86_64         4.18.0-147.el8          @anaconda

3-2. ベースリポジトリが有効になっていることを確認する

  1. ベースリポジトリが有効になっていることを確認する。次のようにリポジトリが表示されれば有効になっている。あとで使うので、有効になっているリポジトリをメモしておくこと。
# yum repolist
CentOS7の場合
repo id               repo name                             status
base/7/x86_64         CentOS-7 - Base                       10,072
extras/7/x86_64       CentOS-7 - Extras                        448
updates/7/x86_64      CentOS-7 - Updates                       778
CentOS8の場合
repo id                       repo name
AppStream                     CentOS-8 - AppStream
BaseOS                        CentOS-8 - Base
extras                        CentOS-8 - Extras

ヒント
CentOS 8のPowerToolsリポジトリは、Oracle Linux 8のol8_codeready_builderリポジトリに相当する。

2.次のようにrepolistからrepo idの間に、「This system is」で始まる文字が表示されたときは、Spacewalkなどのパッケージ管理システムの配下になっている。移行スクリプトは使えないので、無効にするか、スクリプトの利用を断念する。

# yum repolist
...
This system is receiving updates from Red Hat Satellite or Spacewalk server
repo id                       repo name

3.リポジトリが表示されないときは、リポジトリが無効になっているか、プロキシ等の設定が不足している可能性がある。リポジトリを有効にする方法は次のとおり。プロキシの設定は/etc/yum.confを確認してほしい。

7用
# yum-config-manager --enable base updates extras
8用
# dnf config-manager --enable BaseOS AppStream extras

4.CentOS以外のリポジトリが有効になっているときは無効にする。無効にしたリポジトリは移行後に有効にする。次の例ではEPELリポジトリを無効にしている。

7,8共通
# yum-config-manager --disable epel
8用
# dnf config-manager --disable epel

ヒント
ソースを読む限り、以下のリポジトリは有効のままでも自動的に移行してくれそうだ。しかし、十分にテストしていないので、判断はみなさんにお任せする。

CentOSバージョン リポジトリ
7 epel
base-debuginfo
centos-ceph-jewel
centos-gluster*
entos-nfs-ganesha30
centos-ovirt*
centos-sclo-*
8 epel
HighAvailability
PowerTools
centos-release-nfs-ganesha28
centos-gluster*

3-3. 自動アップデートを無効にする

移行作業中に自動アップデートが動作すると正常に動作しないので無効にする。CentOSの自動アップデート機能には次の2種類がある。

  • yum-cronやdnf-automaticなど
  • デスクトップ環境に組み込まれたPackagekit

デスクトップをインストールしていないときは前者だけを気にすればよい。しかし、デスクトップをインストールしているときは両方を意識する必要がある。

CentOS 7 CentOS 8
サービス yum-cron dnf-automatic
GUIデスクトップ Packagekit Packagekit

CentOS 7とCentOS 8について、それぞれ解説する。

3-3-1. yum-cronを無効にする(CentOS 7のみ)

  1. yum-cronがインストールされているか確認する。インストールされていないときは「3-2-3. Packagekitを無効にする」に進む。
# rpm -qa | grep yum-cron
★何も表示されなければインストールされていない。

2.インストールされているときは起動しているか確認する。次の例では、自動起動が有効で、サービスも起動している。

# systemctl is-enabled yum-cron
enabled ★自動起動有効

# systemctl status yum-cron
● yum-cron.service - Run automatic yum updates as a cron job
   Loaded: loaded (/usr/lib/systemd/system/yum-cron.service; enabled; vendor preset: disabled)
   Active: ★active (exited) since Tue 2020-12-15 08:38:03 GMT; 5min ago
  Process: 18679 ExecStart=/bin/touch /var/lock/subsys/yum-cron (code=exited, status=0/SUCCESS)
 Main PID: 18679 (code=exited, status=0/SUCCESS)

Dec 15 08:38:03 centos7 systemd[1]: Starting Run automatic yum updates as a.....
Dec 15 08:38:03 centos7 systemd[1]: Started Run automatic yum updates as a ...b.
Hint: Some lines were ellipsized, use -l to show in full.

3.yum-cronが起動しているときは、サービスを停止して自動起動もオフにする。

# systemctl disable yum-cron --now

3-3-2. dnf-automaticを無効にする(CentOS 8のみ)

  1. dnf-automaticがインストールされているか確認する。インストールされていないときは「3-2-3. Packagekitを無効にする」に進む。
# rpm -qa | grep dnf-automatic
★何も表示されなければインストールされていない。

2.インストールされているときはタイマーの設定を確認する。次の例では、自動ダウンロードが有効になっている。

# systemctl list-unit-files --type=timer | grep dnf-auto
dnf-automatic-download.timer   enabled ★ダウンロードのみ自動
dnf-automatic-install.timer    disabled
dnf-automatic-notifyonly.timer disabled
dnf-automatic.timer            disabled

3.enableになっているタイマーをすべて無効にする。

# systemctl disable dnf-automatic-download.timer --now

3-3-3. Packagekitを無効にする(CentOS 7/8共通)

GUIデスクトップ環境をインストールしているときは、Packagekitによるアップデートを無効化する。yum-cronやdnf-automaticは自動インストールされないが、デスクトップ環境がインストールされているときはPackagekitはデフォルトで有効化されているので注意が必要だ。

  1. packagekitのステータスを確認する。
# systemctl status packagekit
起動しているとき
● packagekit.service - PackageKit Daemon
   Loaded: loaded (/usr/lib/systemd/system/packagekit.service; static; vendor preset: disabled)
   Active: active (running) ★起動 since Tue 2020-12-15 09:31:27 GMT; 59s ago
 Main PID: 21960 (packagekitd)
    Tasks: 3
   CGroup: /system.slice/packagekit.service
           └─21960 /usr/libexec/packagekitd

Dec 15 09:31:26 centos7 systemd[1]: Starting PackageKit Daemon...
Dec 15 09:31:27 centos7 PackageKit[21960]: daemon start
Dec 15 09:31:27 centos7 systemd[1]: Started PackageKit Daemon.
停止しているとき
● packagekit.service - PackageKit Daemon
   Loaded: loaded (/usr/lib/systemd/system/packagekit.service; static; vendor preset: disabled)
   Active: inactive (dead) ★停止

Dec 15 09:31:26 centos7 systemd[1]: Starting PackageKit Daemon...
Dec 15 09:31:27 centos7 PackageKit[21960]: daemon start
Dec 15 09:31:27 centos7 systemd[1]: Started PackageKit Daemon.
Dec 15 09:33:36 centos7 systemd[1]: Stopping PackageKit Daemon...
Dec 15 09:33:36 centos7 systemd[1]: Stopped PackageKit Daemon.
Packagekitのサービス自体がないとき
Unit packagekit.service could not be found.

2.packagekitが起動しているときは、サービスを停止して自動起動もオフにする。

# systemctl disable packagekit --now

3-3-4.スクリプトをダウンロードする

移行スクリプトをダウンロードする方法は複数ある。いずれの場合でも、スクリプトを実行するsudoが可能なユーザーを使用すること。

A. curlを使う
プロキシ環境では--proxyオプションやhttps_proxy環境変数でプロキシサーバを指定すること。

$ curl -O https://raw.githubusercontent.com/oracle/centos2ol/main/centos2ol.sh

B. gitを使う
gitがインストールされていないときは、事前にyum install gitでgitをインストールする。プロキシに関してはgitも同様。

$ git clone https://github.com/oracle/centos2ol.git

C. ブラウザを使う
以下のページからダウンロードして、適正なフォルダに配置する。
github-centos2ol.png

3-3-5. 残りの準備作業

  1. Yumのキャッシュをクリアする。
# yum clean all

2./var/cacheに5GB以上の空き容量があることを確認する。空きがないときはLVMを駆使してなんとかする。

# df -h /var/cache
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        30G  1.7G   28G   6% /  ★この例では28GB空いている

4. Oracle Linuxへの移行

すべての準備が整ったのでOracle Linuxへの移行を実施する。

  1. git cloneしたディレクトリでは、centos2olディレクトリ配下にスクリプトがダウンロードされている。
$ ls -F
centos2ol/

2.centos2ol.shがスクリプト本体である。

$ cd centos2ol/
$ ls
centos2ol.sh  CONTRIBUTING.md  LICENSE.txt  README.md  SECURITY.md

$ wc -l centos2ol.sh
514 centos2ol.sh ★このときは514行ある

3.移行スクリプトを実行して、CentOSをOracle Linuxに切り替える。なお、実行にかかる時間は、インストールされているパッケージ数や回線速度、マシン性能に依存する。わたしが試した環境では30分から90分くらいだった。

sudo bash centos2ol.sh

4.実行が終了すると、以下の行が表示される。

Switch complete. Oracle recommends rebooting this system.

5.指示通りにシステムを再起動する。

$ sudo systemctl reboot

トラブルシュート
移行スクリプトの初期段階では、移行用repoファイル生成している。そのため途中でスクリプトが異常終了すると、repoファイルが中途半端な状態になる可能性がある。そのときは次のコマンドを実行して修復すること。

repoファイルの復活方法
cd /etc/yum.repos.d
sudo rm switch-to-oraclelinux.repo
sudo rename repo.disabled repo *disabled

5. 移行後の作業

移行スクリプトのおもな挙動は以下のとおり。いくつか確認してみよう。

  • CentOSのパッケージはOracle Linuxのパッケージに置き換えられる
  • 置き換えでは、同じバージョンではなく最新のバージョンになる
  • UEKカーネルがデフォルトカーネルになる

5-1. 移行後の構成を確認する

  1. /etc/oracle-releaseが追加され、/etc/centos-releaseは削除されている。
$ cat /etc/oracle-release
Oracle Linux Server release 8.3

$ cat /etc/centos-release
cat: /etc/centos-release: No such file or directory

2.現在のカーネルを確認すると、Oracle Linux専用のUEK(Unbreakable Enterprise Kernel)に変更されている。UEKとRed Hat互換カーネル(RHCK:Red Hat Compatible Kernel)は、ユーザー空間で動作する通常のアプリケーションは互換性がある。

$ uname -r
5.4.17-2036.101.2.el8uek.x86_6

3.VendorがCentOSのパッケージを調べてみた。すると、現在利用していないカーネルだけが表示された。CentOS 8では、このようにほとんど置き換わったが、CentOS 7では半分くらいが置き換わらなかった。glibcやkernelではないので特に問題はないだろう。今後のスクリプトで改良されるかもしれない。

$ rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{VENDOR}\n' | grep CentOS | sort -n
kernel-4.18.0-147.el8   CentOS
kernel-4.18.0-193.14.2.el8_2    CentOS
kernel-core-4.18.0-147.el8      CentOS
kernel-core-4.18.0-193.14.2.el8_2       CentOS
kernel-modules-4.18.0-147.el8   CentOS
kernel-modules-4.18.0-193.14.2.el8_2    CentOS

4.カーネル関連パッケージとベンダを表示する。ベースリポジトリのパッケージは最新化されるので、RHCKは最新のOracle Linux版と、元のCentOS版がインストールされている。

$  rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{VENDOR}\n' | grep kernel- | sort -n
kernel-4.18.0-240.1.1.el8_3     Oracle America★最新RHCK
kernel-4.18.0-240.el8   CentOS★元のカーネル
kernel-core-4.18.0-240.1.1.el8_3        Oracle America
kernel-core-4.18.0-240.el8      CentOS
kernel-headers-4.18.0-240.1.1.el8_3     Oracle America
kernel-modules-4.18.0-240.1.1.el8_3     Oracle America
kernel-modules-4.18.0-240.el8   CentOS
kernel-tools-4.18.0-240.1.1.el8_3       Oracle America
kernel-tools-libs-4.18.0-240.1.1.el8_3  Oracle America
kernel-uek-5.4.17-2036.101.2.el8uek     Oracle America★UEK

5.有効になっているリポジトリを確認する。Oracle Linuux用に置き換わっていることが分かる。

# yum repolist
CentOS7の場合
repo id           repo name                                               status
ol7_UEKR6/x86_64  Latest Unbreakable Enterprise Kernel Release 6 for Orac   204
ol7_latest/x86_64 Oracle Linux 7Server Latest (x86_64)                    21394
repolist: 21598
CentOS8の場合
repo id           repo name
ol8_UEKR6         Latest Unbreakable Enterprise Kernel Release 6 for Oracle Linux 8 (x86_64)
ol8_appstream     Oracle Linux 8 Application Stream (x86_64)
ol8_baseos_latest Oracle Linux 8 BaseOS Latest (x86_64)

ヒント
Oracle Cloud Infrastructureで移行スクリプトを実行したところ、クラウド用のリポジトリ構成になっていた。

6.リポジトリのrepoファイルを確認すると、CentOSのものは.disableという接尾辞が付けられ無効になっている。実際には.repo以外は無視される。

# ls /etc/yum.repos.d
CentOS-Linux-AppStream.repo.disabled
CentOS-Linux-BaseOS.repo.disabled
CentOS-Linux-ContinuousRelease.repo.disabled
CentOS-Linux-Debuginfo.repo.disabled
CentOS-Linux-Devel.repo.disabled
CentOS-Linux-Extras.repo.disabled
CentOS-Linux-FastTrack.repo.disabled
CentOS-Linux-HighAvailability.repo.disabled
CentOS-Linux-Media.repo.disabled
CentOS-Linux-Plus.repo.disabled
CentOS-Linux-PowerTools.repo.disabled
CentOS-Linux-Sources.repo.disabled
oracle-linux-ol8.repo
uek-ol8.repo

5-2. スクリプト対象外の残作業

最後に、スクリプトが実行しない残作業を実施する。

1.「3-2」のリポジトリの確認で、事前にリポジトリを無効にしたときは元に戻す。

7用
# yum-config-manager --enable リポジトリID
8用
# dnf config-manager --enable リポジトリID

CentOSとOracle Linuxのリポジトリ比較表は以下のとおり。CentOSのextrasに相当するリポジトリは無い。

CentOS 7 Oracle Linux 7
base
updates
ol7_latest
centos-ceph-jewel oracle-gluster-release-el7
centos-gluster*
entos-nfs-ganesha*
oracle-gluster-release-el7
centos-ovirt* oracle-ovirt-release-el7
centos-sclo-sclo
centos-sclo-rh
oracle-softwarecollection-release-el7
CentOS 8 Oracle Linux 8
BaseOS ol8_baseos_latest
AppStream ol8_appstream
HighAvailability ol8_addons
PowerTools ol8_codeready_builder
centos-release-nfs-ganesha* oracle-gluster-release-el8
centos-gluster* oracle-gluster-release-el8

2.アップデート可能なパッケージがあるか確認する。あるときはアップデートを検討する。

# yum check-update

3.デフォルトカーネルをRHCKに変更するときは、以下のエントリを参考にすること。

6. おわりに

当初の想定より大作になったが、スクリプトの前提条件を満たしたときの移行作業は簡単なことが分かっただろう。現時点では、スクリプトも十分読める範囲の長さだ。不具合があればGithubで報告してみてはどうだろう。

まとめ

  • 移行スクリプトcentos2ol.shを使うと、簡単にCentOSをOracle Linuxへ変更できる。
  • 移行にかかる時間はサーバ1台当たり30分から90分程度。インストール済みパッケージ数やサーバー性能、回線速度に依存する。
  • インターネットのリポジトリに接続可能なこと(プロキシ経由OK)など、スクリプトにはいくつかの制約条件がある。
  • オンプレミスのベアメタルサーバーでデバイスドライバを追加している場合や、アンチウイルスソフトを導入しているときは、再起動に失敗する可能性があるので事前に調査する。

7. 参考資料

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

1−1.WEB系エンジニアになるためのインプット(準備)

はじめに

メーカ系SIer企業で働いているのですが、少し物足りなさを感じております。
そこで副業の一環として、まずはWEB系エンジニアを目指すために「web系エンジニアになろう」(著:勝又健太)を読了しました。
まずは基礎を固めるためにインプットを行うが、併せて内容をアウトプットするために本記事を作成していく。

学習フロー

既にコンピュータサイエンスの基礎知識やクラウドサービスであるAWSの知見を有しているので、下記のように進める。

  1. Linux基礎
  2. JavaScript基礎
  3. RDBとSQL基礎
  4. GitとGitHub基礎
  5. Ruby基礎
  6. Ruby on Rails基礎

以降はポートフォリオ作成を進めたい。

教材

基本的には勤め先で提供されているUdemy for businessを活用する。
※勤め先には感謝です・・・

例えば、Linux基礎では下記教材で学びを進めていく。
【5日でできる】はじめての Linux 入門(LPIC Level1対応)
(講師:井上 博樹 (Hiroki Inoue))

環境

PCはMacBookAirを利用している。

  • MacBook Air (Retina, 13-inch, 2019)
  • プロセッサー:1.6 GHz デュアルコアIntel Core i5
  • メモリ:8 GB 2133 MHz LPDDR3

また、Linux環境が必要である場合、VirtualBoxの利用も考えられるが、PC(Macを利用)が重たくなるのでAWSのEC2を活用した。
例えば、Linux基礎で使う環境は下記とする。

  • リージョン:アジアパシフィック (東京)ap-northeast-1
  • AMI:Ubuntu Server 20.04 LTS (HVM), SSD Volume Type
  • インスタンスタイプ:t2.micro

最後に

まずはLinux基礎を固めるためにインプットを行い、次はLinux基礎のアウトプット記事を掲載する。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Linux】備忘録

概要

  • 備忘録

使用頻度高

init

名称 特徴
SysVinit ランレベルによってシステムの状態を管理
Upstart ランレベルによってシステムの状態を管理
systemd ターゲットによってシステムの状態を管理
  • systemdサブコマンド集
    • systemdのコマンドはsystemctl

Screen Shot 2020-12-16 at 10.39.12.png

起動関連のターゲットディレクトリ

  • /etc/systemd/system/default.target
    • 上記にはシンボリックリンクが設定されている
    • リンクは上書きできないので、変更の際には事前削除が必要となる
      • ln ファイル名 リンク名でハードリンクを作成
      • ln -s ファイル名 リンク名でシンボリックリンクを作成
  • ランレベルとターゲットの互換表

Screen Shot 2020-12-16 at 11.08.45.png

tar(アーカイブ機能)

  • tar [オプション][ディレクトリ名][ファイル名]
  • 圧縮はしないし、まとめる前の情報を保持すれば、元のファイル要領より大きくなることもある

ln(リンクの作成)

  • ln [オプション] リンク元 リンク先
    • オプション無しでハードリンク作成
      • ハードリンク
        • ファイルの実体を直接参照するリンク
        • ディレクトリのハードリンクは作成できない(循環ディレクトリの生成を防ぐため)
        • 異なるパーティションには作成できない(inodeが別々に管理されているため重複したりするから)
    • オプション -s でシンボリックリンク作成
      • シンボリックリンク
        • 元ファイルの場所を指し示すリンク(Windowsでのショートカットのようなもの)

Linuxでのファイル管理

  • ファイル(ディレクトリも含む)を「ファイルの実体(データ本体)」と「inode」を使用して管理している
    • inodeはラベルのようなもの
    • inode(ハードリンク)が0になった時、ファイルが削除される

プロセス停止

  • kill [プロセスID]
    • ※killはプロセスIDを指定する
  • killall [-シグナル名または-シグナル番号]
  • killall -s [-シグナル名または-シグナル番号]
  • pkill [-シグナル名または-シグナル番号] プロセス名(コマンド名)
  • pkill --signal [-シグナル名または-シグナル番号] プロセス名(コマンド名)
    • ※killallおよびpkillでシグナルを指定しない場合は15(TERM)が選択される

Screen Shot 2020-12-16 at 11.59.20.png

プロセス監視

  • ps [オプション]
    • 「-」を付けないBSDオプションと、「-」で始まるUNIXオプションがある

Screen Shot 2020-12-16 at 12.42.47.png

Docker

主なコマンド

Screen Shot 2020-12-16 at 12.20.36.png

使用頻度低

仮想端末制御プログラム

多数の端末プログラムを使用するのではなく、仮想端末を制御するプログラムを動作させることで、一つの端末上で複数の端末を利用する手段
- screen
- tmux

VM

virsh

  • libvirt(オープンソースの仮想化管理用のライブラリ)を操作するためのシェル
  • 仮想マシンのリソース管理や仮想ネットワークの管理など、様々な操作が可能
  • コマンド集

Screen Shot 2020-12-16 at 11.46.15.png

chown, chgrp(所属グループ)

  • 所有グループを変更することができる
    • chown [-R] :グループ名 ファイルまたはディレクトリ
    • chgrp [-R] グループ名 ファイルまたはディレクトリ
      • 「-R」オプションを使用すると、指定したディレクトリおよびその配下にあるファイルの所有ユーザやグループを再帰的に変更します
      • 「-R」オプションがない場合、ディレクトリのみ所有グループを変更します

chmod(パーミッション)

  • 3桁がユーザー(U)、グループ(G)、その他(O)の状況を表す
  • 状況は以下の数字の合計値
    • 753であれば[全権限(4+2+1)][読み・実行(4+1)][書き・実行(2+1)]
権限 記号 数値
読み r 4
書き w 2
実行 x 1

find(検索)

  • 指定したディレクトリ以下からファイルやディレクトリを検索するコマンド
    • find [検索起点ディレクトリ] [検索式] [アクション]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Linux/LPIC】備忘録

概要

  • 備忘録

使用頻度高

init

名称 特徴
SysVinit ランレベルによってシステムの状態を管理
Upstart ランレベルによってシステムの状態を管理
systemd ターゲットによってシステムの状態を管理
  • systemdサブコマンド集
    • systemdのコマンドはsystemctl

Screen Shot 2020-12-16 at 10.39.12.png

起動関連のターゲットディレクトリ

  • /etc/systemd/system/default.target
    • 上記にはシンボリックリンクが設定されている
    • リンクは上書きできないので、変更の際には事前削除が必要となる
      • ln ファイル名 リンク名でハードリンクを作成
      • ln -s ファイル名 リンク名でシンボリックリンクを作成
  • ランレベルとターゲットの互換表

Screen Shot 2020-12-16 at 11.08.45.png

tar(アーカイブ機能)

  • tar [オプション][ディレクトリ名][ファイル名]
  • 圧縮はしないし、まとめる前の情報を保持すれば、元のファイル要領より大きくなることもある

ln(リンクの作成)

  • ln [オプション] リンク元 リンク先
    • オプション無しでハードリンク作成
      • ハードリンク
        • ファイルの実体を直接参照するリンク
        • ディレクトリのハードリンクは作成できない(循環ディレクトリの生成を防ぐため)
        • 異なるパーティションには作成できない(inodeが別々に管理されているため重複したりするから)
    • オプション -s でシンボリックリンク作成
      • シンボリックリンク
        • 元ファイルの場所を指し示すリンク(Windowsでのショートカットのようなもの)

Linuxでのファイル管理

  • ファイル(ディレクトリも含む)を「ファイルの実体(データ本体)」と「inode」を使用して管理している
    • inodeはラベルのようなもの
    • inode(ハードリンク)が0になった時、ファイルが削除される

プロセス停止

  • kill [プロセスID]
    • ※killはプロセスIDを指定する
  • killall [-シグナル名または-シグナル番号]
  • killall -s [-シグナル名または-シグナル番号]
  • pkill [-シグナル名または-シグナル番号] プロセス名(コマンド名)
  • pkill --signal [-シグナル名または-シグナル番号] プロセス名(コマンド名)
    • ※killallおよびpkillでシグナルを指定しない場合は15(TERM)が選択される

Screen Shot 2020-12-16 at 11.59.20.png

プロセス監視

  • ps [オプション]
    • 「-」を付けないBSDオプションと、「-」で始まるUNIXオプションがある

Screen Shot 2020-12-16 at 12.42.47.png

Docker

主なコマンド

Screen Shot 2020-12-16 at 12.20.36.png

使用頻度低

仮想端末制御プログラム

多数の端末プログラムを使用するのではなく、仮想端末を制御するプログラムを動作させることで、一つの端末上で複数の端末を利用する手段
- screen
- tmux

VM

virsh

  • libvirt(オープンソースの仮想化管理用のライブラリ)を操作するためのシェル
  • 仮想マシンのリソース管理や仮想ネットワークの管理など、様々な操作が可能
  • コマンド集

Screen Shot 2020-12-16 at 11.46.15.png

chown, chgrp(所属グループ)

  • 所有グループを変更することができる
    • chown [-R] :グループ名 ファイルまたはディレクトリ
    • chgrp [-R] グループ名 ファイルまたはディレクトリ
      • 「-R」オプションを使用すると、指定したディレクトリおよびその配下にあるファイルの所有ユーザやグループを再帰的に変更します
      • 「-R」オプションがない場合、ディレクトリのみ所有グループを変更します

chmod(パーミッション)

  • 3桁がユーザー(U)、グループ(G)、その他(O)の状況を表す
  • 状況は以下の数字の合計値
    • 753であれば[全権限(4+2+1)][読み・実行(4+1)][書き・実行(2+1)]
権限 記号 数値
読み r 4
書き w 2
実行 x 1

find(検索)

  • 指定したディレクトリ以下からファイルやディレクトリを検索するコマンド
    • find [検索起点ディレクトリ] [検索式] [アクション]

スナップショットとバックアップの違い

特徴 違い
スナップショット 更新されたデータ 更新されたデータのみ更新
バックアップ ストレージ内容すべて 記憶領域の全てを保存する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【VScode】the remote host may not meet vs code server's prerequisites for glibc and libstdc++ vscode

VScodeでリモートサーバーにSSHで接続しようとしたら起きたエラー

なんかVScodeの右下に表示されたやつ

the remote host may not meet vs code server's prerequisites
 for glibc and libstdc++ vscode

意味わかんな。。
まぁ、リモートサーバーにアップデートかければ治りそうだな。

sudo yum update

アプデしよー
。。。

中略  Read-only file system

え?なんでいきなり_?ワイrootなんやが。

# mount -o rw,remount /
sudo yum update

はい接続できた!!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

yumコマンドが急に使えなくなった時の対処法

なんかいきなり「Read-only file system」とか言われるんやが?

なんで?なんで?なんで?なんで?なんで?なんで?なんで?なんで?なんで?なんで?

作業停止1-2時間

ワイは見つけた。

# mount -o rw,remount /

なんかこれで「Read-only file system」とか言われなくなった!!

linuxコマンド勉強しよーって思った。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Linux】【AWS Lambda】Cron形式の設定マニュアル

背景

WEBサイトのクローリング、サーバーの死活監視データベースのバックアップ など、ものごとを定期的に行なう際に、スケジュール実行を可能とするCron形式について、Linuxでの設定方法・設定例と、AWS Lambdaにおける設定方法や設定例をまとめます。

先人たちの知恵をお借りするなどして解決できたことを、この場をお借りして感謝するとともに、大変恐縮ですが自分のメモとしても、こちらへまとめておきます。

環境

  • AWS EC2 (Amazon Linux 2)
  • AWS Lambda
  • Python 3.7.9    ※2020/12/10時点のAmazon Linux2でのデフォルト
  • Django 3.1.3
  • PostgreSQL 11.5  ※同上
  • Nginx 1.12     ※同上
  • Gunicorn
  • PuTTY 0.74

1. Linux における設定方法・設定例

1-1. 形式

<分> <時> <日> <月> <曜日> <コマンド>

1-2. パラメータ

  • すべてのパラメータが必須です。
  • タイムゾーンはUTC(協定世界時)のみで変更不可。JST(日本標準時)として指定するには、UTCに対して「-9時間」とする(9時間を差し引く)必要があります。
  • 分未満(秒単位)の指定はサポートされていません。
No. フィールド ワイルドカード
1 0~59 「/」(スラッシュ)、「*」(アスタリスク)「-」(ハイフン)、「,」(カンマ)
2 0~23 「/」(スラッシュ)、「*」(アスタリスク)「-」(ハイフン)、「,」(カンマ)
3 1~31 「/」(スラッシュ)、「*」(アスタリスク)「-」(ハイフン)、「,」(カンマ)
4 1~12 または JAN~DEC 「/」(スラッシュ)、「*」(アスタリスク)「-」(ハイフン)、「,」(カンマ)
5 曜日 1~7 または SUN~SAT 「/」(スラッシュ)、「*」(アスタリスク)「-」(ハイフン)、「,」(カンマ)
6 コマンド 任意のコマンド (なし)

1-3. ワイルドカード

  • 分未満(秒単位)の指定はサポートされていません。
  • 実際に指定する際に、ワイルドカードに「」は記述不要です。
No. 文字 定義 設定例
1 「/」(スラッシュ) 増分を指定する <分>フィールドの0/10は、10分ごとに実行が発生する。5/15は、5・20・35・50分などを意味する。
2 「*」(アスタリスク) すべての値を指定する <日>フィールドで使用した場合、その月のすべての日が設定される。
3 「-」(ハイフン) 範囲を指定する 8-10 は、8・9および10が設定される。
4 「,」(カンマ) 追加の値を指定する SUN・MON・TUEは、それぞれ日曜日・月曜日・火曜日が設定される。

1-4. 設定例

crontab
# 毎日午前8時(UTC)に'backup.py'を実行する
 0 8 * * * source ~/venv_<プロジェクト名>/bin/activate; cd ~/venv_<プロジェクト名>/<プロジェクト名>; python manage.py backup > ~/cron.log 2>&1

# 毎日午後11時45分(UTC)にNginxをリロードする
 45 23 * * * sudo systemctl reload nginx.service

# 毎月1日の17時30分(UTC)にLet's EncryptのSSL証明書を更新する
 30 17 1 * * /home/<スーパーユーザー>/certbot/certbot-auto renew -q --renew-hook "/usr/bin/sysytemctl reload nginx.service"
# または
 30 17 1 * * /home/<スーパーユーザー>/certbot/certbot-auto renew -q --renew-hook "/usr/bin/sysytemctl reload nginx.service"

# 月曜~金曜(UTC)は5分ごとに固定IPへのpingを実行する
 0/5 * * MON-FRI * ping <Elastic IP>
# または
 0/5 * * 2-6 * ping <Elastic IP>

2. AWS Lambda における設定方法・設定例

2-1. 形式

cron <分> <時> <日> <月> <曜日> <年>

2-2. パラメータ

  • すべてのパラメータが必須です。
  • タイムゾーンはUTC(協定世界時)のみで変更不可。JST(日本標準時)として指定するには、UTCに対して「-9時間」とする(9時間を差し引く)必要があります。
  • 分未満(秒単位)の指定はサポートされていません。
  • 実際に指定する際に、ワイルドカードに「」は記述不要です。
No. フィールド ワイルドカード
1 0~59 「/」(スラッシュ)、「*」(アスタリスク)、「-」(ハイフン)、「,」(カンマ)
2 0~23 「W」、「L」、「/」(スラッシュ)、「?」(クエスチョンマーク)、「*」(アスタリスク)、「-(ハイフン)、「,」(カンマ)
3 1~31 「/」(スラッシュ)、「*」(アスタリスク)、「-」(ハイフン)、「,」(カンマ)
4 1~12 または JAN~DEC 「/」(スラッシュ)、「*」(アスタリスク)、「-」(ハイフン)、「,」(カンマ)
5 曜日 1~7 または SUN~SAT 「#」(シャープ)、「L」、「/」(スラッシュ)、「?」(クエスチョンマーク)、「*」(アスタリスク)、「-」(ハイフン)、「,」(カンマ)
6 1970~2199 「/」(スラッシュ)、「*」(アスタリスク)、「-」(ハイフン)、「,」(カンマ)

2-3. ワイルドカード

  • 分未満(秒単位)の指定はサポートされていません。
  • 実際に指定する際に、ワイルドカードに「」は記述不要です。
  • 日または週のどちらかの値は、「?」(クエスチョンマーク)である必要があります。
No. 文字 定義 設定例
1 「/」(スラッシュ) 増分を指定する <分>フィールドの0/10は、10分ごとに実行が発生する。5/15は、5・20・35・50分などを意味する。
2 「L」 『最後』を指定する ①<日>フィールドに指定された場合は、その月の末日が設定される。②<週>フィールドに指定された場合は、その週の最後の曜日(=土曜日)が設定される。
3 「W」 平日を指定する 日付とともに指定した場合(例:3/Wなど)、その月の3日に最も近い平日が設定される。3日が土曜日の場合は、その前日の金曜日に実行される。3日が日曜日の場合は、その翌日の月曜日に実行される。
4 「#」(シャープ) その月のn番目の日を指定する 4#3と指定した場合は、その月の第3水曜日が設定される。(※水曜日=週7日のうち4番目の曜日)
5 「*」(アスタリスク) すべての値を指定する <日>フィールドで使用した場合、その月のすべての日が設定される。
6 「?」(クエスチョンマーク) 値を指定しない 指定した別の値とともに設定される。例として、ある特定の日付を指定したが、その日が何曜日であっても実行する場合。
7 「-」(ハイフン) 範囲を指定する 8-10 は、8・9および10が設定される。
8 「,」(カンマ) 追加の値を指定する SUN・MON・TUEは、それぞれ日曜日・月曜日・火曜日が設定される。

2-4. 設定例

# 毎日午前8時(UTC)に実行する
cron(0 8 * * ? *)

# 毎日午後12時45分(UTC)に実行する
cron(45 12 * * ? *)

# 月曜~金曜の午後5時30分(UTC)に実行する
cron(30 17 ? * MON-FRI *)
# または
cron(30 17 ? * 2-6 *)

# 月曜~金曜(UTC)は5分ごとに実行する
cron(0/5 * ? * MON-FRI *)
# または
cron(0/5 * ? * 2-6 *)

(参考)

AWS公式サイト(Lambda):
Rate または Cron を使用したスケジュール式
ルールのスケジュール式 (英語)


(編集後記)

ついつい、JSTとUTCとの時差(▲9時間)を忘れがちです。
月末の夜間に動かしたいにも関わらず、月初の昼間に動いてしまってアラートが挙がる!といったことの無いよう、設定する際には必ずこのマニュアルを見ることにしました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

パケットフィルタリングについて纏めておく

iptables

コマンド

コマンド 説明
-A 指定したチェインの最後にルールを追加
-S 指定したチェインから削除
-P 指定したチェインのポリシーを変更
-L[チェイン] リスト表示
-N チェイン ユーザー定義チェインを作成
-X チェイン ユーザー定義チェインを削除
-l ルール番号を指定してルールを挿入
-F チェイン 指定したチェイン内のルールを全て削除

チェイン

チェイン 説明
INPUT 入ってくるパケット
OUTPUT 生成されたパケット
FORWARD 経由するパケット
PREROUTING 入ってきたパケットを変換
POSTROUTING 出て行くパケットを変換

ターゲット

ターゲット 説明
ACCEPT 許可
DROP 破棄
REJECT 拒否(送信元に通知)
MASQUERADE 送信元IPアドレスとポート番号の変換
SNAT 送信元IPアドレスの変換
DNAT 送信先IPアドレスの変換
LOG ログに出力

ルール

ルール 説明
-s 送信元IP
-d 送信先IP
--sport 送信元ポート
--dport 送信先ポート
--to 宛先を指定
-j 適用されるターゲット
-p プロトコル
-i 入力インタフェース
-o 出力インタフェース

オプション

オプション 説明
-v 詳細表示
-n 数値で表示
--line-numbers ルール番号表示

FORWARDチェインポリシーをDROPに変更。

# iptables -P FORWARD DROP

192.168.0.0/24から送られきたICMPパケットを拒否。

# iptables -A INPUT -p icmp -s 192.168.0.0/24 -j REJECT

ログを記録する場合は、LOGターゲットを使います。

# iptables -A INPUT -p tcp -dport 80 -j LOG --log-prefix "HTTP access..."

saveとrestore

# service iptables save

もしくは

# iptables-save > /etc/sysconfig/iptables
# iptables-restore > /etc/sysconfig/iptables

ポート転送

eth1に届いた8080番ポートを、192.168.1.2:80に届くようにする。

# iptables -t nat -A PREROUTING -p tcp --dport 8080 -i eth1 -j DNAT --to 192.168.1.2:80

iptables6

使い方は、iptablesと同じです。

ルーターとしての利用

パケット転送

Linuxをルーターとして利用する場合は、異なるネットワーク間でのパケット転送を許可する必要があります。

そのためには、次の値が 1 である必要があります。

#echo 1 > /proc/sys/net/ipv4/ip_forward
#echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

恒久的に設定するには、/etc/sysctl.conf に適切なエントリを記述したり、
/etc/sysconfig/network に次の通り記述します。

FORWARD_IPv4=yes
IPV6FORWARDING=yes

napt

192.168.0.0/24 からeth0 へ出ていくパケットは、MASQUERADE を利用する。

# iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE

snat

192.168.0.1 から ens33 へでていくパケットは SNAT される。

# iptables -t nat -A POSTROUTING -o ens33 -j SNAT --to-source 192.168.0.1

dnat

ens38 から入ってくるパケットは 192.168.0.2 へ変換される。

# iptables -t nat -A PREROUTING  -i ens34 -j DNAT --to-destination 192.168.0.2

firewall

とりあえず、CENTOS7 からは、firewall に変わっているので、ここを主に抑えておく。

ゾーン

ゾーン 説明
public インターネット上の公開サーバー用(デフォルト)
dmz DMZ
work 社内LANにあるクライアントPC用
home 家庭内LANにあるクライアントPC用
internal
external 外部ネットワークのインターフェース設定用
block 受信パケットを全て拒否
drop 受信パケットを全て破棄
trusted 通信を許可

firewall-cmdのオプション

オプション 説明
--state 状態表示
--reload 再読み込みして反映
--permanent 永続設定する
--get-zones 定義されているゾーンを一覧表示
--get-services 定義されているサービスを一覧表示
--list-all 指定したゾーンで有効な項目を全て表示
--list-services 指定したゾーンで有効なサービスを全て表示
--add-services=サービス名 指定したサービスを有効にする(許可する)
--add-port=ポート番号/tcp・udp 指定したポート番号を許可する
--remove-service=サービス名 指定したサービスを無効にする(拒否する)
--remove-portポート番号/tcp・udp 指定したポート番号を拒否する。
--zone=ゾーン ゾーンを指定する(デフォルトはPublic)

ufw

Ubuntu では、より簡単にファイヤウォールの設定ができる、ufwを使うのが一般的です。

  • ファイヤウォールのルールは番号が若い順から評価される。
  • 評価したルールは、/etc/ufw/user.rules(IPv4)、/etc/ufw/user6.rules(IPv6)に保存される。

ufwのオプション

サブコマンド 説明
enable 有効
disable 無効
status 状態表示
status numberef 状態をルール番号とともに表示
status verbose 状態を詳細に表示
allow 許可
delete 削除
insert ルール番号を指定して追加
default デフォルトのポリシーを設定

リンク

ハマる前に理解する「Firewalld」の設定方法、「iptables」との違い

iptables -t nat -A POSTROUTING -s 192.168.1.32 -j SNAT --to-source 192.168.1.254
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Linux】NFSを利用してファイアウォール越しのNASをマウントする話

Linuxで勉強になったので残しておきます。
「これやっといてや。来週作業なんでよろしく」の一言から始まった作業です...
FW越しにあるNASをマウントしたいという要望に応えるために、業務で久しぶりにLinuxを触りました。

環境

OS:Ubuntu 18.04
NFS v4
FWにはNFSでマウントするためにTCP 2049の穴を開けておく
NASはNFSに対応しているか確認しておく

作業

最初にNFSクライアントをインストールする

Ubuntu18.04
$ sudo apt upgrade \\\パッケージの更新
$ sudo apt install nfs-common \\\NFSクライアントのインストール
$ rpcinfo -p \\\versの欄に4があれば問題ない

マウントの設定

Ubuntu18.04
$ mkdir /mnt/nfs/test \\\マウントポイントの作成
$ vi /etc/fstab \\\マウント設定ファイルを編集するためにviコマンドで開く

viコマンドで開いたら以下の行を追加してください
NASのIPアドレス:/NASの共有ディレクトリ/ /mnt/nfs/test nfs rw,user,auto 0 0

NASのIPアドレス:/NASの共有ディレクトリ/ /mnt/nfs/test nfs rw,user,auto 0 0
この行はマウントオプションやファイルシステムを指定しています。
nfs:ファイルシステムの指定
rw:読み書き可能
user:一般ユーザでマウント可能
auto:mount -aでマウントできるようにする
0 0:ファイルシステムをバックアップせず、fsckコマンドでファイルシステムをチェックしない

ここまで実行出来たらマウントを行っていく

Ubuntu18.04
$ sudo mount -a \\\マウントコマンドの実行
$ mount \\\オプションをつけないで実行すると現在マウントされているものが出力される
/etc/fstabに記載した行が出力されていれば成功している

実際にマウントポイント配下に空のファイルを作成してみる

Ubuntu18.04
$ touch test \\\空のテキストファイルを作成している

ここまで実行したらNASの共有ディレクトリを確認して、testファイルが作成されていれば成功

感想

LPIC level 1を取得してからLinuxは触る機会がなかったので良い刺激になった。
資格取得によってそこそこ知識を活かす事が出来た気がする。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linux版のOpenSiv3Dをfind_packageでちょっと楽にアプリを作る

OpenSiv3DのLinux版が、クローンしてきたファイルのOpenSiv3D/Linux/Appでしかビルドできないのが面倒くさいので、make installに対応させる。
以下のパッチをdiff.patchとして保存し、

diff.patch
diff --git a/Linux/CMakeLists.txt b/Linux/CMakeLists.txt
index f59da581..fe1e7c97 100644
--- a/Linux/CMakeLists.txt
+++ b/Linux/CMakeLists.txt
@@ -2,7 +2,7 @@ cmake_minimum_required (VERSION 3.0)

 find_package(PkgConfig)

-project(OpenSiv3D_Linux CXX)
+project(Siv3D VERSION 0.4.3 LANGUAGES CXX)
 enable_language(C)

 set(CMAKE_CXX_FLAGS "-std=c++17 -Wall -Wextra -Wno-unknown-pragmas -fPIC -msse4.1 -D_GLFW_X11")
@@ -26,10 +26,8 @@ endif()
 #set(CMAKE_BUILD_TYPE Release)

 pkg_check_modules(LIBSIV3D REQUIRED glib-2.0 gobject-2.0 gio-2.0 gl libpng libturbojpeg x11 xi xinerama xcursor xrandr gl glu freetype2 openal opencv4 ogg vorbis zlib)
-include_directories(
-   "/usr/include"

-   "."
+set(INCLUDE_DIRS
    "../Siv3D/include"
    "../Siv3D/src/Siv3D"
    "../Siv3D/src/Siv3D-Platform/Linux"
@@ -725,6 +723,22 @@ set(SOURCE_FILES

 add_library(Siv3D STATIC ${SOURCE_FILES})

-target_link_libraries(Siv3D
-)
-
+install(DIRECTORY ../Siv3D/include/ DESTINATION include/Siv3D)
+find_package(Boost REQUIRED COMPONENTS filesystem)
+target_link_libraries(Siv3D GLEW pthread dl udev freetype harfbuzz glib-2.0 gobject-2.0 gio-2.0 png turbojpeg gif webp openal ogg vorbis vorbisenc vorbisfile /usr/local/lib/libboost_filesystem.a avformat avcodec avutil swresample ${LIBSIV3D_LIBRARIES})
+target_include_directories(Siv3D PUBLIC
+   $<BUILD_INTERFACE:${INCLUDE_DIRS}>
+   $<INSTALL_INTERFACE:include/Siv3D>
+   $<INSTALL_INTERFACE:include/Siv3D/ThirdParty>)
+install(TARGETS Siv3D
+   EXPORT Siv3DConfig
+   LIBRARY DESTINATION lib
+   ARCHIVE DESTINATION lib
+   INCLUDES DESTINATION include/Siv3D include/Siv3D/ThirdParty)
+install(EXPORT Siv3DConfig
+   DESTINATION lib/cmake/siv3d
+   EXPORT_LINK_INTERFACE_LIBRARIES)
+include(CMakePackageConfigHelpers)
+set(VERSION_CONFIG ${CMAKE_CURRENT_BINARY_DIR}/Siv3DConfigVersion.cmake)
+write_basic_package_version_file(${VERSION_CONFIG} COMPATIBILITY ExactVersion)
+install(FILES ${VERSION_CONFIG} DESTINATION lib/cmake/siv3d)
$ git apply diff.patch

で適用する。あとはいつもどおり必要なライブラリを入れ、cmakeしたあとに

make install

することにより、デフォルトのパスだと/usr/local/に必要なファイルがインストールされる。インストールが終わったら、クローンしてきたファイルは要らないので消す。

アプリを作成する際には、以下のCMakeファイルとSiv3Dのソースファイルを同じディレクトリに作成し

CMakeLists.txt
cmake_minimum_required (VERSION 3.0)
project(アプリ名 CXX)

find_package(Siv3D 0.4.3 REQUIRED)

add_executable(アプリ名 Main.cpp)
set_target_properties(アプリ名 PROPERTIES CXX_STANDARD 17)

target_link_libraries(アプリ名 Siv3D)
$ mkdir build && cd build
$ cmake ..
$ make

と唱えるだけで、こんな感じのファイル構成で

CMakeLists.txt
Main.cpp
build/
├──アプリの実行ファイル
└──ビルドのログ等

Siv3Dのインストール先を気にせずにビルドできます。

更に、これができるとfind_packageの第2引数だけで、バージョンを変えられるので、管理がしやすくなります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

行番号を付加する空行の単位を変更するnlコマンドのlオプション

nlコマンドはlオプションを指定することで、行番号を付加する空行の単位を変更することができます。

lオプションの使い方

-lのあとに数値を指定します。デフォルトは1です。-b -h -f オプションの付番方式にa(すべての行に番号を振る)を使う必要があり、これも同時に指定します。

info nl (GNU coreutils)

‘-l NUMBER’
‘--join-blank-lines=NUMBER’
     Consider NUMBER (default 1) consecutive empty lines to be one
     logical line for numbering, and only number the last one.  Where
     fewer than NUMBER consecutive empty lines occur, do not number
     them.  An empty line is one that contains no characters, not even
     spaces or tabs.

ここにきて「空行とは何か」の説明がありますね。タブもスペースも含まない行が空行です。

man nl (BSD)

     -l num       If numbering of all lines is specified for the current logical
                  section using the corresponding -b a, -f a or -h a option, spec-
                  ify the number of adjacent blank lines to be considered as one.
                  For example, -l 2 results in only the second adjacent blank line
                  being numbered.  The default num value is 1.

POSIX

-l num
Specify the number of blank lines to be considered as one. For example, -l 2 results in only the second adjacent blank line being numbered (if the appropriate -h a, -b a, or -f a option is set). The default shall be 1.

lオプションを試す

単純なデータで試してみましょう。

$ echo -e 'a\n\n\n\n\nb\n\n\nc\n' 
a




b


c

$ echo -e 'a\n\n\n\n\nb\n\n\nc\n' | nl 
     1  a




     2  b


     3  c

$ echo -e 'a\n\n\n\n\nb\n\n\nc\n' | nl -b a
     1  a
     2  
     3  
     4  
     5  
     6  b
     7  
     8  
     9  c
    10  
$ echo -e 'a\n\n\n\n\nb\n\n\nc\n' | nl -b a -l 2
     1  a

     2  

     3  
     4  b

     5  
     6  c

正直なところ何に使うオプションなのか検討つきません。私は-lを今まで使ったことがありません。


ToDo

なんとかユースケースを考えたいのですが思いつきませんでした。何か思いついたら追記します。
連続したn個の空行で1つの空行としてみなすマークアップ言語などがあるのかもしれませんね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【ssh接続】ubuntu sshサーバー構築からssh接続まで

はじめに

自宅に自作PCのubuntu環境を用意したため、ssh接続を試みた。
ホスト環境へのsshサーバーの準備から、LAN内外からのアクセス方法までを学習したため、その内容を整理する。

流れ

  1. ホスト側(ubuntu)のsshサーバー導入
  2. クライアント側での鍵の生成
  3. ホスト側での公開鍵の設定
  4. LAN内からのssh接続
  5. LAN外からのssh接続

1. ホスト(ubuntu)のsshサーバー設定

ssh-serverの導入

sudo apt install openssh-server

sshd_configファイルで設定の変更

sudo vim /etc/ssh/sshd_config

sshd_config = sshデーモンの設定ファイル(外部からssh接続されたときの設定)
ssh_config = ssh接続の設定ファイル(外部へssh接続するときの設定)

sshd_configファイルに以下内容を追加

#パスワードによる認証を許可
PasswordAuthentication yes
#後続プロセスのため一時的に許可を与える

設定を反映させるためにサーバを再起動

service sshd restart

2. クライアント側での鍵の生成

公開鍵と秘密鍵を生成
(わかりやすいように鍵の名前をubuntu_homeに変更)

ssh-keygen -t rsa
#Enter file in which to save the key (/Users/xxxx/.ssh/id_rsa):/Users/xxxx/.ssh/ubuntu_home
#以降の問いはEnterでOK

公開鍵をホスト側へコピー(以下コマンドにより、公開鍵がホストの「~/.ssh」ディレクトリに格納される)

scp ~/.ssh/ubuntu.pub  <ユーザー>@<ホストIPアドレス>:~/.ssh

※1 ホスト側のIPアドレスは「hostname -I」のbashコマンドで確認できる
※2 scp = Secure Copy

3. ホスト側での公開鍵の設定

#authorized_keysへの公開鍵の書き込み
cd ~/.ssh
cat ubuntu.pub >> authorized_keys
rm ubuntu.pub

#権限の変更
cd ~
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

セキュリティー強化のため、秘密鍵でのアクセスに限定

#sshデーモンの設定変更
sudo vim /etc/ssh/sshd_config
#パスワードによるアクセスを禁止
PasswordAuthentication no
#設定を反映させるためにサーバを再起動
service sshd restart

4. LAN内からのssh接続

ローカルIPの固定
wifi設定の歯車マークでIPアドレスを手動で設定する
Screenshot from 2020-12-16 02-43-42.png

ゲートウエイはルータのIPアドレスであり、PCのlocalIPアドレスの最後の数字を1に置き換えることで設定できる

以下コマンドでssh接続完了!

ssh -i ~/.ssh/home_ubuntu -l <ユーザー名> <ローカルIPアドレス>

5. LAN外からのssh接続

① port開放

ルーターの設定サイトにログイン

local IPアドレスの最後の数字を1に置き換えることでルータにアクセスできる(以下例)
PCのIPアドレス = http://192.168.10.114
ルータのIPアドレス = http://192.168.10.1

私のルータの場合以下のような設定画面が表示されます。
Screenshot from 2020-12-16 02-19-20.png

ポートマッピング設定をクリック
Screenshot from 2020-12-16 02-36-16.png

NATをエントリする
Screenshot from 2020-12-16 02-56-19.png
※あくまでも私のルータの例であり、細かい内容はルータごとに異なる

② ドメインの取得

MyDNSというサイトでドメインを取得します.右上のjoin usから登録しログイン
https://www.mydns.jp/

DOMAIN INFOからドメインを取得
image.png

取得したドメインに対し,IP ADDR DIRECTから先程調べたグローバルIPアドレスをIPv4のところに入力し、ドメインとグローバルIPを紐づける
Screenshot from 2020-12-16 04-03-23.png

グローバルIPアドレスの確認方法

curl inet-ip.info

③ グローバルIPの自動更新

グローバルIPは固定IPでないと自動更新されてしまうのでDDNSで取得したドメインとの紐付けを再度行う必要がある

それを今回はcronで自動的に実行する

crontab -e
#以下の1行を追加して保存
#これで10分おきにMyDNSに対してHTTPリクエストを発行する
*/10 * * * * wget -q -O /dev/null http://(mydns.jp のマスターID):(mydns.jp のパスワード)@www.mydns.jp/login.html

④ ヘアピンNAT回避

同一のネットワーク内からグローバルIPにアクセスしようとするとルータが対応していないと拒否される
以下で設定しておけば,拒否されなくなるので登録する

sudo vim /etc/hosts
/etc/hosts
#以下の1行を追加して保存
<固定したサーバのローカルIP> <MyDNSで取得したドメイン名>

⑤ 自宅サーバへのSSH

以下で自宅サーバへつながれば完了

ssh -p 5504 -i ~/.ssh/home_ubuntu ドメイン名

また、.ssh/configファイルにssh接続の条件を記載しておけば、簡単にssh接続できる

~/.ssh/config
Host home-ubuntu
  HostName home-ubuntu.mydns.jp
  IdentityFile ~/.ssh/home_ubuntu
  User shota
  Port 5504
  TCPKeepAlive yes
  IdentitiesOnly yes

以下コマンドだけで接続可能!

ssh home-ubuntu

参考

・ubuntu自宅サーバにsshで外部からアクセス
http://frute.hatenablog.com/entry/2018/11/19/003056
・Ubuntu 18.04 LTSで固定IPアドレスを設定する方法【デスクトップ編】
https://linuxfan.info/ubuntu-1804-desktop-static-ip-address
・SSH Tips
https://qiita.com/syui/items/cb2bf66ceb94e92058ff

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【sshサーバー】ubuntu sshサーバー構築〜LAN内外からのssh接続まで

はじめに

自宅に自作PCのubuntu環境を用意したため、ssh接続を試みた。
ホスト環境へのsshサーバーの準備から、LAN内外からのアクセス方法までを学習したため、その内容を整理する。
参考になったと思った方は、LGTMクリックいただけると幸いですm(__)m

流れ

  1. ホスト側(ubuntu)のsshサーバー導入
  2. クライアント側での鍵の生成
  3. ホスト側での公開鍵の設定
  4. LAN内からのssh接続
  5. LAN外からのssh接続

1. ホスト(ubuntu)のsshサーバー設定

ssh-serverの導入

sudo apt install openssh-server

sshd_configファイルで設定の変更

sudo vim /etc/ssh/sshd_config

sshd_config = sshデーモンの設定ファイル(外部からssh接続されたときの設定)
ssh_config = ssh接続の設定ファイル(外部へssh接続するときの設定)

sshd_configファイルに以下内容を追加

#パスワードによる認証を許可
PasswordAuthentication yes
#後続プロセスのため一時的に許可を与える

設定を反映させるためにサーバを再起動

service sshd restart

2. クライアント側での鍵の生成

公開鍵と秘密鍵を生成
(わかりやすいように鍵の名前をubuntu_homeに変更)

ssh-keygen -t rsa
#Enter file in which to save the key (/Users/xxxx/.ssh/id_rsa):/Users/xxxx/.ssh/ubuntu_home
#以降の問いはEnterでOK

公開鍵をホスト側へコピー(以下コマンドにより、公開鍵がホストの「~/.ssh」ディレクトリに格納される)

scp ~/.ssh/ubuntu.pub  <ユーザー>@<ホストIPアドレス>:~/.ssh

※1 ホスト側のIPアドレスは「hostname -I」のbashコマンドで確認できる
※2 scp = Secure Copy

3. ホスト側での公開鍵の設定

#authorized_keysへの公開鍵の書き込み
cd ~/.ssh
cat ubuntu.pub >> authorized_keys
rm ubuntu.pub

#権限の変更
cd ~
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

セキュリティー強化のため、秘密鍵でのアクセスに限定

#sshデーモンの設定変更
sudo vim /etc/ssh/sshd_config
#パスワードによるアクセスを禁止
PasswordAuthentication no
#設定を反映させるためにサーバを再起動
service sshd restart

4. LAN内からのssh接続

ローカルIPの固定
wifi設定の歯車マークでIPアドレスを手動で設定する
Screenshot from 2020-12-16 02-43-42.png

ゲートウエイはルータのIPアドレスであり、PCのlocalIPアドレスの最後の数字を1に置き換えることで設定できる

以下コマンドでssh接続完了!

ssh -i ~/.ssh/home_ubuntu -l <ユーザー名> <ローカルIPアドレス>

5. LAN外からのssh接続

① port開放

ルーターの設定サイトにログイン

local IPアドレスの最後の数字を1に置き換えることでルータにアクセスできる(以下例)
PCのIPアドレス = http://192.168.10.114
ルータのIPアドレス = http://192.168.10.1

私のルータの場合以下のような設定画面が表示されます。
Screenshot from 2020-12-16 02-19-20.png

ポートマッピング設定をクリック
Screenshot from 2020-12-16 02-36-16.png

NATをエントリする
Screenshot from 2020-12-16 02-56-19.png
※あくまでも私のルータの例であり、細かい内容はルータごとに異なる

② ドメインの取得

MyDNSというサイトでドメインを取得します.右上のjoin usから登録しログイン
https://www.mydns.jp/

DOMAIN INFOからドメインを取得
image.png

取得したドメインに対し,IP ADDR DIRECTから先程調べたグローバルIPアドレスをIPv4のところに入力し、ドメインとグローバルIPを紐づける
Screenshot from 2020-12-16 04-03-23.png

グローバルIPアドレスの確認方法

curl inet-ip.info

③ グローバルIPの自動更新

グローバルIPは固定IPでないと自動更新されてしまうのでDDNSで取得したドメインとの紐付けを再度行う必要がある

それを今回はcronで自動的に実行する

crontab -e
#以下の1行を追加して保存
#これで10分おきにMyDNSに対してHTTPリクエストを発行する
*/10 * * * * wget -q -O /dev/null http://(mydns.jp のマスターID):(mydns.jp のパスワード)@www.mydns.jp/login.html

④ ヘアピンNAT回避

同一のネットワーク内からグローバルIPにアクセスしようとするとルータが対応していないと拒否される
以下で設定しておけば,拒否されなくなるので登録する

sudo vim /etc/hosts
/etc/hosts
#以下の1行を追加して保存
<固定したサーバのローカルIP> <MyDNSで取得したドメイン名>

⑤ 自宅サーバへのSSH

以下で自宅サーバへつながれば完了

ssh -p 5504 -i ~/.ssh/home_ubuntu ドメイン名

また、.ssh/configファイルにssh接続の条件を記載しておけば、簡単にssh接続できる

~/.ssh/config
Host home-ubuntu
  HostName home-ubuntu.mydns.jp
  IdentityFile ~/.ssh/home_ubuntu
  User shota
  Port 5504
  TCPKeepAlive yes
  IdentitiesOnly yes

以下コマンドだけで接続可能!

ssh home-ubuntu

参考になったと思った方は、LGTMクリックいただけると幸いですm(__)m

参考

・ubuntu自宅サーバにsshで外部からアクセス
http://frute.hatenablog.com/entry/2018/11/19/003056
・Ubuntu 18.04 LTSで固定IPアドレスを設定する方法【デスクトップ編】
https://linuxfan.info/ubuntu-1804-desktop-static-ip-address
・SSH Tips
https://qiita.com/syui/items/cb2bf66ceb94e92058ff

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

strcpyもstrncpyも危険

C言語の文字列は厄介

文字列は文字の配列で、Null終端で最後という仕様なので、
どうやっても番兵スタイルになる。
番兵とはNullのことで、処理の進め方として、Nullになるまで処理するというスタイルのこと。
単方向リストなどで使う。
Nullがないと処理がリークするので、Null保証する仕組みを作ったりする。

strcpy関数は危険

strcpy関数は引数が2個のみでサイズを指定できないため、
Null終端があったとしても危険

#define SRC_LENGTH 10
#define DEST_LENGTH 3

char src[SRC_LENGTH];
char dest[DEST_LENGTH];

strcpy(dest,src);

strncpy関数も危険

strcpy関数は危険なので、strncpy関数を使うとサイズ指定ができるが、これも危険である。
以下のコードは危険コード。

#define SRC_LENGTH 10
#define DEST_LENGTH 3

char src[SRC_LENGTH];
char dest[DEST_LENGTH];

memset(src, "aiueoaiue", SRC_LENGTH);
strncpy(dest,src, DEST_LENGTH);

このコードのstrncpy関数呼び出し後のdest変数の中身は

dest[0] = 'a';
dest[1] = 'i';
dest[2] = 'u';

となるので、Null終端がない。

解決策はあるのか?

本質的には無理だと思う。C言語の特性なので、頑張る。

strncpy(dest,src, DEST_LENGTH);
dest[DEST_LRNGTH-1] = '\0';

でとりあえずリークはしない。リークの是正目的だけは満たせる。

Linuxカーネルに

strscpy関数なるものがある。

ssize_t strscpy(char *dest, const char *src, size_t count)
{
    const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS;
    size_t max = count;
    long res = 0;

    if (count == 0)
        return -E2BIG;

#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
    /*
     * If src is unaligned, don't cross a page boundary,
     * since we don't know if the next page is mapped.
     */
    if ((long)src & (sizeof(long) - 1)) {
        size_t limit = PAGE_SIZE - ((long)src & (PAGE_SIZE - 1));
        if (limit < max)
            max = limit;
    }
#else
    /* If src or dest is unaligned, don't do word-at-a-time. */
    if (((long) dest | (long) src) & (sizeof(long) - 1))
        max = 0;
#endif

    while (max >= sizeof(unsigned long)) {
        unsigned long c, data;

        c = read_word_at_a_time(src+res);
        if (has_zero(c, &data, &constants)) {
            data = prep_zero_mask(c, data, &constants);
            data = create_zero_mask(data);
            *(unsigned long *)(dest+res) = c & zero_bytemask(data);
            return res + find_zero(data);
        }
        *(unsigned long *)(dest+res) = c;
        res += sizeof(unsigned long);
        count -= sizeof(unsigned long);
        max -= sizeof(unsigned long);
    }

    while (count) {
        char c;

        c = src[res];
        dest[res] = c;
        if (!c)
            return res;
        res++;
        count--;
    }

    /* Hit buffer length without finding a NUL; force NUL-termination. */
    if (res)
        dest[res-1] = '\0';

    return -E2BIG;
}

コピーするだけでこのボリューム。さすがC言語。さすがLinuxカーネル。
これの解説はあとで。

使う側の利点としては
strscpy関数は

  • コピー元がNull終端でなくてよい
  • コピー先は必ずNull終端
  • コピー先のサイズが足りない場合はエラーを返す

なので、うまくこれを使っていきたい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む