20200910のLinuxに関する記事は5件です。

【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としました。
tempsnip.png
また、コンパイルやインストールにはスペックにもよりますが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.8

2.カーネルの設定

①既存設定ファイルを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で選択していきます。
tempsnip.png
tempsnip.png
tempsnip.png
デフォルトで記載されている文字列を消去し、空にしたらEnter
tempsnip.png
最後に.configにSave
tempsnip.png
キャプチャ.PNG

変更が反映されているか.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=n

4.カーネルモジュールとカーネルのインストール

①カーネルモジュールのインストール

# 特にエラーなく完了すること
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.8

5.完了確認

再起動後、以下のようにカーネルバージョンが変更されていればOKです。

[root@ip-172-31-42-117 ~]# uname -r
5.8.8
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

findで検索したファイルを消すのは-deleteが良い

はじめに

データベースからバックアップしたファイルを検索し、削除するシェルスクリプトを書くタスクがありました。
ファイルを検索するにはfindコマンドがあることは知っていましたが、検索→削除までを一括で行うコマンドはないかと調べていたので、まとめます。

-exec というアクションがあるらしい

僕が求めていた、検索→削除までを一括で行うコマンドをググっているうちに-execアクションを実行すれば良いというサイトが多く出てきました。

こんな感じですね。

sample
# find /ディレクトリ/~ -exec ls -l {} \;

ほぼ全てのサイトがこの書き方だったんだけど、よくわからなかったです。

-deleteという簡単なコマンドがあるらしい

会社の先輩に聞きました。末尾に-deleteオプションを付ければ良いらしいです。

sample
# find /ディレクトリ/~ -delete;

こっちのほうが簡単ですね。

以上です。

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

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

watch-ifconfig.gif

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

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

がっつり解析せずにちょっとした傾向とか知りたいときに便利。

watch-df.gif

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

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"}

上手く動きました。
依存関係の問題を無理やり解決して動いたので、運が良かった様に思います。

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