20210505のLinuxに関する記事は7件です。

setlockしたプロセスを自動で開放したい話

はじめに cronでPythonプロセスの自動起動を実装していたときのこと。 定期的にプロセスが止まっていないか確認しつつ、多重起動は防止するような仕組みを以下のように実装しました。 #!/bin/sh * * * * * setlock -xn /hoge/huga/locklock.lock /usr/bin/python3 /hoge/huga/pypy.py >> /hoge/huga/loglog.log 2>&1 問題発生 ところがここで起こった問題が一つ。 /hoge/huga/pypy.pyが更新される度にプロセスを再起動させたかったのですが、丁度その時にプロセスが起動中だった場合、/hoge/huga/locklock.lockはロックされたままなので再起動ができません。 この時、私が起動させていたPythonプログラムは無限ループで起動し続けるプログラムだったので、/hoge/huga/locklock.lockのロックに阻まれて再起動ができない!というような状況に陥りました。 解決策 再起動前にこんな感じのシェルを実行させることで解決しました。 $ lslocks | grep /hoge/huga/locklock.lock | awk '{ print "kill -9", $2 }' | sh 解説 していることは簡単で、以下のような感じです。 1. lslocksでロックされているファイルを一覧表示 $ lslocks # 出力 # COMMAND PID TYPE SIZE MODE M START END PATH # ... # (unknown) 1234 FLOCK WRITE 0 0 0 /run... # cron 3932 FLOCK 5B WRITE 0 0 0 /run/crond.pid # python3 5432 FLOCK WRITE 0 0 0 /hoge/huga/locklock.lock # ... 2. grepで対象のファイルの行を抽出 $ lslocks | grep /hoge/huga/locklock.lock # 出力 # python3 5432 FLOCK WRITE 0 0 0 /hoge/huga/locklock.lock 3. awkで対象のファイルをロックしているプロセスを削除するコマンドを生成 $ lslocks | grep /hoge/huga/locklock.lock | awk '{ print "kill -9", $2 }' # 出力 # kill -9 5432 4. shで実行 $ lslocks | grep /hoge/huga/locklock.lock | awk '{ print "kill -9", $2 }' | sh おわりに 書くことが思いつかなかったので解決策のシェルを再掲しておきます。 $ lslocks | grep /hoge/huga/locklock.lock | awk '{ print "kill -9", $2 }' | sh
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

~駆け出しのLinux復習~ 「シンボリックリンク」とは何ぞや

駆け出しエンジニアが曖昧なLinuxを再度復習した内容の一部をアウトプットする記事です。 プログラミング学習を始めて初期の頃にLinux標準教科書をやりましたが、その頃は重要性にイマイチ気付いておらず、、、曖昧な部分が多いまま時間が経ってしまいました。 エンジニアを目指す上で、特にデプロイなどでのインフラ整備の際にLinuxは避けて通れないんだと強く感じました。。。 加えてLinuxを扱いこなせるのって「なんか、凄い格好良い」っていう単純な思考の持ち主であるが故、基礎をもう一度叩き込んで成長していこうと思った訳です、、、 「新しいLinuxの教科書」で学習した内容を基にアウトプットしていきます。 シンボリックリンクとは何ぞや リンクとは 「ファイルの別名」にあたる。 ファイルに別名を付けること=リンクを張る ハードリンクとシンボリックリンク リンクには2種類あり、ハードリンクとシンボリックリンクがある。 両者は似て異なるが、主にシンボリックリンクが使用されるらしいので、ハードリンクについては割愛。 ※捕捉を頂きました! 別名を付ける、という観点ではハードリンクとシンボリックリンクで比較すると、シンボリックリンクの方が使われているようですが、 厳密にはリンクとはファイル名とinode番号のつながりのことであり、 そのリンクをディレクトリ上に登録する事をハードリンクと呼ぶようです!(つまりファイルには必ず何かしら名前を付けるので、それ自体もハードリンク。ハードリンクは複数持たせる事が可能なので、別名をつける様な使い方ができる) 詳しくはコメント欄をご覧ください!ハードリンクについて参考にした記事も載せてます! シンボリックリンクとは 「張られたリンク先へのパスが書かれた小さな特殊ファイル」 あくまでパスが書かれているものであるため、本物のファイルとは全く別のもの。(この点でハードリンクと異なります) これだけだとパッとしないですね。 使い方 ln -s [リンク元ファイル] [リンク名] ハードリンクの際は -sオプションをつけないため、sってシンボリックのsかな?と解釈して覚えます。 例えば、カレントディレクトリに $ ls example.html $ cat example.html Hello World! Helloooooooooooooo こんな感じのexample.htmlというファイルがあったとして、このファイルにexampleというリンク名でシンボリックリンクを張ります。 ln -s example.html example lsコマンドで確認してみましょう。 $ ls example example.html #exampleというファイルが作成されている $ ls -l lrwxr-xr-x 1 username staff 12 5 5 19:13 example -> example.html -rw-r--r-- 1 username staff 0 5 5 19:13 example.html 新たにexampleという名前のファイルが作成され、ls -lの出力結果からは、 example -> example.html という感じで「どのファイルを指しているのか」を読み取ることができます。 つまり、exampleと言ったらexample.htmlと言ってるのだと解釈することを意味しています 試しにexampleを使ってみます。 $ cat example Hello World! Helloooooooooooooo このように、example.htmlと言わずとも、リンク名を指示するだけで特定のファイルに辿り着くことができています。 これがシンボリックリンクです。 シンボリックリンクの削除 リンクを削除する際は、通常ファイルを削除するのと同じ様にrmコマンドでOK シンボリックリンクを削除したとしても、これはあくまでパスが書かれた特殊ファイルなので、元のファイルexample.htmlには何の影響もありません。 $ rm example # シンボリックリンクexampleを削除 逆に、シンボリックリンクがある状態で元のexample.htmlが削除されると、シンボリックリンクはリンク先のファイルが見つからないために破損状態になります。 どこで使う 利用用途は様々あるようです。私自身まだ覚えたてなので知らないことも多いかと思いますが、特になるほどと思ったのは、「長いパス名を省略できる」という点です。 例えばRailsのタスク管理アプリケーションが深い階層の中にあったとします。(適当です) home/work/project/rails/todo_app ここまで深くは無かったですが、私自身、ポートフォリオを配置しているディレクトリに毎回移動してrails sとかを起動していました。 この場合、毎回これだけのパス指定してアプリケーションのディレクトリまで行くのって凄く大変ですよね、、、 そんな時にこのシンボリックリンクが役立ちます。 リンクを張ってみましょう。 # ルートディレクトリで $ ln -s home/work/project/rails/todo_app todo_app # todo_appというシンボリックリンク名を張る $ ls -l todo_app #確認してみます lrwxr-xr-x 1 username staff 32 5 5 20:58 todo_app -> home/work/project/rails/todo_app この結果、todo_appと宣言するだけで、それがhome/work/project/rails/todo_appのことであると解釈してくれます。 $ cd todo_app # これだけでルートディレクトリから一発で移動できる! 他にも、バージョン管理のためにも使われるそうです。複数のバージョンが存在するプログラムがあるとして、最新版を常に利用したいとかの場合に、最新版にだけ"latest"というシンボリックリンクを張っておくことで簡単に最新版のプログラムを利用できるようにするというものです。 終わりに シンボリックリンク、便利だな〜と思いました。 凄く簡単な内容ですが、覚えておいて損はないと感じたのでアウトプットすることにしました。 エイリアスっていう言葉がよくプログラミング学習で出てきますが、それと似たようなものです。 「総理」「首相」って言われたら2021年5月現在では殆どの人がパッと「菅総理」を思い浮かべると思いますが、それと近いものですかね・・・? ありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Conkyで円グラフとか簡単に作るconky-drawを紹介してみる。

はじめに デスクトップ環境のLinuxのシステムモニターと言えばConkyですが、GitHubやDeviantart等など、調べるとイケてるウィジェットがいっぱい出てきます。 でも、Linux使ってるんだから、人が作ったものより、自分が作ったやつでデスクトップを飾りたいと思いませんか? 今回紹介するconky-drawは、そんなあなたにおすすめです。 conky_draw 簡単に説明するなら、いっぱいLuaを勉強しなくても、Conkyに円グラフを描写することが出来ます。 GUIも開発されているようですが、私は上手く動かせなかったので割愛します インストール まずは、GitHubからクローンしましょう。 terminal git clone https://github.com/fisadev/conky-draw クローンしてきた物の中にconky_draw.luaとconky_draw_config.luaが有ります。 それらを~/.conkyにコピーしましょう。 terminal cd conky-draw cp *.lua ~/.conky 使用環境により異なりますが、大体はそこに.conkyrcがあるはずです。 .conkyrcのconky.config内に以下を記述します。 .conkyrc lua_load = 'conky_draw.lua', lua_draw_hook_pre = 'main', これでインストールは完了です。 ※今回はconky-drawの紹介なので、.conkyrcの記述は省きます。 詳しくはConky Wikiをご覧下さい。 プロパティ 基本的にconky_draw_config.luaのelements内に書いていきます。 全体的な書き方はGitHubのExamplesを参考にしてください。 ここでは、各プロパティの種類と説明をします。 kindとrequired 最初にkindに描写したい物の種類を設定します。 kind 説明 ring 円を描写します。 ring_graph 円グラフを描写します。conky_valueで指定した変数に応じたグラフになります。 ellipse 楕円を描写します。 ellipse_graph 楕円グラフを描写します。conky_valueで指定した変数に応じたグラフになります。 line 線を描写します。 bar_graph バーグラフを描写します。conky_valueで指定した変数に応じたグラフになります。 static_text 文字を描写します。 variable_text conky内で使える変数を描写します。Conky変数のcpugraphの様な物には対応してません。 描写出来るものは以上になります。描写時に必須のプロパティは以下の表になります。 required kind 説明 from linebar_graphstatic_textvariable_text 描写時の始点{x=?,y=?}の形式で指定 to linebar_graph 描写時の終点{x=?,y=?}の形式で指定 radius ringring_graphellipseellipse_graph 円の半径 center ringring_graphellipseellipse_graph 描写時の中心座標 widthheight ellipseellipse_graph 楕円描写時に、高さと幅を指定して、潰しているイメージ text static_text 文字列 conky_value bar_graphring_graphellipse_graphvariable_text conkyで使用できる変数基本グラフには、パーセンテージを入れる max_value conky_valueにパーセンテージ以外の変動する数値を入れた場合、max_valueに正しく最大値を入れれば、パーセンテージ系の変数を入れた時と同じ振る舞いをします。 が、最大値を取得できるconky変数をmax_valueにセットしても、そこから最大値は取得してくれません。何かしら、一工夫が必要です。 素直に最大値を調べて、max_valueに入れてしまうのが無難ですね。 color 色の設定は、16進数表記のRGBを使用します。このスクリプトでは、0x000000という形で宣言します。 一覧は以下の表になります。 プロパティ kind 説明 color lineringellipsestatic_textvariable_text 文字列の色 background_color bar_graphring_graphellipse_graph グラフの背景部分の色 bar_color bar_graphring_graphellrpse_graph 前景部分の色 thickness 線の厚さの設定になります。 一覧は以下の表になります。 プロパティ kind 説明 thickness lineringellipse 線の厚さ background_thickness bar_graphring_graphellipse_graph 背景部分の線の厚さ bar_thickness bar_graphring_graphellipse_grape 前景部分の線の厚さ alpha 不透明度の設定になります。alpha=0で透明。alpha=1で不透明。alpha=0.5の様に設定してください。 一覧は以下の表になります。 プロパティ kind 説明 alpha lineringellipsestatic_textvariable_text 線や文字の不透明度 background_alpha bar_graphring_graphellipse_graph 背景部分の線の不透明度 bar_alpha bar_graphring_graphellipse_grape 前景部分の線の不透明度 text関連 文字を描写する時に関連するプロパティ一覧は、以下の表になります。 プロパティ 説明 font 描写テキストのフォントデフォルトは"Liberation Sans" font_size 描写テキストのサイズ.conkyrcよりも小さい。詳しくはこちら bold 描写テキストを太文字にする。設定値はBoolean italic 描写テキストをイタリック体(斜体)にする。設定値はBoolean boldやitalicは、ちゃんと対応したフォントのインストールが、必須だと思われます。 また、フォントによっては、極太とか極細みたいな、フォントファミリーがあるかもしれませんが、それらには未対応の様です。 critical_thresholdとchange系プロパティ グラフで一定の値になった時に、グラフの見た目を変えることができます。 critical_thresholdにしきい値を設定し、しきい値以上になったら、change系プロパティに設定した通りの見た目に変わります。 この時の変化は前景背景関係なく全部変わります。 この変化を無効にしたい場合は、max_valueと同じ値にしてください。 change系プロパティの一覧は、以下の表になります。 プロパティ 説明 change_color_on_critical しきい値以上になったら、設定した色に変化します。 change_thickness_on_critical しきい値以上になったら、設定した厚さに変化します。 change_alpha_on_critical しきい値以上になったら、設定した不透明度に変化します。 angle ↑こういう感じの欠けた円を作ります。円関係に使えます。 使用する際は、start_angleとend_angleにそれぞれ角度を、整数で設定してください。 円を東西南北で見た時、角度は以下の表になります。 方角 角度 東 0° 南 90° 西 180° 北 270° デフォルトでは、 start_angle=0, end_angle=360, となっています。 graduation ↑設定すると、線や円の見た目をこんな感じにします。(以下:graduation) このスクリプトを使って円グラフを作るなら、必ずは使ってみたいプロパティですね。 プロパティ 説明 graduated 線や円をgraduationにする場合は、必ずtrueにしてください。 number_graduation 目盛り(graduation)の数 space_between_graduation 目盛り(graduation)の間隔 こういうグラフの名前って正確には何て言うんですかね…… 一応、目盛りとか言ってますけど、graduationで調べても卒業って単語しか出ないんですよね。 ご存知の方がいらっしゃったら、コメントください。 応用編 自分でウィジェット作る時に、覚えておくと便利な物を紹介します。 変数 座標や色など、何度も入力するのは面倒になるはずなので、elementsの上の方に変数を設定しておきます。 conky_draw_config.lua local thickness_size = 15 local center_x = 190 local center_y = 190 local minimum_radius = 50 local ring_increment_size = 18 local bg_color = 0x606060 local bg_alpha = 0.5 local fg_color = 0x006eff local fg_alpha = 0.8 elements{ { kind = 'ring_graph', conky_value = 'cpu cpu8', center = {x = center_x, y = center_y}, thickness = thickness_size, bar_color = fg_color, bar_alpha = fg_alpha, bar_thickness = thickness_size, background_color = bg_color, background_alpha = bg_alpha, background_thickness = thickness_size, radius = minimum_radius + (ring_increment_size * 0), max_value = 100, start_angle = 270, end_angle = 0, graduated = true, number_graduation = 75, angle_between_graduation = 0.5, },{ kind = 'ring_graph', conky_value = 'cpu cpu7', center = {x = center_x, y = center_y}, thickness = thickness_size, bar_color = fg_color, bar_alpha = fg_alpha, bar_thickness = thickness_size, background_color = bg_color, background_alpha = bg_alpha, background_thickness = thickness_size, radius = minimum_radius + (ring_increment_size * 1), max_value = 100, start_angle = 270, end_angle = 0, graduated = true, number_graduation = 75, angle_between_graduation = 0.5, },{ kind = 'ring_graph', conky_value = 'cpu cpu6', center = {x = center_x, y = center_y}, thickness = thickness_size, bar_color = fg_color, bar_alpha = fg_alpha, bar_thickness = thickness_size, background_color = bg_color, background_alpha = bg_alpha, background_thickness = thickness_size, radius = minimum_radius + (ring_increment_size * 2), max_value = 100, start_angle = 270, end_angle = 0, graduated = true, number_graduation = 75, angle_between_graduation = 0.5, },{…… 自分の作ってる奴の一部を抜粋してきました。こんな風に変数使うんだな、くらいに思って貰えれば大丈夫です。 文字サイズ .conkyrc内のconky.textで文字を描写する時と、conky-drawで文字を描写する時とでは、フォントサイズがconk-drawの方が小さいです。 座標で指定できるconky-drawの方が文字を描写する時も便利ですが、多少なりとも、.conkyrcも併用したい時が出てきます。 自分は.conkyrcのフォントサイズに合わせる様に、以下の関数をelementsの上の方に作って使ってます。 conky_draw_config.lua function font_gap(font_size) return font_size * 1.333 end elements{ { kind = 'static_text', from = {x = 100, y = 100}, text = 'test', font_size = font_gap(16), },{……} } 自分の環境で何度か試した結果、conky-drawで描写するテキストを1.333倍すれば、.conkyrcで描写するテキストと同じサイズになりました。1 さいごに 全プロパティの紹介には、骨が折れました。(笑) GitHubのページを翻訳すれば、ある程度は分かる事なのですが、こうやって日本語にしておくだけでも、自分だけのウィジェット開発の参考になるので、こういう形でアウトプットするのも有りだと思いました。 このスクリプト、なかなかの神スクリプトだと思うのですが、開発が2年前で止まっているのが少々残念な所。issuesにもリクエストが幾つか来ているし、伸び代はいっぱいあるんですけどね…… 注釈 自分の環境以外では違うのか、検証できてません。違うよって人が居たら教えてください。 ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(Ubuntu Desktop ビルド編)

はじめに Lima とは Mali-400/450 用のオープンソースなグラフィックドライバです。筆者は Lima を Ultra96/Ultra96-V2 向け Ubuntu 20.04 で試験的に動かしてみました。動かすのに少々苦労したので、その方法を何回かに分けて説明します。 概要編 DRM Lima 編 DRI Lima 編 共有バッファ編 ストライド問題編 インストール編 Ubuntu Desktop ビルド編(この記事) 以下の URL に Ultra96/Ultra96-V2 用に Lima に対応した Ubuntu 20.04 Desktop Root File System を用意しています。 https://github.com/ikwzm/ZynqMP-FPGA-Ubuntu20.04-Lima-Ultra96 この記事では Ubuntu 20.04 Desktop のRoot File System のビルド方法について説明します。 なお、現時点(2021年4月)では、Ubuntu 20.04 の gnome-shell が動作するところまで確認していますが、すべてのアプリケーションで動作を確認したわけでは無いことに注意してください。 概要 Ubuntu 20.04 Desktop の Root File System をビルドするのは一筋縄ではいきませんでした。いろいろ試行錯誤した結果、次のように5ステップに分けてビルドしました。ちょっと面倒くさいです。他に良い方法があれば教えてください。 Ubuntu(18.04) がインストールされたPCでQEMU を動かして、その上で Ubuntu 20.04 の Conole 版(Desktop 無しの CUI オンリー版) をビルドする。 Ultra96 に 1. でビルドした Ubuntu 20.04 Console版をインストールする。 Ubuntu 20.04 Console 版をインストールした Ultra96 上で、DDX Xlnx の Debian パッケージをビルドする。 Ubuntu 20.04 Console 版をインストールした Ultra96 上で、DRI Lima の Debian パッケージをビルドする。 Ubuntu 20.04 Console 版をインストールした Ultra96 上で、1.でビルドした Root File System を展開して chroot し、3.でビルドした Debian パッケージを含む Ubuntu 20.04 Desktop をインストールする。 ぶっちゃけ面倒くさいですが、Ubuntu なので、一度ビルドしてしまえばあとあと楽です。自分でビルドするのが面倒な人は前述の URL からダウンロードしてください。 1. Console 版のビルド ビルド環境の準備 Ubuntu 20.04 Console 版をビルドするためには、QEUM(arm64 版) がインストールされた Linux が必要です。 shell$ apt-get install qemu-user-static debootstrap binfmt-support Linux Kernel 用の Debian パッケージをダウンロードします。 shell$ git clone --depth 1 -b build git://github.com/ikwzm/ZynqMP-FPGA-Ubuntu20.04-Lima-Ultra96.git shell$ cd ZynqMP-FPGA-Ubuntu20.04-Lima-Ultra96 shell$ git lfs pull 環境変数の設定 shell$ export targetdir=ubuntu20.04-console-rootfs shell$ export distro=focal ステージ1 shell$ mkdir $PWD/$targetdir shell$ sudo debootstrap --arch=arm64 --foreign $distro $PWD/$targetdir shell$ sudo cp /usr/bin/qemu-aarch64-static $PWD/$targetdir/usr/bin shell$ sudo cp /etc/resolv.conf $PWD/$targetdir/etc shell$ sudo cp scripts/build-ubuntu20.04-console-rootfs.sh $PWD/$targetdir shell$ sudo cp linux-*.deb $PWD/$targetdir shell$ sudo mount -vt proc proc $PWD/$targetdir/proc shell$ sudo mount -vt devpts devpts -o gid=5,mode=620 $PWD/$targetdir/dev/pts ステージ2 これ以降は QEMU(arm64版) と chroot を使って Root File System を構築します。 shell$ sudo chroot $PWD/$targetdir ここから、次の2種類の方法があります。 build-debian9-rootfs-with-qemu.sh を使って楽々構築 一歩一歩コマンドを打ち込みつつ構築 どちらもやってることは同じなので、ここでは一歩一歩コマンドを打ち込む方法を説明します。  APT の設定 ubuntu20.04-rootfs# distro=focal ubuntu20.04-rootfs# export LANG=C ubuntu20.04-rootfs# /debootstrap/debootstrap --second-stage ubuntu20.04-rootfs# cat <<EOT > /etc/apt/sources.list deb http://ports.ubuntu.com/ubuntu-ports focal main restricted universe multiverse deb-src http://ports.ubuntu.com/ubuntu-ports focal main restricted universe multiverse deb http://ports.ubuntu.com/ubuntu-ports focal-updates main restricted universe multiverse deb-src http://ports.ubuntu.com/ubuntu-ports focal-updates main restricted universe multiverse deb http://ports.ubuntu.com/ubuntu-ports focal-security main restricted universe multiverse deb-src http://ports.ubuntu.com/ubuntu-ports focal-security main restricted universe multiverse EOT ubuntu20.04-rootfs# cat <<EOT > /etc/apt/apt.conf.d/71-no-recommends APT::Install-Recommends "0"; APT::Install-Suggests "0"; EOT  パッケージの更新 ubuntu20.04-rootfs# apt-get -y update ubuntu20.04-rootfs# apt-get -y upgrade  基本的なアプリケーションのインストール ubuntu20.04-rootfs# apt-get install -y locales dialog ubuntu20.04-rootfs# dpkg-reconfigure locales ubuntu20.04-rootfs# apt-get install -y net-tools openssh-server ntpdate resolvconf sudo less hwinfo ntp tcsh zsh file  hostname の設定 ここでは ubuntu-fpga という名前をつけています。ここらへんはお好みに合わせてください。 ubuntu20.04-rootfs# echo ubuntu-fpga > /etc/hostname  root のパスワードの設定 ubuntu20.04-rootfs# passwd ここで rootのパスワードを何にするか聞かれるので適当に admin とか入力してください。 さらに、シリアルポートから root へのログインを許可しておきます。 ubuntu20.04-rootfs# cat <<EOT >> /etc/securetty # Seral Port for Xilinx Zynq ttyPS0 EOT  FPGA ユーザーの追加 ubuntu20.04-rootfs# adduser fpga ここで fpga ユーザーのパスワードを何にするか聞かれるので適当に fpga とか入力してください。 fpga ユーザーに sudo の実行許可を与えます。 ubuntu20.04-rootfs# echo "fpga ALL=(ALL:ALL) ALL" > /etc/sudoers.d/fpga sshd config の設定 ubuntu20.04-rootfs# sed -i -e 's/#PasswordAuthentication/PasswordAuthentication/g' /etc/ssh/sshd_config  Time Zone の設定 ubuntu20.04-rootfs# dpkg-reconfigure tzdata または Time Zone を 非インタラクティブに Asia/Tokyoに設定したい時は次のようにしてください。 ubuntu20.04-rootfs# echo "Asia/Tokyo" > /etc/timezone ubuntu20.04-rootfs# dpkg-reconfigure -f noninteractive tzdata  fstab の設定 ubuntu20.04-rootfs# cat <<EOT > /etc/fstab none /config configfs defaults 0 0 /dev/mmcblk0p1 /mnt/boot auto defaults 0 0 EOT Configuration File System を /config にマウントしておきます。Configuration File System は Device Tree Overlay で使います。  /lib/firmware の設定 ubuntu20.04-rootfs# mkdir /lib/firmware ubuntu20.04-rootfs# mkdir /lib/firmware/ti-connectivity ubuntu20.04-rootfs# mkdir /lib/firmware/mchp  各種アプリケーションのインストール ubuntu20.04-rootfs# apt-get install -y build-essential ubuntu20.04-rootfs# apt-get install -y pkg-config ubuntu20.04-rootfs# apt-get install -y curl ubuntu20.04-rootfs# apt-get install -y git ubuntu20.04-rootfs# curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash ubuntu20.04-rootfs# apt-get install -y git-lfs ubuntu20.04-rootfs# apt-get install -y kmod ubuntu20.04-rootfs# apt-get install -y flex bison ubuntu20.04-rootfs# apt-get install -y u-boot-tools device-tree-compiler ubuntu20.04-rootfs# apt-get install -y libssl-dev ubuntu20.04-rootfs# apt-get install -y socat ubuntu20.04-rootfs# apt-get install -y ruby rake ruby-msgpack ruby-serialport ubuntu20.04-rootfs# apt-get install -y python3 python3-dev python3-setuptools python3-wheel python3-pip python3-numpy ubuntu20.04-rootfs# pip3 install msgpack-rpc-python 必要なアプリケーションはここでインストールします。何をインストールするかはお好みで。  Wireless tools and firmware のインストール Ultra96 は WiFi と Bluetooth を持っています。通常は WiFi でネットワークに接続します。すぐに WiFi と Bluetooth が使えるようにこの段階で必要なパッケージと firmware をインストールしておきます。 ubuntu20.04-rootfs# apt-get install -y wireless-tools ubuntu20.04-rootfs# apt-get install -y wpasupplicant Ultra96 に搭載されている WiFi Chip の firmware を TI のリポジトリからダウンロードして /lib/firmware/ti-connectivity にコピーします。 ubuntu20.04-rootfs# git clone git://git.ti.com/wilink8-wlan/wl18xx_fw.git ubuntu20.04-rootfs# cp wl18xx_fw/wl18xx-fw-4.bin /lib/firmware/ti-connectivity ubuntu20.04-rootfs# rm -rf wl18xx_fw/ Ultra96 に搭載されている Bluetooth Chip の firmware を TI のリポジトリからダウンロードして /lib/firmware/ti-connectivity にコピーします。 ubuntu20.04-rootfs# git clone git://git.ti.com/wilink8-bt/ti-bt-firmware ubuntu20.04-rootfs# cp ti-bt-firmware/TIInit_11.8.32.bts /lib/firmware/ti-connectivity ubuntu20.04-rootfs# rm -rf ti-bt-firmware Ultra96-V2 に搭載されている WiFi Chip の firmware を Microchip のリポジトリからダウンロードして /lib/firmware/mchp にコピーします。 ubuntu20.04-rootfs# git clone git://github.com/linux4wilc/firmware linux4wilc-firmware ubuntu20.04-rootfs# cp linux4wilc-firmware/*.bin /lib/firmware/mchp ubuntu20.04-rootfs# rm -rf linux4wilc-firmware  Network-Manager のインストール ubuntu20.04-rootfs# apt-get install -y network-manager  その他のアプリケーションのインストール ubuntu20.04-rootfs# apt-get install -y samba ubuntu20.04-rootfs# apt-get install -y avahi-daemon ubuntu20.04-rootfs# apt-get install -y haveged  Linux Kernel Module のインストール ubuntu20.04-rootfs# dpkg -i linux-image-5.4.0-xlnx-v2020.2-zynqmp-fpga-lima_5.4.0-xlnx-v2020.2-zynqmp-fpga-lima-1_arm64.deb  Linux Kernel ヘッダーファイルのインストール ubuntu20.04-rootfs# dpkg -i linux-headers-5.4.0-xlnx-v2020.2-zynqmp-fpga-lima_5.4.0-xlnx-v2020.2-zynqmp-fpga-lima-1_arm64.deb  Debian パッケージを /home/fpga/debian に移動 ubuntu20.04-rootfs# mkdir home/fpga/debian ubuntu20.04-rootfs# mv *.deb home/fpga/debian ubuntu20.04-rootfs# chown fpga.fpga -R home/fpga/debian  APT Cache の掃除 APT Cache に大量にダウンロードしたパッケージがキャッシュされていますが、そのままだと Root File System が大きくなるので、掃除して身軽にしておきます。 ubuntu20.04-rootfs# apt-get clean  後始末 ubuntu20.04-rootfs# exit shell$ sudo rm -f $PWD/$targetdir/usr/bin/qemu-aarch64-static shell$ sudo rm -f $PWD/$targetdir/build-ubuntu20.04-console-rootfs.sh shell$ sudo umount $PWD/$targetdir/proc shell$ sudo umount $PWD/$targetdir/dev/pts ubuntu20.04-console-rootfs.tgz のビルド shell$ cd $PWD/$targetdir shell$ sudo tar cfz ../ubuntu20.04-console-rootfs.tgz * 2. Console 版のインストール SD-Card への書き込み 基本的にはインストール編で説明した内容と同じ要領で SD-Card に書き込みます。ただしRootFS Partition には、前章でビルドした ubuntu20.04-console-rootfs.tgz を使用します。 shell# tar xfz ubuntu20.04-console-rootfs.tgz -C /mnt/usb2 システムコンソールをシリアルポートに変更 ディスプレイとキーボードでも作業できますが、シリアルポートを使いたい場合は、uEnv.txt の linux_boot_args_console に "console=ttyPS0,115200" を指定します。 linux_boot_args_console=console=ttyPS0,115200 ネットワークの設定 後述の DDX Xlnx や DRI Lima の Debian パッケージをビルドするためには Ultra96/Ultra96-V2 がインターネットに接続されていなければなりません。ネットワークの設定は nmcli コマンド(Network-Manager の CUI 版)を使って行います。Desktop 版がまだなので GUI 版は使えません。 shell# nmcli device wifi con <SSID> password <password> <SSID> と <password> は各自の環境にあわせて変更してください。 3. DDX Xlnx Debian パッケージのビルド DDX Xlnx は、ZynqMP で DRM(Direct Rendering Manager) Xlnx を動かすための DDX(Device Dependent X) ドライバです。また、共有バッファ編とストライド問題編で説明したような変更が行われています。 ビルド環境の準備 DDX Xlnx をビルドするためには、インターネットに接続している Ubuntu 20.04 がインストールされた ZynqMPが必要です。インストール編で紹介した Ubuntu 20.04 Desktop 版か、前章で紹介した Ubunt20.04 Console版がインストールされた Ultra96/Ultra96-V2 を用意してください。 用意した Ubuntu 20.04(on Ultra96/Ultra96-V2) に、ビルドに必要なパッケージをインストールします。 fpga@ubuntu-fpga:~/work$ apt install libdrm-dev libudev-dev libxext-dev pkg-config x11proto-core-dev x11proto-fonts-dev x11proto-gl-dev x11proto-xf86dri-dev xutils-dev xserver-xorg-dev quilt dh-autoreconf debhelper ダウンロード 共有バッファ編とストライド問題編で説明したような変更を反映した DDX Xlnx のソースコードを https://github.com/ikwzm/xf86-video-armsoc-xilinx からダウンロードします。まだ開発中のため、タグは v1.5-alpha8 のものを使います。 fpga@ubuntu-fpga:~/work$ git clone --branch v1.5-alpha8 https://github.com/ikwzm/xf86-video-armsoc-xilinx fpga@ubuntu-fpga:~/work$ cd xf86-video-armsoc-xilinx Configure と Makefile の生成 fpga@ubuntu-fpga:~/work/xf86-video-armsoc-xilinx$ ./autogen.sh : fpga@ubuntu-fpga:~/work/xf86-video-armsoc-xilinx$ make distclean : Debian パッケージのビルド fpga@ubuntu-fpga:~/work/xf86-video-armsoc-xilinx$ sudo debian/rules binary これで xserver-xorg-video-armsoc-xilinx_1.5-alpha2_arm64.deb ができるはずです。 fpga@ubuntu-fpga:~/work/xf86-video-armsoc-xilinx$ dpkg --info ../xserver-xorg-video-armsoc-xilinx_1.5-alpha2_arm64.deb 4. DRI Lima Debian パッケージのビルド DRI Lima はMesa の DRI(Direct Rendering Infrastructure)ドライバです。DRI Lima 編 で説明したように、DRI Lima は Mesa の DRI ドライバを xlnx に対応するように修正したものです。修正内容に関しては DRI Lima 編 を参照してください。 ビルド環境の準備 Mesa をビルドするためには、インターネットに接続している Ubuntu 20.04 がインストールされた ZynqMPが必要です。インストール編で紹介した Ubuntu 20.04 Desktop 版か、前章で紹介した Ubunt20.04 Console版がインストールされた Ultra96/Ultra96-V2 を用意してください。 用意した Ubuntu 20.04(on Ultra96/Ultra96-V2) に、Mesa のビルドに必要なパッケージをインストールします。 fpga@ubuntu-fpga:~/work$ sudo apt-get build-dep mesa fpga@ubuntu-fpga:~/work$ sudo apt-get install cmake valgrind libunwind-dev libconfig-dev ダウンロード DRI Lima 編 で説明した修正内容は https://github.com/ikwzm/mesa-xlnx にパッチファイルとして提供しています。 fpga@ubuntu-fpga:~/work$ git clone --branch mesa-xlnx-20.2.6 https://github.com/ikwzm/mesa-xlnx fpga@ubuntu-fpga:~/work$ cd mesa-xlnx mesa-xlnx のディレクトリに Mesa のソースコードをダウンロードします。 fpga@ubuntu-fpga:~/work/mesa-xlnx$ apt-get source mesa=20.2.6-0ubuntu0.20.04.1 fpga@ubuntu-fpga:~/work/mesa-xlnx$ cd mesa-20.2.6 ソースコードの修正 DRI Lima 編 で説明した修正内容を Mesa のソースコードに反映します。 fpga@ubuntu-fpga:~/work/mesa-xlnx/mesa-20.2.6$ patch -p1 < ../files/mesa-xlnx-20.2.6.diff Debian パッケージのビルド fpga@ubuntu-fpga:~/work/mesa-xlnx/mesa-20.2.6$ sudo debian/rules binary Mesa のパッケージをまるごと全部ビルドすることになるので、かなりの時間がかかります。ビルドした Debian パッケージ達の中に libgl1-mesa-xlnx-dri_20.2.6-0ubuntu0.20.04.1_arm64.deb が含まれているはずです。これが DRI Lima 「だけ」を含んだ Debian パッケージです。 fpga@ubuntu-fpga:~/work/mesa-xlnx/mesa-20.2.6$ dpkg --info ../libgl1-mesa-xlnx-dri_20.2.6-0ubuntu0.20.04.1_arm64.deb 5. Desktop 版のビルド ビルド環境の準備 Ubuntu 20.04 Desktop 版の Root File System をビルドするためは、インターネットに接続している Ubuntu 20.04 がインストールされた ZynqMPが必要です。インストール編で紹介した Ubuntu 20.04 Desktop 版か、前章で紹介した Ubunt20.04 Console版がインストールされた Ultra96/Ultra96-V2 を用意してください。Ubuntu 20.04 Desktop 版の Root File System をビルドするためは、以下のファイルが必要です。 「1. Console 版のビルド」で作ったubuntu20.04-console-rootfs.tgz 「3. DDX Xlnx Debian パッケージのビルド」で作ったxserver-xorg-video-armsoc-xilinx_1.5-alpha2_arm64.deb 「4. DRI Lima Debian パッケージのビルド」で作った libgl1-mesa-xlnx-dri_20.2.6-0ubuntu0.20.04.1_arm64.deb 環境変数の設定 fpga@ubuntu-fpga:~/work$ export targetdir=ubuntu20.04-rootfs fpga@ubuntu-fpga:~/work$ export distro=focal ステージ1 ubuntu20.04-console-rootfs.tgz を展開し、xserver-xorg-video-armsoc-xilinx_1.5-alpha2_arm64.deb とlibgl1-mesa-xlnx-dri_20.2.6-0ubuntu0.20.04.1_arm64.deb を展開先のディレクトリにコピーしておきます。 fpga@ubuntu-fpga:~/work$ mkdir $PWD/$targetdir fpga@ubuntu-fpga:~/work$ sudo tar xfz ubuntu20.04-console-rootfs.tgz -C $PWD/$targetdir fpga@ubuntu-fpga:~/work$ sudo cp xserver-xorg-video-armsoc-xilinx_1.5-alpha2_arm64.deb $PWD/$targetdir/home/fpga/debian/ fpga@ubuntu-fpga:~/work$ sudo cp libgl1-mesa-xlnx-dri_20.2.6-0ubuntu0.20.04.1_arm64.deb $PWD/$targetdir/home/fpga/debian/ fpga@ubuntu-fpga:~/work$ sudo mount -vt proc proc $PWD/$targetdir/proc fpga@ubuntu-fpga:~/work$ sudo mount -vt devpts devpts -o gid=5,mode=620 $PWD/$targetdir/dev/pts ステージ2 これ以降は chroot を使って Root File System を構築します。 fpga@ubuntu-fpga:~/work$ sudo chroot $PWD/$targetdir  Ubuntu Desktop パッケージのインストール ubuntu20.04-rootfs# apt-get install -y ubuntu-desktop  DDX Xlnx Debian パッケージのインストール ubuntu20.04-rootfs# dpkg -i /home/fpga/debian/xserver-xorg-video-armsoc-xilinx_1.5-alpha8_arm64.deb  DRI Lima Debian パッケージのインストール ubuntu20.04-rootfs# dpkg -i /home/fpga/debian/libgl1-mesa-xlnx-dri_20.2.6-0ubuntu0~20.04.1_arm64.deb  xorg.conf の編集 ubuntu20.04-rootfs# cp cat <<EOT > /etc/X11 Section "Device" Identifier "ZynqMP" Driver "armsoc" Option "DRI" "3" Option "NoFlip" "false" Option "Debug" "false" EndSection Section "Screen" Identifier "DefaultScreen" Device "ZynqMP" EndSection EOT  LightDM のインストール 現状、Gnome 標準の Display Manager は何故か動作しません(現在原因究明中)。そこで LightDM を Display Manager としてインストールします。 ubuntu20.04-rootfs# apt install -y libpam-gnome-keyring libpam-kwallet5 ubuntu20.04-rootfs# apt install -y lightdm lightdm-settings slick-greeter  サスペンドを無効にする 現状、Ultra96/Ultra96-V2 では、一度サスペンドモードに入ると復帰する手段がありません。そのため、Gnome Desktop でサスペンドに入らないようにする必要があります。具体的には次のように systemctl で mask してしまいます。サスペンドモードを無効にする方法は wiki.debian.org/Suspend にありました。 ubuntu20.04-rootfs# systemctl mask sleep.target suspend.target hybrid-sleep.target  Upower Service のワークアラウンド ubuntu20.04-rootfs# sed -i -e 's/PrivateUsers=yes/#PrivateUsers=yes/g' /usr/lib/systemd/system/upower.service ubuntu20.04-rootfs# sed -i -e 's/RestrictNamespaces=yes/#RestrictNamespaces=yes/g' /usr/lib/systemd/system/upower.service  Gtk アプリケーションクラッシュのワークアラウンド Gtk アプリケーションがクラッシュすることがあります。詳細は以下の URL を参照してください。 https://gitlab.gnome.org/GNOME/gdk-pixbuf/-/issues/159 ubuntu20.04-rootfs# update-mime-database /usr/share/mime ubuntu20.04-rootfs# /usr/lib/aarch64-linux-gnu/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders --update-cache  APT Cache の掃除 APT Cache に大量にダウンロードしたパッケージがキャッシュされていますが、そのままだと Root File System が大きくなるので、掃除して身軽にしておきます。 ubuntu20.04-rootfs# apt-get clean  後始末 ubuntu20.04-rootfs# exit fpga@ubuntu-fpga:~/work$ sudo rm -f $PWD/$targetdir/usr/bin/qemu-aarch64-static fpga@ubuntu-fpga:~/work$ sudo umount $PWD/$targetdir/proc fpga@ubuntu-fpga:~/work$ sudo umount $PWD/$targetdir/dev/pts ubuntu20.04-desktop-rootfs.tgz のビルド shell$ cd $PWD/$targetdir shell$ sudo tar cfz ../ubuntu20.04-desktop-rootfs.tgz * 参考 https://github.com/ikwzm/ZynqMP-FPGA-Ubuntu20.04-Lima-Ultra96 https://github.com/ikwzm/mesa-xlnx https://github.com/ikwzm/xf86-video-armsoc-xilinx
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Djangoでカスタムユーザ認証

独自定義のユーザ認証を行いたい場合にみるドキュメント。 自分の中の腹落ち整理もかねて書き残す。 参考 Django の認証方法のカスタマイズ | Django ドキュメント | Django 目次 環境情報 前提 AbstractUser vs AbstractBaseUser 必要なもの 実装例 終わりに 環境情報 os, python, django のバージョン $ cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 10 (buster)" $ python --version Python 3.8.5 $ python -m django --version 3.1.7 前提 AbstractUser vs AbstractBaseUser class use case AbstractUser Djangoがデフォルトで用意しているユーザ情報 + いくつかの追加属性で十分な場合に利用する AbstractBaseUser Djangoがデフォルトで用意しているユーザ情報では不十分な場合に利用する 不十分な場合って? username や email 以外の認証情報を使用したいとか、認証の識別子が重複しているとか、そういった理由がある場合はデフォルトでは不十分になるんだと思われる。 AbstractBaseUser を使うためには合わせて BaseUserManager も実装する必要がある。 Django の認証方法のカスタマイズ | Django ドキュメント | Django ここでいう username はユーザ名というよりかはユーザの識別子としての意味合いだと思われる。 必要なもの 今回はシステムの都合で独自に定義したIDを使って認証を行う方法を選択する。 必要なものは以下の二つ。 AbstractBaseUser を継承した会員情報 - Member クラスとして実装してみる BaseUserManager を継承した Member クラスで認証/認可を行うためのマネージャクラス - MemberManager として実装してみる その他 url や view の設定など 実装例 django-admin startproject sampleapp で作成したプロジェクトを例に書くことにする。 まずは一旦画面を出すため url や view の設定から行うことにする。 自動生成されないファイルやディレクトリは適宜作成する。 ログイン確認用のアプリケーションを作成して $ python manage.py startapp accounts urlなどの設定を追加して sampleapp/settings.py INSTALLED_APPS = [ + 'accounts.apps.AccountsConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] sampleapp/urls.py -from django.urls import path +from django.urls import path, include urlpatterns = [ + path('accounts/', include('accounts.urls')), path('admin/', admin.site.urls), ] accounts/urls.py from django.urls import path from . import views app_name = 'accounts' urlpatterns = [ path('', views.signin, name='login'), ] ログイン画面の 処理 && テンプレート と accounts/views.py from django.shortcuts import render def signin(request): list = {} return render( request, 'accounts/login.html', {'list': list}, ) accounts/templates/accounts/login.html <h1>Login</h1> {% if error_message %} <p><strong style="color: red;">{{ error_message }}</strong></p> {% endif %} <form action="{% url 'accounts:login' %}" method="post"> {% csrf_token %} <label for="member_id">member id</label> <input type="text" name="member_id" id="member_id" value=""> <br> <label for="password">password</label> <input type="password" name="password" id="password" value=""> <br> <input type="submit" value="Login"> </form> ログインに成功したときのテンプレートを追加する accounts/templates/accounts/login_success.html <h1>Login Success</h1> <p>Congratulations! You have successfully logged in</p> これで仮のログイン画面が表示できるはず。 python manage.py runserver して django を起動して、ブラウザから https://localhost:8000/accounts/ などにアクセスしてログイン画面を確認する。 ここまでで意味不明な場合は 公式のチュートリアル あたりをなぞって貰えばわかるはず。 次にモデルを作ってログイン処理を追加する。 今回はメンバーIDとパスワードを認証の要素に指定して使うことにする。 まずは会員を表す Member クラスを AbstractBaseUser を継承させて定義する。 accounts/models.py from django.contrib.auth.base_user import AbstractBaseUser class Member(AbstractBaseUser): member_id = models.CharField(primary_key=True, max_length=8, null=False, unique=True) password = models.CharField(max_length=1024, null=True) last_login = models.DateTimeField(null=True) USERNAME_FIELD = 'member_id' objects = None objects には BaseUserManager を継承した MemberManager を設定するので一旦 None を代入しておく。 次に MemberManager を追記して objects に MemberManager のインスタンスを代入する。 accounts/models.py -from django.contrib.auth.base_user import AbstractBaseUser +from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager +class MemberManager(BaseUserManager): + pass class Member(AbstractBaseUser): member_id = models.CharField(primary_key=True, max_length=8, null=False, unique=True) password = models.CharField(max_length=1024, null=True) last_login = models.DateTimeField(null=True) USERNAME_FIELD = 'member_id' - objects = None + objects = MemberManager() 本来は MemberManager に create_user, create_superuser を定義してユーザを作成するんだろうけど、一旦手動でユーザを作成するので pass にしておく。 ログイン認証用のカスタムユーザモデルを作成したので、認証対象になるよう設定を追加する。 sampleapp/settings.py +# CustomUser +AUTH_USER_MODEL = 'accounts.Member' views のロジックに認証処理を追加する。 GETの場合はそのまま返却して、POSTの場合は認証処理を実行する。 認証に成功した場合はログイン成功ページに遷移させて、認証に失敗した場合はエラーメッセージとともにログイン画面を再表示する。 accounts/views.py from django.shortcuts import render +from django.contrib.auth import authenticate, login, logout def signin(request): - list = {} - return render( - request, - 'accounts/login.html', - {'list': list}, - ) + if request.method == "GET": + return render(request, 'accounts/login.html') + user = None + if request.method == "POST": + member_id = request.POST['member_id'] + password = request.POST['password'] + user = authenticate(request, username=member_id, password=password) + + if user is not None: + login(request, user) + return render(request, 'accounts/login_success.html') + else: + return render(request, 'accounts/login.html', {'error_message': 'login failed'}) 次にユーザ認証をするためにユーザデータを作成する。 $ python manage.py makemigrations $ python manage.py migrate $ python manage.py shell >>> from accounts.models import Member >>> member = Member(member_id=1) >>> member.set_password("1q2w3e") >>> member.save() 先ほどのログイン画面から member_id:1, password:1q2w3e でログインしてみる Congratulations! You have successfully logged in が表示されれば成功。 終わりに 当然もっとDjangoに寄り添って作れば綺麗で簡単にできると思うんだけど、公式ドキュメントを見ながらわかる範囲で寄り道する旅路も悪くはないはず。 非効率の先に高効率が成り立つ場合もきっとある。 おまけに 遭遇したエラーについて Message Manager' object has no attribute 'get_by_natural_key' 原因 モデルクラス内のマネージャを代入しておく objects 変数が空なのでエラーになっている。 対応 モデルの objects 変数に独自で定義したマネージャを代入しておく。 class Employee(AbstractBaseUser): shain_id = models.CharField('社員ID', primary_key=True, max_length=8, null=False, unique=True) # ... last_login = models.DateTimeField('最終ログイン日時', null=True) USERNAME_FIELD = 'shain_id' + objects = EmployeeManager()
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Linux】Linuxコマンドまとめ

Linuxコマンドをまとめたものです。 今後さらに追記予定です。 ls ファイルやディレクトリ名を表示する。 $ ls [オプション] [ディレクトリ(ファイル)] オプション -a 通常のファイル(ディレクトリ)の他にドットファイルも含めて表示 -F 分類記号を付与して表示 -l 最終更新日時やファイル(ディレクトリ)のオーナ、パーミッションなどを表示 -t ファイル(ディレクトリ)をアルファベット順でなく、最終更新日時に従って最終更新された順に表示 -R サブディレクトリ内の全てのファイル(ディレクトリ)も全て表示 -1 一行に一つのエントリを表示 --color=auto ファイルやディレクトリを種類ごとに異なる色で表示 mkdir ディレクトリを作成する。 $ mkdir [ディレクトリ] オプション -m mode 作成するディレクトリのパーミッションをmodeで指定した値にする。 -p 引数に指定したディレクトリのパスが存在しない場合、その中間ディレクトリも含めて新たにディレクトリを作成 (例) # ディレクトリdirを作成 $ mkdir dir # ディレクトリdir1, dir2, dir3をまとめて作成 $ mkdir dir1 dir2 dir3 # カレントディレクトリにディレクトリdir1が存在しない時、dir1とそのサブディレクトリdir2を同時に作成。 $ mkdir -p dir1/dir2 cat ファイルの内容を表示する。 $ cat [オプション] [ファイル...] オプション -n 表示する内容に行番号をつける -b -nオプションと同様に行番号をつけるが、空行をカウントしない -A 全ての制御文字を表示 (例) #ファイルfile1の内容を表示 $ cat file1 #ファイルfile1, file2, file3をつなげて表示 $cat file1 file2 file3 #リダイレクトを利用してfile1とfile2を連結してfile3に保存 $ cat file1 file2 > file3 #標準入力から入力された内容をfile1に書き込む(Control+dで入力を終了) $ cat > file1 cp ファイルをコピーする。 cp [オプション] コピー元ファイル(ディレクトリ)... コピー先ディレクトリ オプション -i 同名のファイルが存在する場合には、上書きするかどうかをユーザに確認する -f -iとは逆に、ユーザに確認せずに全ての上書きを行う -r ディレクトリごとコピー -d シンボリックリンクとハードリンクを、そのままリンクとしてコピー -p 日付、フラグなどのファイル情報を出来る限りそのままにコピー -v コピー元ファイルとコピー先ファイルの名前を表示 -a コピー元ファイルの構成と属性を可能な限り保持してコピー -u 同名のファイルが存在する場合には、コピー元ファイルの方がコピー先ファイルよりも新しい時だけコピー (例) #ファイルfileをディレクトリdirにコピー $ cp file dir #file1, file2, file3を、まとめてディレクトリdirにコピー $ cp file1 file2 file3 dir #ディレクトリdir1をまるごとディレクトリdirにコピー $ cp -r dir1 dir mv ファイルを移動する。 mv [オプション] 移動元ファイル(ディレクトリ)... 移動先ディレクトリ オプション -i 同盟のファイルが存在する場合には上書きするかどうかをユーザに確認 -f -iとは逆に、ユーザに確認せず全ての上書きを行う -v 移動元ファイルと移動先や変更後ファイルの名前を表示 -b ファイルを上書きする場合には、ファイル名の末尾に"~"がついたファイル名でバックアップを作成 -u 同名ファイルが存在する場合には、移動元ファイルの方が移動先ファイルよりも新しいときだけ移動 (例) #ファイルfileをディレクトリdirに移動 $ mv file dir #ファイルfile1, file2, ディレクトリdir1をまとめてディレクトリdirに移動 $ mv file1 file2 dir1 dir rm ファイルを削除する。 rm [オプション] ファイル... オプション -i 削除するかどうかをユーザに確認 -f -iとは逆にユーザに確認せず全て削除 -r ディレクトリを削除 (例) #ファイルfileを削除 $ rm file #ディレクトリdirを削除 $ rm -r dir #file1 file2 file3をまとめて削除 $ rm file1 file2 file3 pwd カレントディレクトリを表示する。 pwd (例) $ pwd cd カレントディレクトリを変更する。 cd ディレクトリ名 (例) #ディレクトリdirへ移動 $ cd dir #ホームディレクトリへ移動 $ cd which, whereis プログラムの存在するパスを表示する。 どこにあるプログラムが実行されるか which [オプション] コマンド名 関連するファイルがどこにあるのか whereis [オプション] コマンド名 clear 端末の表示内容を削除する。 clear & バックグランドで実行する。 コマンド & Ctrl+Z 実行中のプログラムを中断 Ctrl+C 実行中のプログラムを強制終了 jobs 実行中のプログラムを表示する。 jobs [オプション] [ジョブ番号...] オプション -i プロセスIDを表示 ジョブ番号の指定 %%, %+ カレントジョブ %- 以前のジョブ %n n番のジョブ %string コマンド名がstringで始まるジョブ %?string コマンド名にstringが含まれるジョブ fg フォアグランドで実行する。 "&"をつけてバックグランドで実行したプログラムフォアグランドで実行したい場合やCtrl+Zで一旦中断したプログラムを再開したい場合など。 fg [ジョブ番号] (例) #カレントジョブをフォアグランドで実行 $ fg #ジョブ番号2のジョブをフォアグランドで実行 $ fg %2 bg 中断中のプログラムをバックグランドで再開する。 Ctrl+Zなどで一旦中断したプログラムをバックグランドで再開する (例) #カレントジョブをバックグランドで実行する $ bg #ジョブ番号3のジョブをバックグランドで実行 $ bg %3
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linuxコマンドまとめ

Linuxコマンドをまとめたものです。 今後さらに追記予定です。 ls ファイルやディレクトリ名を表示する。 $ ls [オプション] [ディレクトリ(ファイル)] オプション -a 通常のファイル(ディレクトリ)の他にドットファイルも含めて表示 -F 分類記号を付与して表示 -l 最終更新日時やファイル(ディレクトリ)のオーナ、パーミッションなどを表示 -t ファイル(ディレクトリ)をアルファベット順でなく、最終更新日時に従って最終更新された順に表示 -R サブディレクトリ内の全てのファイル(ディレクトリ)も全て表示 -1 一行に一つのエントリを表示 --color=auto ファイルやディレクトリを種類ごとに異なる色で表示 mkdir ディレクトリを作成する。 $ mkdir [ディレクトリ] オプション -m mode 作成するディレクトリのパーミッションをmodeで指定した値にする。 -p 引数に指定したディレクトリのパスが存在しない場合、その中間ディレクトリも含めて新たにディレクトリを作成 (例) # ディレクトリdirを作成 $ mkdir dir # ディレクトリdir1, dir2, dir3をまとめて作成 $ mkdir dir1 dir2 dir3 # カレントディレクトリにディレクトリdir1が存在しない時、dir1とそのサブディレクトリdir2を同時に作成。 $ mkdir -p dir1/dir2 cat ファイルの内容を表示する。 $ cat [オプション] [ファイル...] オプション -n 表示する内容に行番号をつける -b -nオプションと同様に行番号をつけるが、空行をカウントしない -A 全ての制御文字を表示 (例) #ファイルfile1の内容を表示 $ cat file1 #ファイルfile1, file2, file3をつなげて表示 $cat file1 file2 file3 #リダイレクトを利用してfile1とfile2を連結してfile3に保存 $ cat file1 file2 > file3 #標準入力から入力された内容をfile1に書き込む(Control+dで入力を終了) $ cat > file1 cp ファイルをコピーする。 cp [オプション] コピー元ファイル(ディレクトリ)... コピー先ディレクトリ オプション -i 同名のファイルが存在する場合には、上書きするかどうかをユーザに確認する -f -iとは逆に、ユーザに確認せずに全ての上書きを行う -r ディレクトリごとコピー -d シンボリックリンクとハードリンクを、そのままリンクとしてコピー -p 日付、フラグなどのファイル情報を出来る限りそのままにコピー -v コピー元ファイルとコピー先ファイルの名前を表示 -a コピー元ファイルの構成と属性を可能な限り保持してコピー -u 同名のファイルが存在する場合には、コピー元ファイルの方がコピー先ファイルよりも新しい時だけコピー (例) #ファイルfileをディレクトリdirにコピー $ cp file dir #file1, file2, file3を、まとめてディレクトリdirにコピー $ cp file1 file2 file3 dir #ディレクトリdir1をまるごとディレクトリdirにコピー $ cp -r dir1 dir mv ファイルを移動する。 mv [オプション] 移動元ファイル(ディレクトリ)... 移動先ディレクトリ オプション -i 同盟のファイルが存在する場合には上書きするかどうかをユーザに確認 -f -iとは逆に、ユーザに確認せず全ての上書きを行う -v 移動元ファイルと移動先や変更後ファイルの名前を表示 -b ファイルを上書きする場合には、ファイル名の末尾に"~"がついたファイル名でバックアップを作成 -u 同名ファイルが存在する場合には、移動元ファイルの方が移動先ファイルよりも新しいときだけ移動 (例) #ファイルfileをディレクトリdirに移動 $ mv file dir #ファイルfile1, file2, ディレクトリdir1をまとめてディレクトリdirに移動 $ mv file1 file2 dir1 dir rm ファイルを削除する。 rm [オプション] ファイル... オプション -i 削除するかどうかをユーザに確認 -f -iとは逆にユーザに確認せず全て削除 -r ディレクトリを削除 (例) #ファイルfileを削除 $ rm file #ディレクトリdirを削除 $ rm -r dir #file1 file2 file3をまとめて削除 $ rm file1 file2 file3 pwd カレントディレクトリを表示する。 pwd (例) $ pwd cd カレントディレクトリを変更する。 cd ディレクトリ名 (例) #ディレクトリdirへ移動 $ cd dir #ホームディレクトリへ移動 $ cd which, whereis プログラムの存在するパスを表示する。 どこにあるプログラムが実行されるか which [オプション] コマンド名 関連するファイルがどこにあるのか whereis [オプション] コマンド名 clear 端末の表示内容を削除する。 clear & バックグランドで実行する。 コマンド & Ctrl+Z 実行中のプログラムを中断 Ctrl+C 実行中のプログラムを強制終了 jobs 実行中のプログラムを表示する。 jobs [オプション] [ジョブ番号...] オプション -i プロセスIDを表示 ジョブ番号の指定 %%, %+ カレントジョブ %- 以前のジョブ %n n番のジョブ %string コマンド名がstringで始まるジョブ %?string コマンド名にstringが含まれるジョブ fg フォアグランドで実行する。 "&"をつけてバックグランドで実行したプログラムフォアグランドで実行したい場合やCtrl+Zで一旦中断したプログラムを再開したい場合など。 fg [ジョブ番号] (例) #カレントジョブをフォアグランドで実行 $ fg #ジョブ番号2のジョブをフォアグランドで実行 $ fg %2 bg 中断中のプログラムをバックグランドで再開する。 Ctrl+Zなどで一旦中断したプログラムをバックグランドで再開する (例) #カレントジョブをバックグランドで実行する $ bg #ジョブ番号3のジョブをバックグランドで実行 $ bg %3
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む