- 投稿日:2020-09-10T19:43:28+09:00
【LINUXカーネル再構築】バージョンアップ(4.18.0→5.8.8)
目標
AWS EC2(Red Hat Enterprise Linux 8 (HVM), SSD Volume Type)に搭載されているカーネルのバージョンアップ(4.18.0→5.8.8)を完了すること。
前提
AWS EC2サーバ1台(Red Hat Enterprise Linux 8 (HVM), SSD Volume Type)が構築済みであること。
なお、カーネル再構築はコンパイルやインストール時にある程度高いシステムリソース(CPU、メモリ等)を用意した方が時間短縮されスムーズになります。
また、ある程度のディスク容量がないとコンパイル時にエラーとなる可能性があります。
本記事ではインスタンスタイプm5a.xlarge
(0.344USD/時間)、ディスク容量は50GB
としました。
また、コンパイルやインストールにはスペックにもよりますが1時間以上かかる可能性があることを留意してください。カーネル再構築とは(LPICテキストより)
カーネルを必要に応じてコンパイルし、インストールすることを「カーネルの再構築」といいます。
以下のパターンにおいて、カーネル再構築を検討する必要があるようです。・必要なデバイスドライバ(カーネルモジュール)がカーネルに含まれていない。
・使用しているハードウェアに最適化したカーネルを利用したい。
・カーネルの最新機能を使いたい。カーネルを再構築するにはgccコンパイラやmakeユーティリティ、カーネルソース、カーネルヘッダが必要となります、
また、カーネル再構築時にはカーネルモジュールも合わせてコンパイルし直す必要があります。作業の流れ
項番 タイトル 1 カーネルソースを用意する 2 カーネルの設定 3 カーネルとカーネルモジュールのコンパイル 4 カーネルモジュールとカーネルのインストール 5 完了確認 参考書籍と参考サイト
Linux教科書 LPICレベル2 Version4.5対応
CentOSでカーネルの再構築を行いカーネルモジュールを有効にする方法
カーネル(Linux-4.8.6)をコンパイルしてインストールしてみた手順
1.カーネルソースを用意する
①開発ツールのインストール
OSログイン後、ルートスイッチsudo su -現在のカーネルバージョンを
uname -r
で確認# 現在のカーネルバージョンは4.18.0 [root@ip-172-31-42-117 ~]# uname -r 4.18.0-193.el8.x86_64カーネル再構築に必要なツールをインストールします(※)。
インストールされていないツールが異様に多かったですが、気にしないことにします。。※参考にさせて頂いた記事
カーネル(Linux-4.8.6)をコンパイルしてインストールしてみた(1-1.開発ツールのインストール)# 参考サイトを基にインストール yum groupinstall "Development Tools" yum install kernel-devel yum install rpm-build redhat-rpm-config unifdef yum install ncurses ncurses-devel # 以降はmake(コンパイル)時に実際に発生したエラーを基に追加インストール yum install elfutils-libelf-devel yum install openssl-devel yum install bc②カーネルソースのダウンロード
wgetコマンド(URLを指定してファイルをダウンロードする)をインストールします。yum install wgetカーネルソースをhttps://www.kernel.org/から選び、ダウンロードします。
今回はカーネルバージョン5.8.8
(09-Sep-2020)を取得します。wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.8.8.tar.xz解凍と展開を行います。
tar Jxvf linux-5.8.8.tar.xz展開したカーネルソースのディレクトリ配下に移動
cd linux-5.8.82.カーネルの設定
①既存設定ファイルをmake oldconfigでアップデート
現在のカーネルで利用されている設定ファイルを.config
(カーネルの設定ファイル)にコピーし、ゼロからのカーネル設定ファイル作成を回避します。cp -p /boot/config-4.18.0-193.el8.x86_64 .configカーネルコンフィギュレーションのアップデートを行います。
make oldconfig
を利用することで、新しいカーネルで付け加えられた機能についてのみ問い合わせを行い、
従来から存在する設定については既存の設定をそのまま流用することが可能です。本記事では新規項目に関しては全てデフォルト設定(yやnを入力せずただEnterを押す)とし、
設定が必要な「Kernel compression mode」については、今回は「1. Gzip (KERNEL_GZIP)」としました。make oldconfig# make oldconfigの出力例 [root@ip-172-31-42-117 linux-5.8.8]# make oldconfig scripts/kconfig/conf --oldconfig Kconfig .config:1089:warning: symbol value 'm' invalid for NF_CT_PROTO_GRE .config:2949:warning: symbol value 'm' invalid for ISDN_CAPI * * Restart config... * * * General setup * # 従来から存在する項目はそのまま自動で流用 Compile also drivers which will not load (COMPILE_TEST) [N/y/?] n Local version - append to kernel release (LOCALVERSION) [] Automatically append version information to the version string (LOCALVERSION_AUTO) [N/y/?] n # (NEW)と記載されている新規項目のみこちらに問い合わせてくる Build ID Salt (BUILD_SALT) [] (NEW) Kernel compression mode > 1. Gzip (KERNEL_GZIP) 2. Bzip2 (KERNEL_BZIP2) 3. LZMA (KERNEL_LZMA) 4. XZ (KERNEL_XZ) 5. LZO (KERNEL_LZO) 6. LZ4 (KERNEL_LZ4) choice[1-6?]: 1 (省略)②make menuconfigを利用してカーネル設定を微調整
更にmake menuconfig
を利用することで、カーネルの各設定項目の選択式で調整することが可能です。
今回は検証段階でコンパイルエラーとなった原因のカーネル設定を事前にmake menuconfigで修正(※)します。※エラー解決時に参考にさせて頂いたサイト
"No rule to make target 'debian/certs/debian-uefi-certs.pem', needed by 'certs/x509_certificate_list'. Stop."を解決する参考サイトによるとエラー原因となっているカーネル設定はCONFIG_SYSTEM_TRUSTED_KEYSという項目(/boot以下の既存カーネル設定ファイルをコピーした場合、この項目は空文字列に修正しないとコンパイルエラーとなってしまうようです)
[root@ip-172-31-42-117 linux-5.8.8]# cat .config | grep "CONFIG_SYSTEM_TRUSTED_KEYS" CONFIG_SYSTEM_TRUSTED_KEYS="certs/rhel.pem"カーネル設定の修正を開始します。
make menuconfig以下のようなコンソールが出たら、カーソルを利用してカーネルコンフィギュレーションの設定が可能です。
以下画像の赤枠の部分までカーソルで移動してEnterで選択していきます。
デフォルトで記載されている文字列を消去し、空にしたらEnter
最後に.configにSave
変更が反映されているか.configの中身確認
[root@ip-172-31-42-117 linux-5.8.8]# cat .config | grep "CONFIG_SYSTEM_TRUSTED_KEYS" CONFIG_SYSTEM_TRUSTED_KEYS=""3.カーネルとカーネルモジュールのコンパイル
make
でカーネルとカーネルモジュールのコンパイルをします。
引数なしでも実行可能ですがこのコンパイル作業がかなり時間がかかるため-jオプションを利用して並列処理数を変更し、コンパイル時間の短縮を図ります(※)。
本記事での構成ですと約1時間弱コンパイルに時間かかりました。※参考にさせて頂いた記事
コア数に応じた最適なmake実行# CPUコア数に応じた最適なプロセス数を起動する JOBS=$[$(grep cpu.cores /proc/cpuinfo | sort -u | sed 's/[^0-9]//g') + 1] make -j${JOBS}※なお、コンパイル中にCONFIG_DEBUG_INFO_BTFという設定項目に関するエラーでたので修正しました。
# make中以下エラー発生 BTF: .tmp_vmlinux.btf: pahole (pahole) is not available Failed to generate BTF for vmlinux Try to disable CONFIG_DEBUG_INFO_BTF # 言われた通りCONFIG_DEBUG_INFO_BTFを無効化 [root@ip-172-31-42-117 linux-5.8.8]# cat .config | grep CONFIG_DEBUG_INFO_BTF CONFIG_DEBUG_INFO_BTF=n4.カーネルモジュールとカーネルのインストール
①カーネルモジュールのインストール
# 特にエラーなく完了すること make modules_install
以下のように
/lib/modules/カーネルバージョン
ディレクトリが構成されていればOKです。[root@ip-172-31-42-117 linux-5.8.8]# ls -l /lib/modules/5.8.8/ total 3440 lrwxrwxrwx. 1 root root 17 Sep 10 09:46 build -> /root/linux-5.8.8 drwxr-xr-x. 13 root root 141 Sep 10 09:47 kernel -rw-r--r--. 1 root root 873761 Sep 10 09:47 modules.alias -rw-r--r--. 1 root root 837562 Sep 10 09:47 modules.alias.bin -rw-r--r--. 1 root root 8171 Sep 10 09:46 modules.builtin -rw-r--r--. 1 root root 10467 Sep 10 09:47 modules.builtin.bin -rw-r--r--. 1 root root 62064 Sep 10 09:46 modules.builtin.modinfo -rw-r--r--. 1 root root 278819 Sep 10 09:47 modules.dep -rw-r--r--. 1 root root 389096 Sep 10 09:47 modules.dep.bin -rw-r--r--. 1 root root 405 Sep 10 09:47 modules.devname -rw-r--r--. 1 root root 99497 Sep 10 09:46 modules.order -rw-r--r--. 1 root root 521 Sep 10 09:47 modules.softdep -rw-r--r--. 1 root root 422378 Sep 10 09:47 modules.symbols -rw-r--r--. 1 root root 510059 Sep 10 09:47 modules.symbols.bin lrwxrwxrwx. 1 root root 17 Sep 10 09:46 source -> /root/linux-5.8.8②カーネルのインストール
# 特にエラーなく完了すること(エラーが出ずに終了することは必ず確認してください。筆者はエラーがでたまま再起動したらサーバが立ち上がらなくなりました。。) make install -j${JOBS}以下のようにカーネルイメージ
/boot/vmlinuz-カーネルバージョン
が/boot内に存在していればOKです。[root@ip-172-31-42-117 ~]# ls -l /boot/vmlinuz* lrwxrwxrwx. 1 root root 19 Sep 10 09:47 /boot/vmlinuz -> /boot/vmlinuz-5.8.8 -rwxr-xr-x. 1 root root 8913760 Apr 23 05:16 /boot/vmlinuz-0-rescue-bb64a14c7512444f9744c3076505b65f -rwxr-xr-x. 1 root root 8920432 Sep 10 08:05 /boot/vmlinuz-0-rescue-ec211058807a3398326019a9b3f9e8bf -rwxr-xr-x. 1 root root 8920432 Aug 26 19:47 /boot/vmlinuz-4.18.0-193.19.1.el8_2.x86_64 -rwxr-xr-x. 1 root root 8913760 Mar 27 14:48 /boot/vmlinuz-4.18.0-193.el8.x86_64 -rw-r--r--. 1 root root 8613632 Sep 10 09:47 /boot/vmlinuz-5.8.85.完了確認
再起動後、以下のようにカーネルバージョンが変更されていればOKです。
[root@ip-172-31-42-117 ~]# uname -r 5.8.8
- 投稿日:2020-09-10T18:33:41+09:00
findで検索したファイルを消すのは-deleteが良い
はじめに
データベースからバックアップしたファイルを検索し、削除するシェルスクリプトを書くタスクがありました。
ファイルを検索するにはfindコマンドがあることは知っていましたが、検索→削除までを一括で行うコマンドはないかと調べていたので、まとめます。-exec というアクションがあるらしい
僕が求めていた、検索→削除までを一括で行うコマンドをググっているうちに-execアクションを実行すれば良いというサイトが多く出てきました。
こんな感じですね。
sample# find /ディレクトリ/~ -exec ls -l {} \;ほぼ全てのサイトがこの書き方だったんだけど、よくわからなかったです。
-deleteという簡単なコマンドがあるらしい
会社の先輩に聞きました。末尾に-deleteオプションを付ければ良いらしいです。
sample# find /ディレクトリ/~ -delete;こっちのほうが簡単ですね。
以上です。
- 投稿日:2020-09-10T15:03:01+09:00
Linuxで通信量を監視する
前の記事でディスク容量を監視してみました。
ついでに、通信量を測定してみたかったので、watch
コマンドにifconfig
を渡してみた。$ watch -n 1 ifconfig enx00e04c00004aこんな感じ。
enx~
はインターフェース名。書かなければ全部出てきます。
通信量は起動してからの受信量・送信量がそれぞれRX、TXとして表示されます。詳細はifconfig
のマニュアル見てね。Every 0.1s: ifconfig enx00e04c00004a graviohub: Thu Sep 10 14:57:45 2020 enx00e04c00004a: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.86.55 netmask 255.255.255.0 broadcast 192.168.86.255 inet6 fe80::79b8:173:d2bd:f0e9 prefixlen 64 scopeid 0x20<link> ether 00:e0:4c:00:00:4a txqueuelen 1000 (Ethernet) RX packets 2500640 bytes 1823881816 (1.8 GB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 3509207 bytes 1042507689 (1.0 GB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0このやり方もかなりお手軽なのでおすすめです。きちんと測定したいときはそれなりのやり方を考えましょう。:P
- 投稿日:2020-09-10T14:43:27+09:00
Linuxでディスク使用量を監視する
Linuxでディスク使用量を監視したかったのでちょっと調べてみたら
watch
というコマンドを見つけた。$ watch -n 1 df -kを実行すると、1秒毎に下記の画面がリフレッシュされる。
Every 1.0s: df -k graviohub: Thu Sep 10 14:15:28 2020 Filesystem 1K-blocks Used Available Use% Mounted on /dev/root 15008307 13057103 1292403 91% / devtmpfs 1965540 0 1965540 0% /dev tmpfs 1967840 0 1967840 0% /dev/shm tmpfs 1967840 67128 1900712 4% /run tmpfs 5120 4 5116 1% /run/lock tmpfs 1967840 0 1967840 0% /sys/fs/cgroup tmpfs 393568 0 393568 0% /run/user/1000がっつり解析せずにちょっとした傾向とか知りたいときに便利。
- 投稿日:2020-09-10T00:29:50+09:00
OpenWRT(LEDE)使いこなし : LINE Notify
はじめに
OpenWRT/LEDEのNASサーバーにLINE Notify環境を構築して、
サーバーからの通知を受け取る様にした際のTipsです。と言っても、例えばRaspberryPiの様な、新しくて安定している環境では発生しない、
古い環境でしか発生しない様なTipsです。ちなみに、私が使っている環境は以下です。
LEDE 17.01.4 / linux kernel 4.4.92 ですので、
それなりに古い・チープな環境です。環境構築
基本的に curl が有ればLINE Notifyは使えますが、
ca-bundleも必要となります。root@LEDE:~# opkg update root@LEDE:~# opkg install curl root@LEDE:~# opkg install ca-bundleエラー1
curl: (27) PRNG seeding failedどうも、curlのバージョンが古い事にに依存するバグの様です。
LEDE 17.01.4 としてinstallされる curl_7.52.1-10 では解決しない為、
openwrt 18.06 まで該当するパッケージのみをアップデートする事にします。http://downloads.openwrt.org/releases/18.06.8/packages/mipsel_24kc/base/curl_7.60.0-4_mipsel_24kc.ipk
http://downloads.openwrt.org/releases/18.06.8/packages/mipsel_24kc/base/libcurl_7.60.0-4_mipsel_24kc.ipk上記を opkg install で直接指定するか、
ローカルにダウンロードしてきて、ファイル指定でinstallすればOKです。エラー2
Error loading shared library libmbedcrypto.so.1: No such file or directory上手くリンクが作られていない様です。
エラー1の対策で、本来のディストリビューションパッケージ外のバージョンを導入した為、
整合性が取れなくなっているのかもしれません。取り敢えず、該当しそうなライブラリを探してみます。
root@LEDE:/overlay/upper/usr/lib/opkg# ls -all /usr/lib/ | grep libmbedcrypto lrwxrwxrwx 1 root root 18 Feb 24 11:49 libmbedcrypto.so -> libmbedcrypto.so.0 lrwxrwxrwx 1 root root 23 Feb 24 11:49 libmbedcrypto.so.0 -> libmbedcrypto.so.2.7.10 -rwxr-xr-x 1 root root 222455 Jun 19 2019 libmbedcrypto.so.2.7.10古いバージョンのリンクで大丈夫か不安ですが、
リンクを貼ってみます。ln -s /usr/lib/libmbedcrypto.so.2.7.10 /usr/lib/libmbedcrypto.so.1結果
root@LEDE:/overlay/upper/usr/lib/opkg# curl -X POST -H 'Authorization: Bearer XXXX' -F "message=test" https://notify-api.line.me/api/notify {"status":200,"message":"ok"}上手く動きました。
依存関係の問題を無理やり解決して動いたので、運が良かった様に思います。