- 投稿日:2020-12-16T23:34:31+09:00
オープンソース標準が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:2020ISO/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でプロジェクトメンバーが解説していますのでご覧ください!
- 投稿日:2020-12-16T23:24:23+09:00
[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は起動したのですが、きちんと(?)インストールできたのか自分でも良くわからない状態です。
何の役にも立たない記事ですね。明日、もう一度やり直してみようと思います。
- 投稿日:2020-12-16T22:32:52+09:00
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と日付がセットで出てくるとは限りません。
- 投稿日:2020-12-16T21:02:54+09:00
CentOSからOracle Linuxへ移行する方法
1. どこに移行すべきか
各所で話題になっているように、CentOS 8からCentOS 8 Streamへの変更は大きな驚きや落胆をもって迎えられている。筆者自身も驚き、すぐに以下の記事を書いたところだ。
CentOS 7は2024年6月まで猶予はあるが、CentOS 8は2021年12月31日までだ。あと1年しか猶予がない。そこで考えられるのが以下の選択肢だ。
- CentOS Streamに移行する
- RHELに移行する
- Oracle Linuxに移行する
- Ubuntuに移行する
- 上記以外の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を使用する。
- Need a stable, RHEL-compatible alternative to CentOS? Three reasons to consider Oracle Linux →この記事は今回の発表に触発された公式ブログ。2020/12/12にポスト。
実際に手を動かす前に「Oracle Linux: A better alternative to CentOS」をサクッと眺めてほしい。また、実際の移行方法はGithubのoracle/centos2olに書かれている。
https://github.com/oracle/centos2ol
なお、このスクリプトは急に注目されているので、新しいIssues/Pull requestsが上がっている。そのため今後は、本記事の内容と違いが発生するかもしれない。
移行手順
移行の実行手順は以下のとおり。事前確認には複数のコマンドを実行する必要があるが、移行時代は最小限のコマンドで実行できる。
- 制限事項の確認
- システムバックアップ(本文では省略)
- 移行元CentOSの事前準備
- 移行スクリプト実行
- 手動で実施する移行作業
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に着目する
- インストール元リポジトリ名に着目する
- 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の方法を信頼してほしい。CentOS7yum list installed | grep -v @anaconda | grep -v @base | grep -v @updates | grep -v @extras
CentOS8dnf 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 @anaconda3-2. ベースリポジトリが有効になっていることを確認する
- リポジトリが有効になっていることを確認する。次のようにリポジトリが表示されれば有効になっている。あとで使うので、有効になっているリポジトリをメモしておくこと。
# yum repolistCentOS7の場合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 extras8用# dnf config-manager --enable BaseOS AppStream extras4.CentOS以外のリポジトリが有効になっているときは無効にする。無効にしたリポジトリは移行後に有効にする。次の例ではEPELリポジトリを無効にしている。
7,8共通# yum-config-manager --disable epel8専用# dnf config-manager --disable epel3-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のみ)
- 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 --now3-3-2. dnf-automaticを無効にする(CentOS 8のみ)
- 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 disabled3.enableになっているタイマーをすべて無効にする。
# systemctl disable dnf-automatic-download.timer --now3-3-3. Packagekitを無効にする(CentOS 7/8共通)
GUIデスクトップ環境をインストールしているときは、Packagekitによるアップデートを無効化する。yum-cronやdnf-automaticは自動インストールされないが、デスクトップ環境がインストールされているときはPackagekitはデフォルトで有効化されているので注意が必要だ。
- 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 --now3-3-4.スクリプトをダウンロードする
移行スクリプトは、ブラウザからダウンロードする方法と、
git clone
で直接ダウンロードする方法がある。
sudo
が可能な一般ユーザーでダウンロードする。gitがインストールされていないときはyum install git
でインストールすること。$ git clone https://github.com/oracle/centos2ol.git2.ブラウザからダウンロードするときは以下のページからダウンロードする。
3-3-5. 残りの準備作業
- Yumのキャッシュをクリアする。
# yum clean all2.
/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への移行を実施する。
- 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. 移行後の構成を確認する
- /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 directory2.カーネルはOracle Linux専用のUEK(Unbreakable Enterprise Kernel)に変更されている。UEKとRHCK(Red Hat互換カーネル)は、ユーザー空間で動作する通常のアプリケーションは互換性がある。
$ uname -r 5.4.17-2036.101.2.el8uek.x86_63.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 CentOS4.カーネル関連パッケージとベンダを表示する。標準リポジトリのパッケージは最新化されるので、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★UEK5.有効になっているリポジトリを確認する。
# yum repolistCentOS7の場合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 リポジトリID8用# dnf config-manager --enable リポジトリID2.アップデート可能なパッケージがあるか確認する。あるときはアップデートを検討する。
# yum check-update3.デフォルトカーネルをRHCKに変更するときは、以下のエントリを参考にすること。
6. おわりに
当初の想定より大作になったが、スクリプトの前提条件を満たしたときの移行作業は簡単なことが分かっただろう。現時点では、スクリプトも十分読める範囲の長さだ。不具合があればGithubで報告してみてはどうだろう。
7. 参考資料
- 投稿日:2020-12-16T21:02:54+09:00
CentOSからOracle Linuxへスクリプトで簡単に移行する
1. どこに移行すべきか
各所で話題になっているように、CentOS 8からCentOS 8 Streamへの変更は大きな驚きや落胆をもって迎えられている。筆者自身も驚き、すぐに以下の記事を書いたところだ。
CentOS 7は2024年6月まで猶予はあるが、CentOS 8は2021年12月31日までだ。あと1年しか猶予がない。そこで考えられるのが以下の選択肢だ。
- CentOS Streamに移行する
- RHELに移行する
- Oracle Linuxに移行する
- Ubuntuに移行する
- 上記以外の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を使用する。
- Need a stable, RHEL-compatible alternative to CentOS? Three reasons to consider Oracle Linux →今回の発表に触発され、2020/12/12にポストされた公式ブログ。
実際に手を動かす前に「Oracle Linux: A better alternative to CentOS」をサクッと眺めてほしい。また、実際の移行方法はGithubのoracle/centos2olに書かれている。
https://github.com/oracle/centos2ol
なお、このスクリプトは急に注目されているので、新しいIssues/Pull requestsが上がっている。そのため今後は、本記事の内容と違いが発生するかもしれない。
移行手順
移行の実行手順は以下のとおり。1から3の事前作業では複数のコマンドを実行する必要がある。しかし、4と5の移行作業は最小限のコマンドで実行できる。
- 制限事項の確認
- システムバックアップ(本文では省略)
- 移行元CentOSの事前準備
- 移行スクリプト実行
- 手動で実施する移行作業
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に着目する
- インストール元リポジトリ名に着目する
- 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の方法を信頼してほしい。CentOS7yum list installed | grep -v @anaconda | grep -v @base | grep -v @updates | grep -v @extras
CentOS8dnf 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 @anaconda3-2. ベースリポジトリが有効になっていることを確認する
- ベースリポジトリが有効になっていることを確認する。次のようにリポジトリが表示されれば有効になっている。あとで使うので、有効になっているリポジトリをメモしておくこと。
# yum repolistCentOS7の場合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 name3.リポジトリが表示されないときは、リポジトリが無効になっているか、プロキシ等の設定が不足している可能性がある。リポジトリを有効にする方法は次のとおり。プロキシの設定は
/etc/yum.conf
を確認してほしい。7用# yum-config-manager --enable base updates extras8用# dnf config-manager --enable BaseOS AppStream extras4.CentOS以外のリポジトリが有効になっているときは無効にする。無効にしたリポジトリは移行後に有効にする。次の例ではEPELリポジトリを無効にしている。
7,8共通# yum-config-manager --disable epel8用# 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のみ)
- 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 --now3-3-2. dnf-automaticを無効にする(CentOS 8のみ)
- 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 disabled3.enableになっているタイマーをすべて無効にする。
# systemctl disable dnf-automatic-download.timer --now3-3-3. Packagekitを無効にする(CentOS 7/8共通)
GUIデスクトップ環境をインストールしているときは、Packagekitによるアップデートを無効化する。yum-cronやdnf-automaticは自動インストールされないが、デスクトップ環境がインストールされているときはPackagekitはデフォルトで有効化されているので注意が必要だ。
- 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 --now3-3-4.スクリプトをダウンロードする
移行スクリプトをダウンロードする方法は複数ある。いずれの場合でも、スクリプトを実行する
sudo
が可能なユーザーを使用すること。A. curlを使う
プロキシ環境では--proxy
オプションやhttps_proxy
環境変数でプロキシサーバを指定すること。$ curl -O https://raw.githubusercontent.com/oracle/centos2ol/main/centos2ol.shB. gitを使う
gitがインストールされていないときは、事前にyum install git
でgitをインストールする。プロキシに関してはgitも同様。$ git clone https://github.com/oracle/centos2ol.gitC. ブラウザを使う
以下のページからダウンロードして、適正なフォルダに配置する。
3-3-5. 残りの準備作業
- Yumのキャッシュをクリアする。
# yum clean all2.
/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への移行を実施する。
- 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. 移行後の構成を確認する
- /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 directory2.現在のカーネルを確認すると、Oracle Linux専用のUEK(Unbreakable Enterprise Kernel)に変更されている。UEKとRed Hat互換カーネル(RHCK:Red Hat Compatible Kernel)は、ユーザー空間で動作する通常のアプリケーションは互換性がある。
$ uname -r 5.4.17-2036.101.2.el8uek.x86_63.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 CentOS4.カーネル関連パッケージとベンダを表示する。ベースリポジトリのパッケージは最新化されるので、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★UEK5.有効になっているリポジトリを確認する。Oracle Linuux用に置き換わっていることが分かる。
# yum repolistCentOS7の場合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.repo5-2. スクリプト対象外の残作業
最後に、スクリプトが実行しない残作業を実施する。
1.「3-2」のリポジトリの確認で、事前にリポジトリを無効にしたときは元に戻す。
7用# yum-config-manager --enable リポジトリID8用# dnf config-manager --enable リポジトリIDCentOSとOracle Linuxのリポジトリ比較表は以下のとおり。CentOSのextrasに相当するリポジトリは無い。
CentOS 7 Oracle Linux 7 base
updatesol7_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-rhoracle-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-update3.デフォルトカーネルをRHCKに変更するときは、以下のエントリを参考にすること。
6. おわりに
当初の想定より大作になったが、スクリプトの前提条件を満たしたときの移行作業は簡単なことが分かっただろう。現時点では、スクリプトも十分読める範囲の長さだ。不具合があればGithubで報告してみてはどうだろう。
まとめ
- 移行スクリプトcentos2ol.shを使うと、簡単にCentOSをOracle Linuxへ変更できる。
- 移行にかかる時間はサーバ1台当たり30分から90分程度。インストール済みパッケージ数やサーバー性能、回線速度に依存する。
- インターネットのリポジトリに接続可能なこと(プロキシ経由OK)など、スクリプトにはいくつかの制約条件がある。
- オンプレミスのベアメタルサーバーでデバイスドライバを追加している場合や、アンチウイルスソフトを導入しているときは、再起動に失敗する可能性があるので事前に調査する。
7. 参考資料
- 投稿日:2020-12-16T12:59:53+09:00
1−1.WEB系エンジニアになるためのインプット(準備)
はじめに
メーカ系SIer企業で働いているのですが、少し物足りなさを感じております。
そこで副業の一環として、まずはWEB系エンジニアを目指すために「web系エンジニアになろう」(著:勝又健太)を読了しました。
まずは基礎を固めるためにインプットを行うが、併せて内容をアウトプットするために本記事を作成していく。学習フロー
既にコンピュータサイエンスの基礎知識やクラウドサービスであるAWSの知見を有しているので、下記のように進める。
- Linux基礎
- JavaScript基礎
- RDBとSQL基礎
- GitとGitHub基礎
- Ruby基礎
- 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基礎のアウトプット記事を掲載する。
- 投稿日:2020-12-16T12:18:57+09:00
【Linux】備忘録
概要
- 備忘録
使用頻度高
init
名称 特徴 SysVinit ランレベルによってシステムの状態を管理 Upstart ランレベルによってシステムの状態を管理 systemd ターゲットによってシステムの状態を管理
- systemdサブコマンド集
- systemdのコマンドはsystemctl
起動関連のターゲットディレクトリ
- /etc/systemd/system/default.target
- 上記にはシンボリックリンクが設定されている
- リンクは上書きできないので、変更の際には事前削除が必要となる
- ln ファイル名 リンク名でハードリンクを作成
- ln -s ファイル名 リンク名でシンボリックリンクを作成
- ランレベルとターゲットの互換表
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)が選択される
プロセス監視
- ps [オプション]
- 「-」を付けないBSDオプションと、「-」で始まるUNIXオプションがある
Docker
主なコマンド
使用頻度低
仮想端末制御プログラム
多数の端末プログラムを使用するのではなく、仮想端末を制御するプログラムを動作させることで、一つの端末上で複数の端末を利用する手段
- screen
- tmuxVM
virsh
- libvirt(オープンソースの仮想化管理用のライブラリ)を操作するためのシェル
- 仮想マシンのリソース管理や仮想ネットワークの管理など、様々な操作が可能
- コマンド集
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 [検索起点ディレクトリ] [検索式] [アクション]
- 投稿日:2020-12-16T12:18:57+09:00
【Linux/LPIC】備忘録
概要
- 備忘録
使用頻度高
init
名称 特徴 SysVinit ランレベルによってシステムの状態を管理 Upstart ランレベルによってシステムの状態を管理 systemd ターゲットによってシステムの状態を管理
- systemdサブコマンド集
- systemdのコマンドはsystemctl
起動関連のターゲットディレクトリ
- /etc/systemd/system/default.target
- 上記にはシンボリックリンクが設定されている
- リンクは上書きできないので、変更の際には事前削除が必要となる
- ln ファイル名 リンク名でハードリンクを作成
- ln -s ファイル名 リンク名でシンボリックリンクを作成
- ランレベルとターゲットの互換表
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)が選択される
プロセス監視
- ps [オプション]
- 「-」を付けないBSDオプションと、「-」で始まるUNIXオプションがある
Docker
主なコマンド
使用頻度低
仮想端末制御プログラム
多数の端末プログラムを使用するのではなく、仮想端末を制御するプログラムを動作させることで、一つの端末上で複数の端末を利用する手段
- screen
- tmuxVM
virsh
- libvirt(オープンソースの仮想化管理用のライブラリ)を操作するためのシェル
- 仮想マシンのリソース管理や仮想ネットワークの管理など、様々な操作が可能
- コマンド集
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 [検索起点ディレクトリ] [検索式] [アクション]
スナップショットとバックアップの違い
特徴 違い スナップショット 更新されたデータ 更新されたデータのみ更新 バックアップ ストレージ内容すべて 記憶領域の全てを保存する
- 投稿日:2020-12-16T11:57:19+09:00
【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はい接続できた!!
- 投稿日:2020-12-16T11:47:47+09:00
yumコマンドが急に使えなくなった時の対処法
なんかいきなり「Read-only file system」とか言われるんやが?
なんで?なんで?なんで?なんで?なんで?なんで?なんで?なんで?なんで?なんで?
作業停止1-2時間
ワイは見つけた。
# mount -o rw,remount /なんかこれで「Read-only file system」とか言われなくなった!!
linuxコマンド勉強しよーって思った。
- 投稿日:2020-12-16T10:45:56+09:00
【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時間)を忘れがちです。
月末の夜間に動かしたいにも関わらず、月初の昼間に動いてしまってアラートが挙がる!といったことの無いよう、設定する際には必ずこのマニュアルを見ることにしました。
- 投稿日:2020-12-16T09:50:04+09:00
パケットフィルタリングについて纏めておく
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 DROP192.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:80iptables6
使い方は、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=yesnapt
192.168.0.0/24 からeth0 へ出ていくパケットは、MASQUERADE を利用する。
# iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADEsnat
192.168.0.1 から ens33 へでていくパケットは SNAT される。
# iptables -t nat -A POSTROUTING -o ens33 -j SNAT --to-source 192.168.0.1dnat
ens38 から入ってくるパケットは 192.168.0.2 へ変換される。
# iptables -t nat -A PREROUTING -i ens34 -j DNAT --to-destination 192.168.0.2firewall
とりあえず、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
- 投稿日:2020-12-16T09:35:31+09:00
【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 0NASの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は触る機会がなかったので良い刺激になった。
資格取得によってそこそこ知識を活かす事が出来た気がする。
- 投稿日:2020-12-16T07:28:45+09:00
Linux版のOpenSiv3Dをfind_packageでちょっと楽にアプリを作る
OpenSiv3DのLinux版が、クローンしてきたファイルの
OpenSiv3D/Linux/App
でしかビルドできないのが面倒くさいので、make install
に対応させる。
以下のパッチをdiff.patch
として保存し、diff.patchdiff --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.txtcmake_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引数だけで、バージョンを変えられるので、管理がしやすくなります。
- 投稿日:2020-12-16T06:59:36+09:00
行番号を付加する空行の単位を変更する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つの空行としてみなすマークアップ言語などがあるのかもしれませんね。
- 投稿日:2020-12-16T04:15:40+09:00
【ssh接続】ubuntu sshサーバー構築からssh接続まで
はじめに
自宅に自作PCのubuntu環境を用意したため、ssh接続を試みた。
ホスト環境へのsshサーバーの準備から、LAN内外からのアクセス方法までを学習したため、その内容を整理する。流れ
- ホスト側(ubuntu)のsshサーバー導入
- クライアント側での鍵の生成
- ホスト側での公開鍵の設定
- LAN内からのssh接続
- LAN外からのssh接続
1. ホスト(ubuntu)のsshサーバー設定
ssh-serverの導入
sudo apt install openssh-serversshd_configファイルで設定の変更
sudo vim /etc/ssh/sshd_config
sshd_config = sshデーモンの設定ファイル(外部からssh接続されたときの設定)
ssh_config = ssh接続の設定ファイル(外部へssh接続するときの設定)sshd_configファイルに以下内容を追加
#パスワードによる認証を許可 PasswordAuthentication yes #後続プロセスのため一時的に許可を与える設定を反映させるためにサーバを再起動
service sshd restart2. クライアント側での鍵の生成
公開鍵と秘密鍵を生成
(わかりやすいように鍵の名前を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 Copy3. ホスト側での公開鍵の設定
#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アドレスを手動で設定する
ゲートウエイはルータの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.1NATをエントリする
※あくまでも私のルータの例であり、細かい内容はルータごとに異なる② ドメインの取得
MyDNSというサイトでドメインを取得します.右上のjoin usから登録しログイン
https://www.mydns.jp/取得したドメインに対し,IP ADDR DIRECTから先程調べたグローバルIPアドレスをIPv4のところに入力し、ドメインとグローバルIPを紐づける
グローバル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/configHost 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
- 投稿日:2020-12-16T04:15:40+09:00
【sshサーバー】ubuntu sshサーバー構築〜LAN内外からのssh接続まで
はじめに
自宅に自作PCのubuntu環境を用意したため、ssh接続を試みた。
ホスト環境へのsshサーバーの準備から、LAN内外からのアクセス方法までを学習したため、その内容を整理する。
参考になったと思った方は、LGTMクリックいただけると幸いですm(__)m流れ
- ホスト側(ubuntu)のsshサーバー導入
- クライアント側での鍵の生成
- ホスト側での公開鍵の設定
- LAN内からのssh接続
- LAN外からのssh接続
1. ホスト(ubuntu)のsshサーバー設定
ssh-serverの導入
sudo apt install openssh-serversshd_configファイルで設定の変更
sudo vim /etc/ssh/sshd_config
sshd_config = sshデーモンの設定ファイル(外部からssh接続されたときの設定)
ssh_config = ssh接続の設定ファイル(外部へssh接続するときの設定)sshd_configファイルに以下内容を追加
#パスワードによる認証を許可 PasswordAuthentication yes #後続プロセスのため一時的に許可を与える設定を反映させるためにサーバを再起動
service sshd restart2. クライアント側での鍵の生成
公開鍵と秘密鍵を生成
(わかりやすいように鍵の名前を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 Copy3. ホスト側での公開鍵の設定
#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アドレスを手動で設定する
ゲートウエイはルータの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.1NATをエントリする
※あくまでも私のルータの例であり、細かい内容はルータごとに異なる② ドメインの取得
MyDNSというサイトでドメインを取得します.右上のjoin usから登録しログイン
https://www.mydns.jp/取得したドメインに対し,IP ADDR DIRECTから先程調べたグローバルIPアドレスをIPv4のところに入力し、ドメインとグローバルIPを紐づける
グローバル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/configHost 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
- 投稿日:2020-12-16T01:07:06+09:00
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終端
- コピー先のサイズが足りない場合はエラーを返す
なので、うまくこれを使っていきたい。