20210801のLinuxに関する記事は11件です。

aptコマンド

目次 aptコマンドとは? aptコマンドの種類 個人メモ(パッケージのインストールに関して) 1.aptコマンドとは? Ubuntu(Linuxのディストリビューションの一つ)におけるパッケージ管理システム ※厳密にいうと、UbuntuはDebian系列のOSでDebian系のディストリビューションに使われているパッケージ管理用のコマンド 以前はapt-get もしくは apt-cacheが使用されていたが、統合されてaptコマンドとして使用できるようになった aptに関する設定は、以下のディレクトリ、ファイルを参照 aptに関する設定 ファイル名 説明 /etc/apt apt に関する設定ファイルが格納されるディレクトリ /etc/apt/sources.list 登録されているリポジトリのURLを列挙するファイル 2.aptコマンドの種類 Ubuntuでの操作を想定。 文頭のsudoは省略。 コマンド 説明 apt install [パッケージ名] インストール apt remove [パッケージ名] アンインストール apt remove --purge [パッケージ名] パッケージを完全削除 apt autoremove 依存関係で必要だったが現在は不要なパッケージの削除 apt update パッケージのインデックスファイルを更新 apt upgrade インストール済みのパッケージをまとめて更新する apt full-upgrade upgradeに加え、更新に伴って使用できなくなるパッケージを削除するなどの調整も行う apt show [パッケージ名] パッケージの詳細情報を表示 apt list インストール可能なパッケージを検索 apt list [パッケージ名] インストール可能なパッケージを検索(完全一致) apt list --installed インストールされているパッケージを表示 apt list --upgradable アップデートできるパッケージを表示する apt search [パッケージ名] インストール可能なパッケージを検索(部分一致) apt moo お遊び用のコマンド 3.個人メモ(パッケージのインストールに関して) Node.js # nodejsをインストール $ sudo apt install nodejs # npmをインストール $ sudo apt install npm # この時点では、Node.js のバイナリはnodeではなくnodejsになっているため # nodeという名前でリンクするには、下記コマンドを実行 $ sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10 Go # goをインストール $ sudo apt install golang
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Node.js実行環境構築

目的 Node.jsを用いて簡易なWebシステムを構築することを目的に、まずは動作環境の構築を行う。 環境条件 Node.jsサーバ EC2:t2.micro OS:Red Hat Enterprise Linux 8 (HVM), SSD Volume Type Disk:汎用SSD(GP2) 10GB セキュリティグループの設定等はいい感じに。 構築手順 ec2-userでログイン # rootユーザにスイッチ sudo su - # Node.js用ディレクトリの作成 mkdir -p /opt/nodejs # 作成したディレクトリへ移動 cd /opt/nodejs # Node.jsのモジュールインストール yum module install nodejs:14 # nodeの配置先の確認 which node /usr/bin/node # Node.jsのバージョン確認 node -v v14.16.0 # NPMのバージョン確認 npm -v 6.14.11 この後のアプリケーション開発のために、同サーバにmysqlをインストールしたが、手順については割愛。 8.0.21をインストールし、rootアカウントのパスワードを設定。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linux: 画面が文字化けしてしまった時にはRESETコマンド

たまに必要となるのでメモ。 実施環境: Linux [testuser@testhost ~]$ uname -a Linux testhost 4.18.0-147.8.1.el8_1.x86_64 #1 SMP Thu Apr 9 13:49:54 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux [testuser@testhost ~]$ echo $SHELL /bin/bash うっかりバイナリファイルをテキスト表示コマンドで開いてしまうと、画面が文字化けして戻らなくなります。 Linux [testuser@testhost ~]$ head -1 /var/log/wtmp ■tty1tty1■■■■`E [|es||ser@|es|■os| -]$ このような場合は、resetコマンドを使用することで直すことが可能です。 画面表示上はresetコマンド自体も文字化けしていますが、問題なく実行できます。 Linux [|es||ser@|es|■os| -]$ rese| [testuser@testhost ~]$ もっとも、一番良いのはそもそも文字化けさせないことです。 例えば、fileコマンドで開きたいファイルがテキストファイルか事前に確認することで、バイナリファイルをテキスト表示コマンドで開いてしまうことを防げます。 Linux [testuser@testhost ~]$ file /var/log/README /var/log/README: ASCII text [testuser@testhost ~]$ file /var/log/wtmp /var/log/wtmp: dBase III DBT, version number 0, next free block index 0 lessコマンドのような、テキストファイルかどうかの確認機能が備わっているテキスト表示コマンドを使用することも有効です。 Linux [testuser@testhost ~]$ less /var/log/wtmp "/var/log/wtmp" may be a binary file. See it anyway?
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mysqldumpコマンドまとめ「基礎から実践まで」

1. 基本的な使い方 1-1. 基本のコマンド mysqldumpコマンドは指定したDBのデータを標準出力してくれるコマンド。 なので、標準出力のリダイレクト>を組み合わせることでファイルに出力させてdumpファイルを作成するのが普通の使い方である。 # DBの全てのテーブルを取得 mysqldump -h[db_server_host_name] -u[db_user_name] -p[db_password] [DB_Name] > ./dump_file_name.sql # 指定したテーブルだけ取得 mysqldump -h[db_server_host_name] -u[db_user_name] -p[db_password] [DB_Name] [table_name] > ./dump_file_name.sql 1-2. テーブルの構造・データを指定して取得 上記みたいに何も指定しないとテーブルの構造+データを取得するが、指定して取得する方法もある。やり方は以下。 1. 構造のみ取得したい時は「--no-data」か「-d」オプションをつける 2. データのみ取得したい時は「-t」オプションをつける これを上記で紹介したDB全体・テーブル指定を応用したら下記のような例のパターンが作れる # db全てのテーブルの構造・データ mysqldump -u [username] -p [password] -h [host_name] [database_name] > ./dump_file_name.sql # db全てのテーブルの構造 mysqldump -u [username] -p [password] -h [host_name] -d [database_name] > ./dump_file_name.sql # db全てのテーブルのデータ mysqldump -u [username] -p [password] -h [host_name] -t [database_name] > ./dump_file_name.sql # dbの指定テーブルの構造・データ mysqldump -u [username] -p [password] -h [host_name] [database_name] [table_name] > ./dump_file_name.sql # dbの指定テーブルの構造 mysqldump -u [username] -p [password] -h [host_name] -d [database_name] [table_name] > ./dump_file_name.sql # dbの指定テーブルのデータ mysqldump -u [username] -p [password] -h [host_name] -t [database_name] [table_name] > ./dump_file_name.sql 1-3. 離れたサーバーのdumpをローカルで取る方法 ~/.ssh/configに保存させたなら下記で簡単に取れる ssh [Host Name] 'mysqldump -h[db_server_host_name] -u[db_user_name] -p[db_password]' > ./dump_file_name.sql なるほどね。 sshでサーバーないでmysqldumpコマンドを走らせて標準出力したものをローカルのファイルに出力する方法。 2. 応用編 本番のDBからdumpを取る時は気をつけなければいけないことがいくつかあるので紹介する。 2-1. テーブルロックの問題 まだ公開されていないシステムだといいかもしれないが、既に運用中のシステムのdumpを取る時はテーブルロックに注意しなければならない。 でないとREADロックがかかってしまって、ユーザはdump対象のテーブルにselect以外の処理が出せなくなってしまうという大惨事が怒る? 結論から言うとdump先のテーブルがinnoDBの時は下記のオプションを追加するだけでいい。 --single-transaction --skip-lock-tables --single-transactionだけでロックはかからないらしいけど、怖いので一応--skip-lock-tablesもつけている。 もし詳しい方いらっしゃったら教えてください?‍♂️ 2-2. データ量が重すぎる問題 規模の大きいサービスだとdump取るのかなりの時間を消耗することは普通にあることなので、できるだけ時間を短縮する必要がある。 mysqldumpはテーブル指定の場合は--whereオプションが使えるらしい。 あとgzipで圧縮しながらとなると最終的に下記のコマンドに落ち着いた。 ssh sid_pd 'mysqldump --single-transaction --skip-lock-tables -h[db_server_host_name] -u[db_user_name] -p[db_password] -t [database_name] [table_name] --where="id > 11005 limit 0,50200" | gzip' | cat > "file_name_`date "+%Y%m%d_%H%M%S"`.sql.gz" 参考にしたサイト https://masyus.work/articles/if-using-mysqldump-add-single-transaction-skip-lock-table/ https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0062 https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html#option_mysqldump_single-transaction
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

正規表現 例題・解説集(bash)

はじめに ひよっこエンジニアです。初心者向けにbashでの正規表現についてまとめています。 また、様々なパターンを調べるために、簡単な問題と解説を用意したのでトライしてみてください。 正規表現 記号や文字列を組み合わせて、目的のキーワードを見つけるためのパターンを作り、検出する方法。 記号はメタキャラクタと呼ばれ、記号にそれぞれ意味がある。 主なメタキャラクタ 記号 意味 備考 ^ 先頭 $ 末尾 \ 直後の一文字をエスケープ . 任意の一文字 * 直前の文字が0回以上繰り返し ? 直前の文字が0回か1回繰り返し 拡張正規表現 + 直前の文字が1回以上繰り返し 拡張正規表現 { } 直前の文字を{}の回数繰り返し 拡張正規表現 [ ] [ ]で囲まれた文字のうち一文字に一致 ?や+は拡張正規表現と呼ばれ、 egrepコマンド grepに-Eオプション をつけた場合 に使用することができる。 [ ]による文字グループ 例 意味 [abc] a,b,cのいずれかの文字 [a-c] a,b,cのいずれかの文字(上と同じ) [a-cA-C] a,b,c,A,B,Cのいずれかの文字 [^abc] a,b,c以外の文字 例題 以降、grepコマンドを用いて文字列を検索する例題を記述していく。 ※grepコマンドの使い方 $grep {検索したい文字列} {検索したいファイル名} $ grep UNIX01 file1 UNIX01 SECTION1 SECTION1は下記の例題とfile1でやっていきます。 【例題】 例1: $ grep '^U' file1 例2: $ grep '[xX]' file1 例3: $ grep '^U.*1$' file1 例4: $ grep '.' file1 例5: $ grep '\.' file1 例6: $ grep '^[^0-9]' fileA $ cat file1 UNIX01 UNIX02 Linux01 Linux10 . RedHat10 RedHat11 例1 先頭がUで始まるの検索。 $ grep '^U' file1 UNIX01 UNIX02 例2 x,Xが含まれている行の検索。 $ grep '[xX]' file1 UNIX01 UNIX02 Linux01 Linux10 例3 先頭がUで始まり、任意の文字を0回以上繰り返して、最後は1で終わる行の検索。 $ grep '^U.*1$' file1 UNIX01 例4 任意の一文字が含まれる行の検索。(= 空白行以外の全てを検索) $ grep '.' file1 UNIX01 UNIX02 Linux01 Linux10 . RedHat10 RedHat11 例5 ピリオドを含む行の検索。 \の後の文字はエスケープされるため.はメタキャラクタではなく文字としてとらえる。 $ grep '\.' file1 . 例6 先頭が数値以外の行を検索。 $grep '^[^0-9]' fileA UNIX01 UNIX02 Linux01 Linux10 . RedHat10 RedHat11 SECTION2 SECTION2は下記の例題とfile2でやっていきます。 【例題】 例7: $ grep '[0-9][0-9]*' file2 例8: $ grep '[0-9]*' file2 例9: $ grep '1.bak' file2 例10: $ grep '1.' file2 例11: $ grep '^centOS[^0-9][^A-C].*k$' file2 例12: $ grep '^centOS0[^1-9]*.bak' file2 例13: $ grep -E '^centOS10?' file2 例14: $ grep -E '10|AA' file2 例15: $ grep -E '^centOS[^1-9]{5}.bak' file2 $ cat file2 centOS01.bak centOS10.bak centOS123.bak centOS00000.bak centOSAAA.bak centOSABC.bak centOS.bak 例7 一桁の数値を含むor二桁以上の数値を含む行の検索。 $ grep '[0-9][0-9]*' file2 centOS01.bak centOS10.bak centOS123.bak centOS00000.bak 例8 0桁の数値を含むor一桁以上の数値を含む行の検索。 $ grep '[0-9]*' file2 centOS01.bak centOS10.bak centOS123.bak centOS00000.bak centOSAAA.bak centOSABC.bak centOS.bak 例⑦と比較すると分かるように、「0桁の数値を含む」≒ 全てを含むことになり全行検索される。 例9 1.bakが含まれる行の検索。 $ grep '1.bak' file2 centOS01.bak 例10 1の後に任意の文字が含まれる行の検索。 $ grep '1.' file2 centOS01.bak centOS10.bak centOS123.bak 例11 先頭がcentOSから始まり、次に数値以外の文字、次にA,B,C以外の文字を0回以上繰り返して、kで終わる行の検索。 $ grep '^centOS[^0-9][^A-C].*k$' file2 centOS.bak 例12 先頭がcentOS0から始まり、次に1〜9以外の文字を0回以上繰り返して、.bakで終わる行の検索。 $ grep '^centOS0[^1-9]*.bak' file2 centOS00000.bak 例13 先頭がcentOS1から始まり、0が0回以上、もしくは1回の繰り返しに一致する検索。 $ grep -E '^centOS10?' file2 centOS10.bak centOS123.bak ?は拡張正規表現で使用されるメタキャラクタで、直前の文字が0回以上もしくは1回の繰り返しに一致する。 centOS123.bakは?の直前の文字(=0)が0回の繰り返しの時に該当し、 centOS10.bakは?の直前の文字(=0)が1回の繰り返しの時に該当する。 -Eオプションは拡張正規表現を使用する際に付けなければならない。 また下記のようにegrepコマンドを使用することもできる。 $ egrep 'centOS10?' file2 centOS10.bak centOS123.bak 例14 10もしくはAAを含む行を検索。 $ grep -E '10|AA' file2 centOS10.bak centOSAAA.bak |を挟む左右のどちらかに一致する行を検索する。 これも拡張正規表現のため-Eオプションまたはegrepコマンドを使用する必要がある。 ちなみに、|を複数使用することも可能。 $ grep -E '10|AA|AB' file2 centOS10.bak centOSAAA.bak centOSABC.bak 例15 先頭がcentOSから始まって、1~9以外の文字を5回繰り返して、.bakで終わる行を検索。 $ grep -E '^centOS[^1-9]{5}.bak' file2 centOS00000.bak {}が拡張正規表現のため-Eオプションまたはegrepコマンドを使用する必要がある。 SECTION3 SECTION3は下記の例題と 序盤で作成したfile1をもう一度使ってやっていきます。 【例題】 例16: $ grep -i '[Ix]' file1 例17: $ grep -v '0.' file1 例18: $ grep -F '.' file1 $ cat file1 UNIX01 UNIX02 Linux01 Linux10 . RedHat10 RedHat11 例16 i,I,x,Xが含まれる行を検索。 $ grep -i '[Ix]' file1 UNIX01 UNIX02 Linux01 Linux10 -iオプションは小文字大文字の区別をしない。 例17 0の後に任意の一文字が含まれる行以外を検索。 $ grep -v '0.' file1 Linux10 RedHat10 RedHat11 0の後に任意の一文字が含まれる行以外を検索する。 -vは指定されたパターン以外の行を検索するオプション。 下記のーvを付けなかった場合と比較すると理解しやすいかもしれない。 $ grep '0.' file1 UNIX01 UNIX02 Linux01 例18 .を含む行を検索する。 $ grep -F '.' file1 . -Fオプションは指定された文字列をそのまま検索するため、.をメタキャラクタとして扱わない。 -Fオプションを付けない場合、メタキャラクタとして扱われ 任意の一文字を含む行を検索するため下記のようになる。 $ grep '.' file1 UNIX01 UNIX02 Linux01 Linux10 . RedHat10 RedHat11 ちなみに$fgrep '.' file1でも同じ挙動になる。 終わりに 何か間違いがありましたらご指摘いただけると幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LinuC102 学習(オプション覚えるのしんどい人向け)chageコマンド

はじめに こちらはLinuC102試験合格したい方向けの記事になります。 LinuCとは:https://linuc.org/about/01.html 今回はchageコマンドの複雑なoptionについて下記にまとめました。 特にoption早見表のところ参考になればと思います。 chageコマンド(CHange password AGE) ・chageコマンドはパスワードの有効期限の設定に特化したコマンドで詳細な設定やその表示が可能。 ・パスワードの有効期限に関する情報は「/etc/shadow」ファイルに保存される option早見表 name optionの意味 option内容 -l(L) ls パスの有効期限に関する情報を表示(一般ユーザーも確認可能) -m minimum パスの変更間隔の最短日数を指定(変更できるようになるまでの日数) -M Max パスの有効な最長日数を指定(何日ごとにパスを変更させるか) -I(i) Inactive(非活性) パスの有効期限切れ後にアカウントがロックされるまでの日数を指定 -W Warning パスの有効期限が切れる前に警告を表示する日数を指定 -E Expire(期限切れ) ユーザーアカウントの有効期限を指定(YYYY-MM-DD形式) ※最短で覚えたい人はoptionの意味を覚えると早そう 書式 $ chage [オプション] [days]or[user] //option別指定項目 [-m mindays] [-M maxdays] [-d lastday] [-I inactive] [-E expiredate] [-W warndays][-l user] その他、パスワードの有効期限に関する設定が可能なコマンド 同じようなコマンドとその違いも問題に出そうなので覚えておくといいかも name 概要 chage パスワードの詳細設定、表示が可能 passwd パスワードを変更可能 usermod ユーザーのホームディレクトリやグループ、パスワードなどを変更可能 ※中でもchageコマンドはパスワードの有効期限に特化したコマンドであることは覚えておく 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LinuC102 学習 chageコマンド

はじめに こちらはLinuC102試験学習中の方向けの記事になります。 LinuCとは:https://linuc.org/about/01.html 今回はchageコマンドの複雑なoptionについて下記にまとめました。 特にoption早見表のところ参考になればと思います。 chageコマンド(CHange password AGE) ・chageコマンドはパスワードの有効期限の設定に特化したコマンドで詳細な設定やその表示が可能。 ・パスワードの有効期限に関する情報は「/etc/shadow」ファイルに保存される option早見表 name optionの意味 option内容 -l(L) ls パスの有効期限に関する情報を表示(一般ユーザーも確認可能) -m minimum パスの変更間隔の最短日数を指定(変更できるようになるまでの日数) -M Max パスの有効な最長日数を指定(何日ごとにパスを変更させるか) -I(i) Inactive(非活性) パスの有効期限切れ後にアカウントがロックされるまでの日数を指定 -W Warning パスの有効期限が切れる前に警告を表示する日数を指定 -E Expire(期限切れ) ユーザーアカウントの有効期限を指定(YYYY-MM-DD形式) ※最短で覚えたい人はoptionの意味を覚えると早そう 書式 $ chage [オプション] [days]or[user] //option別指定項目 [-m mindays] [-M maxdays] [-d lastday] [-I inactive] [-E expiredate] [-W warndays][-l user] その他、パスワードの有効期限に関する設定が可能なコマンド 同じようなコマンドとその違いも問題に出そうなので覚えておくといいかも name 概要 chage パスワードの詳細設定、表示が可能 passwd パスワードを変更可能 usermod ユーザーのホームディレクトリやグループ、パスワードなどを変更可能 ※中でもchageコマンドはパスワードの有効期限に特化したコマンドであることは覚えておく 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UNIX[権限]

etc/passwd システムに設定されているユーザーの一覧を確認 $ cat /etc/passwd // passwdに格納されているのでcatで確認 ... ... ... hogehoge:x:1000:10:Linux User,,,:/home/hogehoge:/bin/ash hogehoge = ユーザー名 x = パスワード(システム的に伏せ字) 1000 = ユーザーのID 10 = 所属グループのID Linux = コメント User = ホームディレクトリの位置 /home/hogehoge:/bin/ash = シェルのコマンド 権限の確認 $ touch hoge.html // hoge.html作成 $ ls -l // 詳細確認 -rw-r--r-- 1 hoge wheel 0 Aug 1 10:16 hoge.html -rw-r--r-- について 左から解説 - はファイルの種別。 *- は ファイル。 d であればディレクトリ。 1はシンボリックリンク ※シンボリックリンクとは、シェルコマンドを簡略化する代役的な存在 rw- は、user(ユーザー)のアクセス権限 r-- は、group(グループ)のアクセス権限 r-- は、other(その他)のユーザーのアクセス権限 r,w,x,-について r (read)は読み取り権限 w (write)は書き込み権限 e (execute)は実行権限 - 権限なし 以上のことから内容を読み解くと -rw-r--r-- 1 hoge wheel 0 Aug 1 10:16 hoge.html // hoge(user)には読み書きの権限がある // wheel(group)には読みの権限がある // その他(other)には読みの権限がある 9つのアルファベットで権限を表していることが理解できる chmod(change mode) 権限の管理が行える。 userを u として groupを g として otherを o として allを a として扱い、権限の付与剥奪ができる。 $ ls -l -rw-r--r-- 1 hoge wheel 0 Aug 1 10:16 hoge.html $ chmod a=rwxrwxrwx index.html // 全てに権限付与 $ ls -l -rwxrwxrwx 1 hoge wheel 0 Aug 1 10:16 hoge.html $ chmod g=r,o=r index.html // gとoのみ元に戻す -rwxr--r-- 1 hoge wheel 0 Aug 1 10:17 hoge.html 数値での表現 rwxは左から、 2の3乗、2の2乗、2の1乗で表現可能 よって、全ての権限がある場合は4 + 2 + 1 = 7となる。 $ chmod 777 index.html // 全てに権限付与 $ chmod 612 index.html // これはどのような権限付与? 6ということは、userにはrw 1ということは、groupにはx 2ということは、otherにはw がそれぞれ付与されることになりますね。 sudo rootユーザーの権限を使う ※ルートユーザは管理者権限。何でも出来ちゃうユーザーです。 例えば以下のようにrootにしか読み書きの権限がないファイルが存在するとしたら $ ls -l /hoge/shadow // 詳細確認 -rw-r----- 1 root shadow 454 Aug 1 2021 /hoge/shadow $ cat /hoge/shadow // あなたには読み取り権限はありません!と言われる。 //  どうしても見たいので、sudoコマンドを使う $ sudo cat /hoge/shadow // 情報の読み取りができる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

僕のLinuxコマンド集

LINUXコマンド集(やりたいこと→コマンド) 逐一更新予定 ディレクトリ移動 cd cd [ディレクトリ] ディレクトリの内容を表示 cd ls ファイル・フォルダを移動 mv mv [移動元ファイル] [移動先ファイル] ファイル・フォルダコピー cp cp [移動元ファイル] [移動先ファイル] 画面をリセット clear clear フォルダ作成 mkdir mkdir [フォルダ名] フォルダ削除 rmdir rmdir [フォルダ名] ファイル・フォルダ削除 rm rm [ファイル名] 現在のディレクトリを表示 pwd pwd cat ファイル内容を表示 cat ファイル名 pushd スタックに現在のディレクトリを積んで指定されたディレクトリに移動 pushd [移動先] popd スタックからポップされたディレクトリに移動 popd 検索対象に一致する列を取得 grep grep [検索正規表現] [検索対象ファイル] ファイル編集 vi vi [ファイル名] コマンド定期実行設定 crontab crontab [cron.conf] 定義実行設定ファイル編集(「分 時 日 月 曜日 実行したいコマンド」をファイ ルに) crontab -e
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

linux kernelのフォールトインジェクションする仕組みを確認する

ちょっと早い夏休みだ自由研究をしよう(2日目) TL;DR linux kernelには、fault-injectionの機能がある。有効にするにはKernel configを変更する必要がある。 いくつかの機能については既に実装がある。自作デバイスドライバに当該機能を組み込むことは可能と考える。 (悩ましい)製品搭載時には外した方が無難だろうという気持ちと、いやいやテスト品質担保にはむしろ入れた状態でテストしたなら、そのまま製品に入れるべきだという気持ちで、なかなかに悩ましい。 はじめに 組込デバイス開発をしていると、「これ、ハードウェア側のトラブルをどうやって、ソフトウェアで品質保証すればいいんだ?」と悩む事がしばしばある。 コンパイル時にわざとエラーに分岐するように書き換える、なんてこともできなくともない。これが一番簡単なテストの方法であろう。しかし、それをやると開発バイナリと製品バイナリとで差分が出てしまう。よって、それは本当にテストしたと言えるのか?という哲学的に難しい問題になる。 そういえば、フォールトインジェション、なんていう話もあったなあ、ということでこのあたりについてもう少し調べてみる。 フォールトインジェクションとは? まず用語として、"fault injection" とは直訳するならば "誤りを注入"。である。 wikipediaのフォールトインジェクション にも記載がある通り、大きく分けると2種類ある。 (A)コンパイル時インジェクション (B)ランタイムインジェクション 先ほどの「コンパイル時にわざとエラーに分岐するように書き換える」とは、まさに(A)だろう。それでは(B)の手法をもう少し、調べていく。 Linux Kernelとfault injection Kernelのdocumentにも、fault injectionのページがある。 https://www.kernel.org/doc/html/latest/fault-injection/index.html Linux Kernelのfault injectionは、フィックスターズ 美田晃伸氏が開発した機能である。いくつか紹介記事がある(そして、美田氏資料が一番まとまっていてわかりやすいかもしれない)。 https://xtech.nikkei.com/it/article/COLUMN/20090814/335535/ http://www.linuxfoundation.jp/jp_uploads/seminar20070710/LinuxFaultInjection-2.pdf 実際のmmcコードで確認してみる Kernel documentには、mmc_requestにもfailt injectionできる、という記載がある。 - fail_mmc_request injects MMC data errors on devices permitted by setting debugfs entries under /sys/kernel/debug/mmc0/fail_mmc_request このあたりを深堀していこう。 Kernel Config(FAIL_MMC_REQUEST) config FAIL_MMC_REQUEST は、lib/Kconfig.debug に定義がある。 config FAIL_MMC_REQUEST bool "Fault-injection capability for MMC IO" depends on FAULT_INJECTION_DEBUG_FS && MMC help Provide fault-injection capability for MMC IO. This will make the mmc core return data errors. This is useful to test the error handling in the mmc block device and to test how the mmc host driver handles retries from the block device. MMC IOに対するFault-injection capabitlity. これは、mmc core がdata errorをreturnするようにするものです。 これは、mmc block deviceや、mmc host driverがblock deviceからのリトライのハンドリングに対するテストに有用です。 define the fault attributes failt attributesの定義は、mmc/core/debugfs.c で行われている。 drivers/mmc/core/debugfs.c #ifdef CONFIG_FAIL_MMC_REQUEST static DECLARE_FAULT_ATTR(fail_default_attr); static char *fail_request; module_param(fail_request, charp, 0); #endif /* CONFIG_FAIL_MMC_REQUEST */ boot optionのサポートと、debugfs entriesの追加 boot optionのサポートと、debugfs entriesの追加は、mmc/core/debugfs.c で行われている。 drivers/mmc/core/debugfs.c #ifdef CONFIG_FAIL_MMC_REQUEST if (fail_request) setup_fault_attr(&fail_default_attr, fail_request); host->fail_mmc_request = fail_default_attr; fault_create_debugfs_attr("fail_mmc_request", root, &host->fail_mmc_request); #endif add a hook to insert failures mmc/core/block.c から mmc/core/core.cへ、mmc_start_request()が発行された場合にCONFIG_FAIL_MMC_REQUESTが有効であれば、[最終的にはshould_fail()が呼ばれる]。そうでなければ何もしない。(https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/mmc/core/core.c?h=v5.13.7#n76)。 mmc/core/core.c #ifdef CONFIG_FAIL_MMC_REQUEST /* * Internal function. Inject random data errors. * If mmc_data is NULL no errors are injected. */ static void mmc_should_fail_request(struct mmc_host *host, struct mmc_request *mrq) { struct mmc_command *cmd = mrq->cmd; struct mmc_data *data = mrq->data; static const int data_errors[] = { -ETIMEDOUT, -EILSEQ, -EIO, }; if (!data) return; if ((cmd && cmd->error) || data->error || !should_fail(&host->fail_mmc_request, data->blksz * data->blocks)) return; data->error = data_errors[prandom_u32() % ARRAY_SIZE(data_errors)]; data->bytes_xfered = (prandom_u32() % (data->bytes_xfered >> 9)) << 9; } #else /* CONFIG_FAIL_MMC_REQUEST */ static inline void mmc_should_fail_request(struct mmc_host *host, struct mmc_request *mrq) { } #endif /* CONFIG_FAIL_MMC_REQUEST */ should_fail()の実体は、lib/fault-inject.c にある。 return false の場合は「問題はなかった」。 return trueの場合は「問題が起きた」となることに注意。 should_fail()の第2引数で渡しているデータサイズは、attr->size分だけこれを減算していくという指標になる。例えば、120MiB分だけ処理できたところで止める、ということが多分できる。 /* * This code is stolen from failmalloc-1.0 * http://www.nongnu.org/failmalloc/ */ bool should_fail(struct fault_attr *attr, ssize_t size) { if (in_task()) { unsigned int fail_nth = READ_ONCE(current->fail_nth); if (fail_nth) { fail_nth--; WRITE_ONCE(current->fail_nth, fail_nth); if (!fail_nth) goto fail; return false; } } /* No need to check any other properties if the probability is 0 */ if (attr->probability == 0) return false; if (attr->task_filter && !fail_task(attr, current)) return false; if (atomic_read(&attr->times) == 0) return false; if (atomic_read(&attr->space) > size) { atomic_sub(size, &attr->space); return false; } if (attr->interval > 1) { attr->count++; if (attr->count % attr->interval) return false; } if (attr->probability <= prandom_u32() % 100) return false; if (!fail_stacktrace(attr)) return false; fail: fail_dump(attr); if (atomic_read(&attr->times) != -1) atomic_dec_not_zero(&attr->times); return true; } EXPORT_SYMBOL_GPL(should_fail); ここにきて悩む事 ふとした疑問が湧き出る。開発段階ではこの機能を使ってテストをすることは多いに意味があるだろう。では、製品段階ではこの機能はどうするべきなのか? コンパイル時フォールトインジェクションであれば、当然製品に入れられないので、はずす一択だろう。 ランタイムフォールトインジェクションは、製品に入っていても有効にならなければ実害はない。逆を言えば、有効にできると実害となる。そうなると外すべきか?外さざるべきか?有効にできるような状況になることそのものが問題なのか… と、なかなかに悩ましい。。。 まとめ linux kernelには、fault-injectionの機能がある。有効にするにはKernel configを変更する必要がある。 いくつかの機能については既に実装がある。自作デバイスドライバに当該機能を組み込むことは可能と考える。 (悩ましい)製品搭載時には外した方が無難だろうという気持ちと、いやいやテスト品質担保にはむしろ入れた状態でテストしたなら、そのまま製品に入れるべきだという気持ちで、なかなかに悩ましい。 以上になります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ubuntu環境を新しく作ったときにやること(備忘録・随時更新)

日本語入力 $ sudo apt install fcitx-mozc ホームディレクトリを英語に $ sudo apt install xdg-user-dirs-gtk $ LANG=C xdg-user-dirs-gtk-update 「CapsLock」と「Ctrl」を入れ替える $ sudo vim /etc/default/keyboard 以下の設定を追加 XKBOPTIONS="ctrl:nocaps" プログラミングフォントの導入 ファイルをダウンロード sudo cp MyricaM.TTC /usr/share/fonts/truetype/ fc-cache -fv ESCでIMEをOFFにできるように $ vim ~/.config/fcitx/conf InactivateKey=ESCAPE CTRL_[ Gitの認証情報を安全に保存(パスワードを毎回入力しなくていいように) $ sudo apt-get install libsecret-1-0 libsecret-1-dev $ cd /usr/share/doc/git/contrib/credential/libsecret $ sudo make $ git config --global credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret 参考 https://qiita.com/RayDoe/items/ea945a3b6583d5c01d1e https://xvideos.hatenablog.com/entry/ubuntu_setup https://www.yokoweb.net/2019/08/07/ubuntu-18_04-desktop-caps-ctrl/ https://qiita.com/iberianpig/items/f43afb9d5ec0e2509695 https://qiita.com/Tebasaki314/items/da230ccc9ac891f4ba25
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む