- 投稿日:2019-10-12T23:44:37+09:00
Vimの使い方
Vimは,Linuxのテキストエディタのひとつ.
操作方法が特殊なので,勉強したことを備忘録として残しておく.起動と終了
起動
$ vim
vim
を実行すると,Vimが起動する.vim <ファイル名>
で,Vimが起動し,指定したファイルを編集できるようになる.ファイルの保存
:w
:w
でファイルを保存できる.- 既存のファイルを開いていた場合には上書き保存され,新しいファイルを開いていた場合にはファイルが新規作成される.
:w <ファイル名>
で,指定したファイル名で保存することができる.Vimの終了
:q
:q
でVimを終了する.:wq
で,保存してからVimを終了する.:q!
で,現在の編集内容を破棄してVimを終了する.操作方法
文字の入力
- Vimにはノーマルモードとインサートモードが存在する.
- ノーマルモードは,起動直後の画面で,カーソルの移動や削除,コピー&ペースト,検索を行う.
- インサートモードは,ファイルに文字の入力を行う.
a
またはi
コマンドで,ノーマルモードからインサートモードに変わる.Esc
キーで,インサートモードからノーマルモードに戻る.
コマンド 実行内容 i 元のカーソル位置の左側に文字を追加 a 元のカーソル位置の右側に文字を追加 カーソル移動
- Vimでは,ノーマルモードの状態でコマンドを入力することでカーソル移動ができる.
- 文字単位での移動は,
h
,j
,k
,l
コマンドを使用する.
コマンド 実行内容 h 左に移動 j 下に移動 k 上に移動 l 右に移動
- 単語単位での移動は,
w
,b
コマンドを使用する.- 行頭への移動は
0
コマンド,行末への移動は$
コマンドを使用する.
コマンド 実行内容 w 前方に単語1つぶん移動 j 後方に単語1つぶん移動 W スペース区切りで前方に単語1つぶん移動 B スペース区切りで後方に単語1つぶん移動 0 行頭に移動 $ 行末に移動
- 行単位での移動は,
g
コマンドを使用する.
コマンド 実行内容 gg 1行目に移動 G 最後の行に移動 <数字>G <数字>行目に移動 切り取り
- Vimでは,切り取りをデリート(delete)と呼ぶ.
x
またはd
コマンドでデリートを行う.d
コマンドは,どの範囲までをデリートするかを指定できる.d
コマンドはの後ろにカーソル移動コマンドを合わせて指定する必要がある.
コマンド 実行内容 x, dl 現在位置から1文字を切り取り dw 現在位置から1単語を切り取り dd 現在カーソルのある行を切り取り d0 現在位置から行頭までを切り取り d$ 現在位置から行末までを切り取り dgg 現在位置から最初の行までを切り取り dG 現在位置から最後の行までを切り取り コピー
- Vimでは,コピーをヤンク(yank)と呼ぶ.
- 切り取りではなく,単にコピーしたいときは
y
コマンドを使用する.y
コマンドもd
コマンドと同じく,後ろにカーソル移動コマンドを合わせて指定する必要がある.
コマンド 実行内容 yl 現在位置から1文字をコピー yw 現在位置から1単語をコピー yy 現在カーソルのある行をコピー y0 現在位置から行頭までをコピー y$ 現在位置から行末までをコピー ygg 現在位置から最初の行までをコピー yG 現在位置から最後の行までをコピー 貼り付け
- Vimでは,貼り付けをプット(put)と呼ぶ.
- デリートやヤンクを行った文字列は,
p
コマンドを使用して貼り付けられる.
- 投稿日:2019-10-12T23:44:37+09:00
Vimのコマンド
Vimは,Linuxのテキストエディタのひとつ.
操作方法が特殊なので,勉強したことを備忘録として残しておく.起動と終了
起動
$ vim
vim
を実行すると,Vimが起動する.vim <ファイル名>
で,Vimが起動し,指定したファイルを編集できるようになる.ファイルの保存
:w
:w
でファイルを保存できる.- 既存のファイルを開いていた場合には上書き保存され,新しいファイルを開いていた場合にはファイルが新規作成される.
:w <ファイル名>
で,指定したファイル名で保存することができる.Vimの終了
:q
:q
でVimを終了する.:wq
で,保存してからVimを終了する.:q!
で,現在の編集内容を破棄してVimを終了する.操作方法
文字の入力
- Vimにはノーマルモードとインサートモードが存在する.
- ノーマルモードは,起動直後の画面で,カーソルの移動や削除,コピー&ペースト,検索を行う.
- インサートモードは,ファイルに文字の入力を行う.
a
またはi
コマンドで,ノーマルモードからインサートモードに変わる.Esc
キーで,インサートモードからノーマルモードに戻る.
コマンド 実行内容 i 元のカーソル位置の左側に文字を追加 a 元のカーソル位置の右側に文字を追加 o 下に1行挿入し行頭に文字を追加 カーソル移動
- Vimでは,ノーマルモードの状態でコマンドを入力することでカーソル移動ができる.
- 文字単位での移動は,
h
,j
,k
,l
コマンドを使用する.
コマンド 実行内容 h 左に移動 j 下に移動 k 上に移動 l 右に移動
- 単語単位での移動は,
w
,b
コマンドを使用する.- 行頭への移動は
0
コマンド,行末への移動は$
コマンドを使用する.
コマンド 実行内容 w 前方に単語1つぶん移動 j 後方に単語1つぶん移動 W スペース区切りで前方に単語1つぶん移動 B スペース区切りで後方に単語1つぶん移動 0 行頭に移動 $ 行末に移動
- 行単位での移動は,
g
コマンドを使用する.
コマンド 実行内容 gg 1行目に移動 G 最後の行に移動 <数字>G <数字>行目に移動 切り取り
- Vimでは,切り取りをデリート(delete)と呼ぶ.
x
またはd
コマンドでデリートを行う.d
コマンドは,どの範囲までをデリートするかを指定できる.d
コマンドはの後ろにカーソル移動コマンドを合わせて指定する必要がある.
コマンド 実行内容 x, dl 現在位置から1文字を切り取り dw 現在位置から1単語を切り取り dd 現在カーソルのある行を切り取り d0 現在位置から行頭までを切り取り d$ 現在位置から行末までを切り取り dgg 現在位置から最初の行までを切り取り dG 現在位置から最後の行までを切り取り コピー
- Vimでは,コピーをヤンク(yank)と呼ぶ.
- 切り取りではなく,単にコピーしたいときは
y
コマンドを使用する.y
コマンドもd
コマンドと同じく,後ろにカーソル移動コマンドを合わせて指定する必要がある.
コマンド 実行内容 yl 現在位置から1文字をコピー yw 現在位置から1単語をコピー yy 現在カーソルのある行をコピー y0 現在位置から行頭までをコピー y$ 現在位置から行末までをコピー ygg 現在位置から最初の行までをコピー yG 現在位置から最後の行までをコピー 貼り付け
- Vimでは,貼り付けをプット(put)と呼ぶ.
- デリートやヤンクを行った文字列は,
p
コマンドを使用して貼り付けられる.結合
x
コマンドでは行末の改行を削除できないため,2行を1行にまとめるられない.J
コマンドで,行を連結できる.検索
- ノーマルモードの状態でコマンドを入力することで検索ができる.
/
の後に文字列を入力することで,現在のカーソル位置から文字列を検索する.- 検索はlessコマンドと同じ操作で行う.
コマンド 実行内容 /<文字列> 下方向に向かって検索 ?<文字列> 上方向に向かって検索 n 次の検索結果に移動 N 前の検索結果に移動 置換
%s /<置換元文字列>/<置換後文字列>/g
- ノーマルモードの状態でコマンドを入力することで置換ができる.
- 投稿日:2019-10-12T22:52:58+09:00
CentOS7で一般ユーザにsudo権限を付与する方法
はじめに
本記事では、CentOS7(バージョンは7.7)で、一般ユーザにsudo権限を付与する方法を紹介します。
前提
- sudo権限を付与したい一般ユーザが存在していること
- rootユーザに切り替えることができること
手順
rootユーザに切り替える
$ suvisudoを開く
# visudo以下の行についているコメントを外す
変更前
## Allows people in group wheel to run all commands #%wheel ALL=(ALL) ALL変更後
## Allows people in group wheel to run all commands wheel ALL=(ALL) ALL既にコメントが外されていたら、何もする必要はありせん。
以下のコメントを実行する
# usermod -G wheel 追加したいユーザ名 (例)一般ユーザが「hogehoge」の場合 # usermod -G wheel hogehogePCを再起動する
一度、PCを再起動しないと反映されません。
sudoが使えることを確認する
$ sudo 何でもよいので適当なコマンド (例) $ sudo ls上記コマンド入力後、一般ユーザのパスワードを求められます。
パスワード入力後、sudo以降に入力したコマンドを実行できれば、
sudoが使えるようになっています。
- 投稿日:2019-10-12T22:46:27+09:00
sudoが実行できない...
sudoコマンドを使おうと思ったら
sudo: /private/etc/sudoers.d is owned by uid 501, should be 0えーーー、使えない----!!
いつ、何故、何で使えなくなったのか、全く心辺りがないっ!!涙
かなり格闘したが、調べながら何とか解決...まずは、スーパーユーザに切り替える
$ su #パスワードを求められるので入力もしpasswordを入れてもsorryが返される場合は下記URL参照でルートユーザを有効にしてください。
参考: https://support.apple.com/ja-jp/HT204012visudoコマンド等でsudoersを見る
# root and users in group wheel can run anything on any machine as any user root ALL = (ALL) ALL %admin ALL = (ALL) ALL変更していなければ、sudoは「root」および「adminグループ」権限で実行するものだと書いてあります。
しかし、エラー文の通り、何故か権限を持っていないので、/private/etc/sudoers.dの権限を変更しましょう。
chownコマンドでファイルやディレクトリの所有者、所属グループを変更できます。chown -R root:admin /private/etc/sudoers.d #chown -R [ユーザ]:[グループ] [ファイルやディレクトリ]これで解決しました。
- 投稿日:2019-10-12T22:10:16+09:00
Markdownをコンソール上でプレビュー
何がしたかったのか?
昭和生まれなもんで、GUIとかよう使われへん(エセ関西弁)
入手方法
https://github.com/tksmiura/miro
ここに入っているmiroというファイルをパスの通っておくところにコピーするだけ
実行方法
$ miro <markdown file>実行結果
listとかテーブルとかちょっと頑張った。
課題
- ユニコード対応(誰だ絵文字とか考えたやつ! https://qiita.com/yumetodo/items/54e1a8230dbf513ea85b)
- もう令和なので、考え方を改める
- 投稿日:2019-10-12T21:17:01+09:00
sortしてからdiffを行う
2つのコンフィグファイルをdiffで比べる場合
ソートしないとバラバラに出力される。→ならばソートしてdiffすれば...
[root@localhost ~]# cat test a b c d e [root@localhost ~]# cat test2 e d c b a [root@localhost ~]# diff <(sort test) <(sort test2) [root@localhost ~]#これでコンフィグを見比べるときも楽になりそう。
- 投稿日:2019-10-12T21:06:12+09:00
OpenBLASのソースをコンパイルしてローカルにインストールする
OpenBLASを公式ページ からダウンロードして解凍。
terminal$ curl -LO http://github.com/xianyi/OpenBLAS/archive/v0.3.6.tar.gz $ tar -xvf v0.3.6.tar.gz解凍したフォルダに移動して、下記のコマンドを打つと
OpenBLAS-0.3.6/bin, OpenBLAS-0.3.6/include, OpenBLAS-0.3.6/libに
インストールされる。terminal$ cd OpenBLAS-0.3.6 $ make $ make install PREFIX=$(pwd)
- 投稿日:2019-10-12T19:40:39+09:00
SSH接続でログインの失敗回数によりアカウントをロックする方法
セキュリティを高めたい為にログインの試行回数によりロックしたいことがありますね。この記事はCentOS7でログインを失敗した場合一定回数の失敗した回数を記録しユーザのアカウントをロックする方法を記載しています。具体的に以下のステップで試行回数によるロックを実現することができます。
ステップ1: /etc/ssh/sshd_config で UsePAM yes 設定
ステップ2: PAM 設定 (password-auth)
ステップ3: system-auth/etc/ssh/sshd_config でUsePAM yes
CentOS7ではPAMの「pam_faillock」モジュールの機能を使用し任意の回数ログインに失敗したユーザのアカウントをロックすることが出来ます。まずsshdでPAMが使用できるように「/etc/ssh/sshd_config」で「UsePAM yes」の設定が有効になっていることを確認して下さい。(CentOS7.5では初期状態で有効になっています)
sudo nano /etc/ssh/sshd_configUsePAM yes設定変更を行った場合は設定を反映する為にsshdを再起動しましょう。
systemctl restart sshdステップ1PAM 設定(password-auth)
SSHで任意の回数ログインに失敗したユーザのアカウントをロックさせたい場合、「/etc/pam.d/password-auth」のauthセクションとaccountセクションに「pam_faillock」モジュールの設定を追加します。(rootユーザはロック対象外)
以下コマンドで開いてauthセクションを探します。
sudo nano /etc/pam.d/password-authauth required pam_faillock.so preauth silent audit deny=回数 unlock_time=解除時間 auth [default=die] pam_faillock.so authfail audit deny=回数 unlock_time=解除時間account required pam_faillock.so
「deny=回数」でログイン失敗でアカウントをロックをするまでの回数を指定します。「unlock_time=解除時間」でロックが解除されるまでの時間(秒)を指定します。
「unlock_time」の値に「0」を指定すると、管理者が「faillock」コマンドでロック解除を行わない限りアカウントはロックされたままとなります。
具体的設定事例
ステップ2password-auth
「/etc/pam.d/password-auth」にログイン失敗を10回繰り返すと600秒(10分)アカウントをロックする設定を追加します。さきほどのpassword-authを編集します。
sudo nano /etc/pam.d/password-auth????? 部分3行が追加した設定になります。
#%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth sufficient pam_unix.so try_first_pass nullok auth required pam_deny.so auth required pam_faillock.so preauth silent audit deny=10 unlock_time=600 ????? 追加しました! auth [default=die] pam_faillock.so authfail audit deny=10 unlock_time=600 ????? 追加しました! account required pam_unix.so account required pam_faillock.so ????? 追加しました! password requisite pam_pwquality.so try_first_pass local_users_only retr$ password sufficient pam_unix.so try_first_pass use_authtok nullok sha512 $ password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so -session optional pam_systemd.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet$ session required pam_unix.soポイント コンソールからのログイン失敗
「/etc/pam.d/password-auth」の設定だけではコンソールから直接ログイン失敗した場合にアカウントをロックすることはできません。コンソールからのログイン失敗についてもアカウントのロックを行いたい場合は「/etc/pam.d/system-auth」にも、同様の設定を行う必要があります。
ステップ3system-auth
それではせっかくなのでpassword-authだけではなく、今度は system-auth も修正していきます。
sudo nano /etc/pam.d/system-auth同じように3か所を追加していきます。内容も一緒です。
#%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth sufficient pam_unix.so try_first_pass nullok auth required pam_deny.so auth required pam_faillock.so preauth silent audit deny=10 unlock_time=600 ????? 追加しました! auth [default=die] pam_faillock.so authfail audit deny=10 unlock_time=600 ????? 追加しました! account required pam_unix.so account required pam_faillock.so ????? 追加しました! password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= password sufficient pam_unix.so try_first_pass use_authtok nullok sha512 shadow password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so -session optional pam_systemd.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.soポイント root
「root」ユーザもロックしたい場合はauthセクションに追加する設定に「even_deny_root」を追加しましょう。
auth required pam_faillock.so preauth silent audit deny=回数 even_deny_root unlock_time=解除時間 auth [default=die] pam_faillock.so authfail audit deny=回数 even_deny_root unlock_time=解除時ログイン失敗回数の確認
「faillock」コマンドを実行することで、ユーザのログイン失敗情報を確認することが出来ます。
faillock「testuser」でログイン失敗を繰り返した後に「faillock」コマンドを実行してみると、ログイン失敗に関しての情報が確認できます。
faillock
root: When Type Source Valid hogehogeuser: When Type Source Valid sampleuser: When Type Source Valid 2019-09-14 16:50:41 RHOST 192.168.10.2 V 2019-09-14 16:50:44 RHOST 192.168.10.2 V 2019-09-14 16:50:47 RHOST 192.168.10.2 V特定ユーザのログイン失敗情報を確認したい場合は、「--user」オプションを使用することでユーザの指定が可能となります。
faillock --user ユーザ名「testuser」というユーザのログイン失敗状況を確認してみます。
# faillock --user testuser testuser: When Type Source Valid 2018-07-04 16:50:41 RHOST 192.168.1.26 V 2018-07-04 16:50:44 RHOST 192.168.1.26 V 2018-07-04 16:50:47 RHOST 192.168.1.26 Vアカウントロック解除方法
アカウントのロックを解除したい場合は、「--user」でロックを解除したいユーザを指定した後に「--reset」を指定することでロックを解除することが出来ます。
faillock --user ユーザ名 --reset実際に「testuser」のロックを解除してみます。
faillock --user testuser --reset「faillock」コマンドで確認してみると、ログイン失敗の情報が削除されてロックが解除されていることが確認できます。
# faillock root: When Type Source Valid hogeuser: When Type Source Valid sampleuser: When Type Source Valid番外編
faillock: Error opening the tally file for root:Permission deniedもしも上記エラーが発生した時は su - でrootになってから faillockをすると結果をチェックする事ができます。
ログをみる
failcockで気付いたらログを見てみるのも手です。が詳しい人に相談するのが一番早いです。
sudo nano /var/log/secure
- 投稿日:2019-10-12T16:10:34+09:00
Clear Linux のインストール
性能が良いと噂1のIntel製のClear Linux をインストールしました。 UbuntuとかDebianはインストール手順の記事が多くありますが、 Clear Linuxについては日本語の記事はあまり無いみたいなので記録を残しておきます。 この手順は公式の解説ドキュメント に従ったものです。
0. 動作環境
上述の通りClear Linuxはインテル製のLinuxディストリビューションですが、 AMDのCPUでも問題なく動作します。 自分の環境は、CPU: Ryzen5 1600, GPU: Radeon RX 460, Memory: 16GB RAM, HDD: 1GBです。
1. USBドライブの作成(Windowsの場合)
imageリポジトリから OSイメージをダウンロードしてきて、ブータブルUSBドライブを作成します。 Installer image(clear-[version]-installer.img.xz)をダウンロード。 次に使うので、その下にあるclear-[version]-installer.img.xz-SHA512SUMSもダウンロードしておきます。
このダウンロードしてきたOSイメージが壊れていないか確認しましょう、 ということでコマンドプロンプトでコマンド
CertUtil -hashfile ./clear-[version]-installer.img.xz sha512を実行し、実行結果で出てきた文字列がさっきダウンロードした-SHA512SUMSの内容とあっているか確認。
ダウンロードした.xzファイルを展開するために、 7-zipをダウンロード、インストール。 .xzファイルを右クリックすると7-zipを選べるようになっているので、 「ここに展開」を選択すると.imgファイルがフォルダ内に展開されます。
RufusでOSイメージをUSBに焼きます。 USBメモリをPCに挿し、Rufusを起動し、「選択」ボタンから展開した.imgファイルを選び、 スタートをクリックします。USBメモリは最低8GB必要です。 UbuntuとDebianは4GBあれば十分だった気がするので少し大きいですね。
ここまで終わったら次はインストールです。 公式のドキュメントには With a bootable Clear Linux OS drive, you can Multi-boot Clear Linux OS with other operating systems なんていう魅力的なことが書いてあって、その手順も説明されていますが、 今回は空のHDDにClear Linux単体をインストールします。
2. HDDにClear Linuxをインストールする
USBドライブを作成できたので、ハードディスクにインストールします。 USBドライブをPCに挿したままPCを起動し、 デフォルトのOSが起動する前にF11ブートメニューからUSBを選択。 しばらくして青い画面が出現します。
TimezoneはAsia/Tokyo、Keyboardはjp106に設定。 Configure Mediaのところでインストール先のドライブを選択し、 auto partitionでパーティション分割。 TeremetryをDisabledにしてインストール。
Condfigure Mediaで選択したハードディスクのデータが全部消えますよ、 という警告文が出てくるのでOKするとインストールが開始します。 インストールが終了したら再起動して、 F11ブートメニューからインストール先のハードディスクを選択するとClear Linuxが起動します。
例えば、8-Way Linux Distribution Benchmarks On The Intel Core i9 9900K - One Distro Wins 67% Of The Time (http://www.phoronix.com/scan.php?page=article&item=intel-9900k-distros&num=1) を参照 ↩
- 投稿日:2019-10-12T15:22:07+09:00
Linuxの基本
未来電子テクノロジーでインターンをしている箕牧和廣です。
今回はLinuxについて書いていこうと思います。プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。Linuxとは
Linuxとは『Mac OS』や『Windows 10』のようなOSの1種です。
OSとは、オペレーティングシステムの略称で、コンピュータの全てのハードウェアを管理しているソフトウェアのことです。
具体的な役割としては、マウスやキーボードから入力した情報をアプリケーションに伝え、ハードウェアとソフトウェアの連携をはかります。Linuxの特徴
LinuxはオープソースのOSなので、ソースコードを誰でも無料でダウンロード、変更、再配布できます。
また、Linuxを利用する場合、基本的にはLinuxディストリビューションを使用します。
Linuxディストリビューションは、Linuxのアプリケーションやライブラリをひとまとめにして、PCにインストールすれば使える状態にした配布物を指し、利用可能なLinuxディストリビューションは何千とあります。覚えておきたいLinux用語
僕が勉強していて分からなかったLinux用語をまとめてみます。
Linuxカーネル
Linuxカーネルはソフトウェアからの要求に応え、ハードウェアからの応答をソフトウェアに伝える、仲立ちをしてくれます。
代表的な機能としては、プロセス管理、プロセススケジューラ、メモリ管理、ファイルシステムなどです。パッケージ
パッケージとはアプリケーションの配布形態です。
Windowsでは、インターネットからインストーラーをダウンロードしてアプリをインストールしますが、Linuxでは、RPMやYumなどのパッケージ管理ツールを利用し、パッケージをダウンロードしてインストールします。ディレクトリ
ディレクトリとは、ファイルを分類、整理、保存する入れ物のようなものです。
Windowsの『フォルダ』と同じようなイメージです。シェル
シェルとは、Linux上で使用できるコマンドをまとめて記述して実行できるもので、シェルスクリプトとも呼びます。
シェルスクリプトは、プログラミング言語のように条件分岐や繰り返し処理など記述することができます。コマンド
Linuxのシェルでは、Linuxに何を実行させるのかを、キーボードで入力します。
コマンドは、このキーボードで入力する命令文のことです。
よく使うコマンドを以下にまとめてみました。
コマンド 説明 ls ディレクトリ情報の表示 cd ディレクトリの移動 cp ファイルのコピー mv ファイルの移動・ファイル名の変更 rm ファイルの削除 cat テキストファイルの内容を表示 touch ファイルのタイムスタンプの変更 mkdir フォルダ作成 man マニュアルの表示 ライブラリ
ライブラリとは、よく使用されるプログラムの共通部分を抜き出して、他のプログラムから利用できるようにしたものです。
- 投稿日:2019-10-12T14:21:20+09:00
スクリプト実行ディレクトリを取得ためのシェルスクリプト
1958年9月の狩野川台風に匹敵する規模台風19号がやってきて、避難命令が発令されたり、河川が溢れたり大変になっています。ラグビーワールドカップの試合も中止になったりと気持ちの面での被害が大きくなっています。
せっかく中心街のアーケード街で買い物でもしようかなと考えていたのに、電車も計画運休で動いていないので、仕方なく部屋でゴソゴソとパソコン触っています。
個人用にAWS Lightsailに立てているUbuntuサーバーへ実行スクリプトを作成しようとしたら、Shell Scriptをどこからでも呼び出しても、pathがないでエラーを発生させないように絶対パスを取得する方法を忘れてしまったので、覚書として残しておきます。
環境
$ uname -a Linux ip-172-26-5-169 4.4.0-1074-aws #84-Ubuntu SMP Thu Dec 6 08:57:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux $ cat /etc/issue Ubuntu 16.04.5 LTS \n \lUbuntu 16.04.5 です。
簡単な方法
もし1行で記述する場合は以下の書き方が楽ちんです。
DIR="$( cd "$( dirname "$0" )" >/dev/null 2>&1 && pwd )" echo "DIR is '$DIR'"ただし、この方法はディレクトリがSymbolic linkでは対応していません。
シンボリックリンクでも大丈夫な方法
#!/bin/bash SOURCE="$0" while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )" SOURCE="$(readlink "$SOURCE")" [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located done DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )" echo "DIR is '$DIR'"だいたいはこのスニペットで大丈夫だと思いますが、もし相対シンボリックリンクも対応したい場合は、下記の方法で取得します。
相対シンボリックパスも大丈夫な方法
#!/bin/sh SOURCE="$0" while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink TARGET="$(readlink "$SOURCE")" if [[ $TARGET == /* ]]; then echo "SOURCE '$SOURCE' is an absolute symlink to '$TARGET'" SOURCE="$TARGET" else DIR="$( dirname "$SOURCE" )" echo "SOURCE '$SOURCE' is a relative symlink to '$TARGET' (relative to '$DIR')" SOURCE="$DIR/$TARGET" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located fi done echo "SOURCE is '$SOURCE'" RDIR="$( dirname "$SOURCE" )" DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )" if [ "$DIR" != "$RDIR" ]; then echo "DIR '$RDIR' resolves to '$DIR'" fi echo "DIR is '$DIR'"エイリアス、
source
、bash -c
、シンボリックリンクなどの任意の組み合わせで動作します。ただし、このスニペットを実行する前に
cd
コマンドを利用して別のディレクトリに移動した場合、結果が間違っている可能性がありますので注意してください。最後に
Ubuntuのデフォルトシェルは
bash
ではなく、dash
だったんですね(汗$ readlink -f $(which sh) /bin/dashそれを知らなかったので、
BASH_SOURCE[0]
を使うとBad substitution
と警告が表示されてしまった。$ sh publish.sh publish.sh: 7: publish.sh: Bad substitution
参考
- 投稿日:2019-10-12T14:21:20+09:00
Shell Scriptの実行ディレクトリを取得する
1958年9月の狩野川台風に匹敵する規模台風19号がやってきて、避難命令が発令されたり、河川が溢れたり大変になっています。ラグビーワールドカップの試合も中止になったりと気持ちの面での被害が大きくなっています。
せっかく中心街のアーケード街で買い物でもしようかなと考えていたのに、電車も計画運休で動いていないので、仕方なく部屋でゴソゴソとパソコン触っています。
今回はShell Scriptをどこから呼び出しても、実行スクリプトの絶対パスを取得できる方法をいつも忘れてしまうので、覚書として残しておこうと思います。
環境
$ uname -a Linux ip-172-26-5-169 4.4.0-1074-aws #84-Ubuntu SMP Thu Dec 6 08:57:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux $ cat /etc/issue Ubuntu 16.04.5 LTS \n \lUbuntu 16.04.5 です。
簡単な方法
もし1行で記述する場合は以下の書き方が楽ちんです。
DIR="$( cd "$( dirname "$0" )" >/dev/null 2>&1 && pwd )" echo "DIR is '$DIR'"ただし、この方法はディレクトリがSymbolic linkでは対応していません。
シンボリックリンクでも大丈夫な方法
#!/bin/bash SOURCE="$0" while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )" SOURCE="$(readlink "$SOURCE")" [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located done DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )" echo "DIR is '$DIR'"だいたいはこのスニペットで大丈夫だと思いますが、もし相対シンボリックリンクも対応したい場合は、下記の方法で取得します。
相対シンボリックパスも大丈夫な方法
#!/bin/sh SOURCE="$0" while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink TARGET="$(readlink "$SOURCE")" if [[ $TARGET == /* ]]; then echo "SOURCE '$SOURCE' is an absolute symlink to '$TARGET'" SOURCE="$TARGET" else DIR="$( dirname "$SOURCE" )" echo "SOURCE '$SOURCE' is a relative symlink to '$TARGET' (relative to '$DIR')" SOURCE="$DIR/$TARGET" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located fi done echo "SOURCE is '$SOURCE'" RDIR="$( dirname "$SOURCE" )" DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )" if [ "$DIR" != "$RDIR" ]; then echo "DIR '$RDIR' resolves to '$DIR'" fi echo "DIR is '$DIR'"エイリアス、
source
、bash -c
、シンボリックリンクなどの任意の組み合わせで動作します。ただし、このスニペットを実行する前に
cd
コマンドを利用して別のディレクトリに移動した場合、結果が間違っている可能性がありますので注意してください。最後に
Ubuntuのデフォルトシェルは
bash
ではなく、dash
だったんですね(汗$ readlink -f $(which sh) /bin/dashそれを知らなかったので、
BASH_SOURCE[0]
を使うとBad substitution
と警告が表示されてしまった。$ sh publish.sh publish.sh: 7: publish.sh: Bad substitution
参考
- 投稿日:2019-10-12T12:20:13+09:00
LVM ファイルシステムタイプのハードディスクをマウントする方法
今、/dev/sdd2 に LVM ファイルシステムタイプがあるとします。
/dev/sdd1 には、/boot が存在しており、こちらはマウントできます。
/dev/sdd2 を普通にマウントしようとしても、以下のようになり、マウントに失敗します。# mount /dev/sdd2 /mnt/sdd2mount: /mnt/sdd2: 未知のファイルシステムタイプ 'LVM2_member' です./dev/sdd を調べます。
# fdisk -l /dev/sdd ディスク /dev/sdd: 1.8 TiB, xxxxxx バイト, xxxxxx セクタ 単位: セクタ (1 * 512 = 512 バイト) セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O サイズ (最小 / 推奨): 4096 バイト / xxxxxx バイト ディスクラベルのタイプ: dos ディスク識別子: 0xxxxxxx デバイス 起動 開始位置 最後から セクタ サイズ Id タイプ /dev/sdd1 * 2048 xxxxxx xxxxxx 500M 83 Linux /dev/sdd2 xxxxxx xxxxxx xxxxxx 1.8T 8e Linux LVMでは、この /dev/sdd2 をマウントしていきます。
まず、利用可能な volumne group を調査します。
以下のコマンドを実行します。# pvs PV VG Fmt Attr PSize PFree /dev/sda2 fedora lvm2 a-- <1.82t 0 /dev/sdd2 fedora lvm2 a-- <1.82t 4.00m実際に起動している OS の VolumeGroup 名前と、ハードディスクの Volume Group の名前が、”fedora" と同一名となっているので、ハードディスクの Volume Group の名前を別の名前にでもリネームしてみます。
UUID を調べます。
# vgdisplay --- Volume group --- VG Name fedora System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 4 VG Access read/write VG Status resizable MAX LV 0 Cur LV 3 Open LV 3 Max PV 0 Cur PV 1 Act PV 1 VG Size <1.82 TiB PE Size 4.00 MiB Total PE 476675 Alloc PE / Size 476675 / <1.82 TiB Free PE / Size 0 / 0 VG UUID xxxxxxxxxxxxxxxxxx --- Volume group --- VG Name fedora System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 4 VG Access read/write VG Status resizable MAX LV 0 Cur LV 3 Open LV 0 Max PV 0 Cur PV 1 Act PV 1 VG Size <1.82 TiB PE Size 4.00 MiB Total PE 476806 Alloc PE / Size 476805 / <1.82 TiB Free PE / Size 1 / 4.00 MiB VG UUID xxxxxxxxxxxxxxxxxx ★<----これを使うvgrename コマンドを使用して、ハードディスクの方の Volume Group 名をリネームします。
# vgrename xxxxxxxxxxxxxxxx fedora_old Processing VG fedora because of matching UUID xxxxxxxxxxxxxxxx Volume group "xxxxxxxxxxxxxxxx" successfully renamed to "fedora_old"では、volume groupe をもう一度見てみます。
# pvs PV VG Fmt Attr PSize PFree /dev/sda2 fedora lvm2 a-- <1.82t 0 /dev/sdd2 fedora_old lvm2 a-- <1.82t 4.00mこれで、fedora という名前の重複はなくなりました。
ハードディスクのほうは、fedora_old となりました。では、マウントしていきます。
# vgscan --mknodes Reading volume groups from cache. Found volume group "fedora" using metadata type lvm2 Found volume group "fedora_old" using metadata type lvm2ここで、lvscan をかけても、ハードディスクのほうは、inactive となっています。
# lvscan ACTIVE '/dev/fedora/swap' [<7.84 GiB] inherit ACTIVE '/dev/fedora/home' [1.76 TiB] inherit ACTIVE '/dev/fedora/root' [50.00 GiB] inherit inactive '/dev/fedora_old/swap' [7.81 GiB] inherit inactive '/dev/fedora_old/home' [1.76 TiB] inherit inactive '/dev/fedora_old/root' [50.00 GiB] inheritここで、mount コマンドを実行しても、マウントできません。
# mount /dev/fedora_old/home /mnt/sdd2 mount: /mnt/sdd2: スペシャルデバイス /dev/fedora_old/home が存在しません.inactive となっているものを、有効化します。
# vgchange -ay 3 logical volume(s) in volume group "fedora" now active 3 logical volume(s) in volume group "fedora_old" now activeもう一度確認します。
# lvscan ACTIVE '/dev/fedora/swap' [<7.84 GiB] inherit ACTIVE '/dev/fedora/home' [1.76 TiB] inherit ACTIVE '/dev/fedora/root' [50.00 GiB] inherit ACTIVE '/dev/fedora_old/swap' [7.81 GiB] inherit ACTIVE '/dev/fedora_old/home' [1.76 TiB] inherit ACTIVE '/dev/fedora_old/root' [50.00 GiB] inheritでは、もう一度マウントしてみます。
# mount /dev/fedora_old/home /mnt/sdd2マウントできたようです。
- 投稿日:2019-10-12T11:05:50+09:00
backlog の実験
今日は、backlog の実験をしてみます。
CentOS6.9 で、メモリ4Gbyte の仮想マシン上で実験しました。
よく使われるアプリケーションとして、Apache を上げてみます。
前提知識です。
syn backlog:接続確立中キューの最大値(不完全なソケットのキューの最大長) backlog:接続待ちキューの最大値(完全に確立されたソケットのキューの最大長) tcp_syncookies: 有効(値 1):一定の基準を越えた場合、syncookies を送信する。 syn backlog と backlog の小さいほうの値を、付近の 2の累乗の値に 切り上げた数値を超えると、syncookie を送信します(注)。 その際、ソケット蓄積の概念は放棄されるため、syn backlogの最大値の概念 は無視されます。 無効(値 0): 一定の基準を越えた場合、新たな要求を無視する。 接続確立中キューに syn backlog の 75 % + 1 を超えるソケットが溜まる と、新しい要求を無視します。 (注) syncookies は、TCP プロトコルにしたがっていない点があり、攻撃に対する 対処用法として存在し、予備的な機能(fallback functionality)でしか ないため、SYN flood を起こさせるようなDOS 攻撃を受けていると考えられる 場合のみに発動されるべきです。 (参考) Documentation/networking/ip-sysctl.txt次に、それぞれの値の設定ヶ所の説明です。
- syn backlog の設定ヶ所 OS の設定か所:/proc/sys/net/ipv4/tcp_max_syn_backlog Apache の設定ヶ所:なし - backlog の設定ヶ所 OSの設定箇所: /proc/sys/net/core/somaxconn Apache の設定か所: ListenBackLog ディレクティブの設定値backlog の値について、OS および Apache で設定が可能ですが、以下の条件にしたがいます。
Apache の設定値 ≦ OS の設定値ならば、 Apache の設定値が有効 Apache の設定値 > OS の設定値ならば、 OS の設定値が有効
- tcp_syncookies の設定ヶ所
OS の設定か所:/proc/sys/net/ipv4/tcp_syncookies Apache の設定ヶ所:なしbacklog の値は、実際は 1 から 65535 まで設定可能です。
例えば、OS および Apache の設定値を 4096 にすると、backlog の設定値は、
Apache の値、4096 となります。syn backlog の値を増やすかどうかは、そのマシンの通常の通信状況によります。
OS のデフォルト設定では、syncookies が有効になっていますので、
接続確立中の要求が syn backlog の値と、backlog 値の小さいほうの値を、
付近の 2 の累乗の値を切り上げた数値を超えた場合、syncookie が送信されます。通常のトラフィックにおいて、接続確立中の要求が多くならいようであれば、
syn backlog の値を増やす必要はなく、通常の通信環境においても、
接続確立中の要求が多くなるようであれば、多くする必要があるかもしれませんね。いずれにしても、設定の際は、通常のアプリケーションの通信状況を把握した上で、
各上限値を設定する必要があるといえます。TCP ソケットを listen している情報は、以下のコマンドの結果が表示する、
Recv-Q,Send-Q により確認できます。ここで、Send-Q の値が、Apache の
backlog になります。# ss -lti '( sport = :http )'接続確立中の要求数の確認は、以下のコマンドで確認できます。
# netstat -antp | grep SYN_RECV | wc -l(一例:syncookies=0 で syn backlog が 2048 の時、上限値に達した場合)
1537私が行った設定で実験したら、このようになりました。
・デフォルトの設定
128 /proc/sys/net/core/somaxconn 2048 /proc/sys/net/ipv4/tcp_max_syn_backlog 511 Apache の ListenBackLog ディレクティブbacklog の最大値 128 tcp_syncookies=1 の場合 接続確立中の要求数の上限値 256(backlog の付近の2の累乗の値) tcp_syncookies=0 の場合 接続確立中の要求数の上限値 1537(syn backlog * 0.75 + 1 の値)・OS、Apache の設定値を上げる
2048 /proc/sys/net/core/somaxconn 2048 /proc/sys/net/ipv4/tcp_max_syn_backlog 2048 Apache の ListenBackLog ディレクティブbacklog の最大値 2048 tcp_syncookies=1 の場合 接続確立中キューの最大値 4096(backlog の付近の2の累乗の値) tcp_syncookies=0 の場合 接続確立中キューの最大値 1537(syn backlog * 0.75 + 1 の値)・syn backlog 変化させず、さらにOS、Apacheの設定値を上げる
4096 /proc/sys/net/core/somaxconn 2048 /proc/sys/net/ipv4/tcp_max_syn_backlog 4096 Apache の ListenBackLog ディレクティブbacklog の最大値 4096 tcp_syncookies=1 の場合 接続確立中キューの最大値 4096(syn backlog の付近の 2 の累乗の値) tcp_syncookies=0 の場合 接続確立中キューの最大値 1537(syn backlog * 0.75 + 1 の値)・syn backlog を、4096 に上げる
4096 /proc/sys/net/core/somaxconn 4096 /proc/sys/net/ipv4/tcp_max_syn_backlog 4096 Apache の ListenBackLog ディレクティブ backlog の最大値 4096 tcp_syncookies=1 の場合 接続確立中キューの最大値 8192(backlog の付近の2の累乗の値) tcp_syncookies=0 の場合 接続確立中キューの最大値 3073(syn backlog * 0.75 + 1 の値)また、この実験の場合ですが、接続確立中の要求が syn backlog の値と、
backlog 値の小さいほうの値を、付近の 2 の累乗の値を切り上げた数値を超えた
場合、syncookie が送信されることになります。
そのとき、/va/log/messages には、以下のログが 60秒に 1回記録されます。kernel: possible SYN flooding on port <PORT>. Sending cookies.tcp_syncookies は OS で有効に設定されています。
tcp_syncookies が有効な場合、上述のとおり syn backlog の値を
変化させることにより、接続確立中キューの最大値は変化するので、適宜設定したらいいと思います。
具体的にどうやって実験したかというと、次のようにやりましたよ。
以下のスクリプトを実行します。これを確認します。
#!/bin/bash while : do netstat -antp | grep SYN_RECV | wc -l sleep 1 done下記のとおり、SYN FLOOD 攻撃を実行して、上記の表示を観察する(実際のシステムにやってはいけませんよ)。
# hping3 -c 10000 -d 120 -S -w 64 -p 21 --flood --rand-source <TARGET_IP>おいしいもの食べたいなぁ。
(参考:用語解説等)
https://access.redhat.com/solutions/30453
http://d.hatena.ne.jp/nyant/20111216/1324043063
mpm_common - Apache HTTP サーバ バージョン 2.4
- 投稿日:2019-10-12T10:45:58+09:00
初心者 Linuxコマンドその他用語集
①Linuxコマンド...LinuxというOSにコマンドを書いてCUIで操作するもの。
②CUI...Character User Interfaceの略。
マウスでクリックするとファイルが開かれるように絵やアイコンで操作する環境できる。
GUI(Graphical User Interface)とは違って文字のみで操作することを指す。主にターミナルを使っていく。③ディレクトリ..端的にいうとフォルダの事を指す。
/desktop/ファイル名/の様なディレクトリ階層の事をパスと呼ぶ。基本的なLinuxコマンド一覧
comaand 正式名称 意味 mkdir make directory ディレクトリの作成 cd change directory ディレクトリの移動 ls list ディレクトリの中身を表示 pwd print working directory 現在のディレクトリの位置を確認する mv move ファイルの移動、ファイルの名前の変更(mv既存のファイル名 新しいファイル名 rm remove ファイルの削除 touch touch 新規ファイルの作成、ファイルのタイムスタンプの変更 man manual マニュアルの表示
- 投稿日:2019-10-12T09:48:39+09:00
suの利用を制限する方法
suを使用制限すると?
一部を除いたLinux初期設定では全ユーザがsuを使用することで、rootユーザになることが出来てしまいます。rootのパスワードが分ってしまえば誰でもssh経由でrootになれてしまいますのでセキュリティ上まずい場面もあると思います。今回は「su」を実行出来るユーザを制限する事にしました。
注意点
この設定を行うと以下2点が実行できなくなります。
・wheelグループ以外のユーザが「su」コマンドでrootになれなくなります。
・他ユーザにもsuすることが出来なくなります。今回はwheelグループに所属しているユーザだけが「su」実行可能という制限設定を構築していきたいと思います。
具体的実行ステップ 設定項目
下記3ステップでsu利用制限させる事が出来ます。
ステップ1 /etc/pam.d/su を編集する
ステップ2 su 許可ユーザをwheelグループに追加
ステップ3 動作確認
※ 以前は「/etc/login.defs」ファイル内に「SU_WHEEL_ONLY yes」設定追加が必要でしたが、CentOS6及びCentOS7では不要です。
ステップ1 /etc/pam.d/su
/etc/pam.d/su のファイルの中にある「pam_wheel.so」モジュールを使用するように設定変更します。これによりwheelグループに属しているユーザだけが「su」が出来るように設定が変更になります。
# vi /etc/pam.d/suどこを変更するのか 設定内容変更箇所
下記コメントで無効化されている箇所の「#」を外して設定を有効化します。
変更前
# Uncomment the following line to require a user to be in the "wheel" group. #auth required pam_wheel.so use_uid変更後
# Uncomment the following line to require a user to be in the "wheel" group. auth required pam_wheel.so use_uid※別OS(ディストリビューション)やバージョンによっては、以下設定の場合もあります。
#auth required /lib/security/$ISA/pam_wheel.so use_uid #auth required /lib/security/pam_wheel.so group=wheel #auth required /lib/security/pam_wheel.so use_uid group=wheelちょい注意ポイント sufficient
間違って下記部分のコメントをはずすと wheelグループに属しているユーザが「su」を実行するとパスワードなしでrootになれてしまいます。コメントを外す時は間違えないよう十分に注意してください。
# Uncomment the following line to implicitly trust users in the "wheel" group. #auth sufficient pam_wheel.so trust use_uid設定を有効化させるのは「required」です。
ステップ2 ユーザをwheelグループに追加
「su」を許可するユーザをwheelグループへ追加します。追加方法は2つあります。下記のどちらかの方法で行うことが出来るのでそれぞれの方法を説明していきます。
グループを追加する方法は2つある
1. /etc/groupを編集する
2. usermodコマンドを使用する1つめ /etc/groupファイルを編集
グループの設定ファイルである「/etc/group」を直接編集して、wheelグループにユーザを追加します。
# vi /etc/group編集内容
今回は、hogeというユーザをwheelグループに追加してみます。複数のユーザを追加する際は「,」で区切っていきます。編集前
wheel:x:10:編集後
wheel:x:10:hoge <--hogeユーザを追加しました。2つめ usermod コマンドを使用
「usermod」コマンドを使用しwheelグループにユーザを追加する場合は「-G」オプションを使用し指定したユーザの副グループを指定します。
# usermod -G wheel ユーザ名wheelグループにhogeユーザを追加する場合は、下記のようにコマンドを実行します。
# usermod -G wheel hogeグループがユーザに追加しているか設定を確認
設定が完了しましたら、念のため「/etc/group」ファイルの中身を確認してwheelグループにユーザが追加されているか確認してみましょう。
# grep wheel /etc/group wheel:x:10:hogeステップ3 動作確認
設定が完了しましたらsu実行可能userが制限できているか確認します。設定に間違いなどがあった場合ssh経由でrootになることが出来なくなる場合があるので、現在接続しているrootユーザでの接続は動作確認が取れるまで絶対に切断しないよう留意してください。sshで接続して動作確認を行う場合は、新規に接続を行って動作確認を行いましょう。
wheelグループ以外のユーザで「su」を実行
wheelグループに登録されていないユーザで「su」コマンドを実行します。CentOS7の場合下記の通り「拒否されたパーミッション」といったメッセージが表示され「su」が出来なくなっているはずです。CentOS6の場合は「パスワードが違います」といったメッセージが表示され、「su」が出来なくなっているはずです。
$ su - パスワード: su: 拒否されたパーミッション$ su - Password: su: パスワードが違いますwheelグループのユーザで「su」を実行する
wheelグループに所属しているユーザで「su」を実行して、rootになれるか確認してみてください。問題なくrootユーザになれるようでしたら、設定作業は完了となります。
余談
他の記事も参考にさせていただきながら実際に制限して思ったのですが、信頼できる仲間やシステム業者の方々と構築していく環境を整備していく方が楽しいし安心できるとおもいました。もちろん今回の実行権限をシステム制御する事は有効です。同時に例えば万全な制御をしない時に仲間からアラートで知らせてくれるような構築メンバーとの信頼関係を日頃から築いている事もかなり重要だと感じました。
- 投稿日:2019-10-12T06:54:00+09:00
Raspberry PiでOut-Of-Treeのドライバをクロスコンパイルする
Raspberry PiでOut-Of-Treeのデバイスドライバをクロスコンパイルしてみたときの自分用メモです。
WAveshareのWM8960-HATのドライバを例にしてみます。
(https://github.com/waveshare/WM8960-Audio-HAT )手順
クロコンパイル環境の準備
こちらのページ( https://qiita.com/mt08/items/d4e9b9e4953c8fa0abcf )やラズパイの公式ドキュメントを参考にクロスコンパイル環境を整えます。
Kernel Sourceの取得
こちら( https://github.com/raspberrypi/linux )からKernel Sourceを取得します。
たとえば現時点(2019/10/13)で最新のものは https://github.com/raspberrypi/linux/archive/raspberrypi-kernel_1.20190925-1.tar.gz から取得できます。
取得したら解凍して展開し、以下のコマンドで.configを作成しておきます。(.configがないと後のドライバのMake実行時にエラーが出ます。)# Raspberry Pi 2/3の場合 make bcm2709_defconfig # Raspberry Pi Zero/Zero W/B/Aの場合 make bcmrpi_defconfigデバイスドライバのソースコード取得
こちら( https://github.com/waveshare/WM8960-Audio-HAT ) からデバイスドライバのソースコードを取得します。
Makefileの作成
クロスコンパイル用のMakefileを作成します。
ここではMakefile_crossという名前で作成します。KERNELSRCDIR = ../linux-rpi-4.19.y BUILD_DIR := $(shell pwd) VERBOSE = 0 # Module name obj-m := wm8960.o all: make -C $(KERNELSRCDIR) SUBDIRS=$(BUILD_DIR) KBUILD_VERBOSE=$(VERBOSE) modules clean: rm -f *.o rm -f *.koKERNELSRCDIRのディレクトリ指定はご自分で配置した構成に合わせて修正する必要があります。
作成したら、WM8960のドライバのソースコードと同じ位置に配置します。ビルドの実行
以下のコマンドを実行し、ビルドします。
export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- make -f Makefile_crossこれでsnd-soc-wm8960.ko、snd-soc-wm8960-soundcard.koというモジュールができるので、
適切な場所にコピーしてロードすれば使えるようになります。基本的には他のドライバも同じような方法で行けるはずです。