20200830のLinuxに関する記事は10件です。

NIC(eth0)のアドレス部分だけを取得する

 ネットワークのアドレス

ifconfigでipを表示すると複数のNICのipが取得できます。
例えば下記のような感じです。
この中からifconfigでeth0のNICアドレスを取得するにはどうするのかを考えます。

$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.28.99.150  netmask 255.255.240.0  broadcast 172.28.111.255
        inet6 fe80::215:5dff:xxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:90:90:41  txqueuelen 1000  (Ethernet)
        RX packets 742  bytes 149376 (149.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 16  bytes 1216 (1.2 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0のアドレスをgrepする

ifconfigでgerpしてipアドレスだけを取得するには下記のようにします。

ifconfig eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'

ifcongit eth0 で取得したいNICの情報を表示させます。
もし別のNICのIPアドレスが取得したければethXXといった感じでナンバーを指定します。
(これで通じるのだろうか。。。。)
その後パイプで結果を渡して正規表現でgrepしてます。
oはマッチしたとこだけ取るオプションでPはPerl形式の正規表現で、
この組み合わせで行の抽出と切り出しがマッチした部分のができますね。

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

Context Switch(コンテキストスイッチ)とは?

what-is-context-switching-in-operating-system-context-switching-flow.png

Context Switch(コンテキストスイッチ)とは?

コンテキストスイッチ (context switch) とは、複数のプロセスが1つのCPUを共有できるように、CPUの状態(コンテキスト (情報工学))を保存したり復元したりする過程のことである。コンテキストスイッチはマルチタスクオペレーティングシステムに不可欠な機能である。通常コンテキストスイッチは多くの計算機処理を必要とするため、オペレーティングシステムの設計においてはコンテキストスイッチを最適化することが重要である。

※ウィキペディア

  • マルチプロセスの環境でCPUがある一つのプロセスを実行している状態インターラプトリクエストによる次の優先順位のプロセスが実行しなければならないとき、既存のプロセスの状態またはレジスタの値(Context)を保存してCPUが次のプロセスを行えるように新しいプロセスの状態またはレジスタ値(Context)を変える作業をContext Switch(Context Switching)といいます。

Context(コンテキスト)とは?

  • ユーザーと他のユーザー、ユーザーとシステムまたはデバイス間の相互作用に影響を受ける人、場所、オブジェクトなどの現在状況を規定する情報をいいます。

  • AndoroidやServletなのでもContextがあるが、OSでのContextはCPUが該当プロセスを実行するためのプロセス情報です。

  • このContextはプロセスのPCB(Process Control Block)に保存され、Context Switching時にPCBの情報を読み込んで(積載)CPUが前のプロセスがしていた作業を続けて行うことができます。

PCB(Process Control Block)の保存情報

  • プロセス状態

    • 生成
    • 準備
    • 実行
    • 待機
    • 中止
  • プログラムカウンター

    • プロセスが次に実行するアドレス
  • レジスタ

    • アキュムレーター(累算器)
    • スタック
    • 索引レジスター
  • プロセス番号

ちなみにContext Switching時、該当CPUは何もできない。なので頻繁にContext Switchingを行われるとオーバーヘッドが発生し、効率(性能)が落ちます。

Context Switching - Interrupt

InterruptはCPUがプログラムを実行している時、実行中のプログラムの外から例外が発生し、処理が必要な場合
CPUに伝えて例外状況を処理できるようにすることをいいます。

では、なんのInterruptリクエストが来たらContext Switchingが起きるでしょう?
- I/O リクエスト(入出力リクエスト)
- time slice expired (CPU使用時間の満了時)
- fork a child (子プロセスを作成時)
- wait for an interrupt (Interrupt処理を待っている時)

その他にもあるで法けど、詳しいことは省略します。

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

Arch Linuxにデスクトップ環境を導入する(LightDM+Xfce4)

この記事では, Arch Linux にディスプレイマネージャ LightDM と デスクトップ環境 Xfce4 を導入します.
可能な限りシンプルな手続きでデスクトップ環境を起動することを方針とします.

はじめに

ディスプレイマネージャとデスクトップ環境の一般的な話と, 今回導入する LightDM, Xfce4 について触れておきます.

ディスプレイマネージャ

ディスプレイマネージャは, グラフィカルなログイン画面を提供するアプリケーションです.
これを使わなくても, GUI環境にログインすることはできますが, ユーザ, デスクトップ環境の選択が直観的になります.
ディスプレイマネージャに関しては以下を参照のこと(他のディスプレイマネージャの候補の一覧も載っています):
https://wiki.archlinux.org/index.php/Display_manager

この記事では, ディスプレイマネージャとして LightDM をインストールします.
https://wiki.archlinux.jp/index.php/LightDM

デスクトップ環境

Arch Linux はいくつかのデスクトップ環境をサポートしており, gnome や KDE plasma, xfce4 といった好みのデスクトップ環境を導入できます.
また, いくつかのディスプレイマネージャでは, 複数のデスクトップ環境をインストールするとログイン画面からインストールしたデスクトップ環境を選択することができ, 様々なデスクトップ環境を試すことができます.
サポートされるデスクトップ環境については以下を参照のこと(デスクトップ環境の比較もなされています):
https://wiki.archlinux.org/index.php/Desktop_environment

この記事では, デスクトップ環境としてXfce4をインストールします.
https://wiki.archlinux.jp/index.php/Xfce

前提となる環境

Arch Linux がインストールされており, ネットワーク接続の設定が完了していることを前提とします.
また, 一般ユーザの追加と sudo が設定済みであることを前提とした表記をします.
root ユーザで設定しても構いませんが非推奨です.

前回の記事 Arch Linux インストールガイド(UEFIデスクトップ編) - Qiita の続きと考えてもらっても構いません.

必要なパッケージのインストール

必要なパッケージをインストールします.
Arch Linux が提供する公式のパッケージのみで(すなわち, pacman のみを使って)構築することができます.
個々のパッケージをインストールする前にシステムをアップデートしておきます。

$ sudo pacman -Syu

X11 のインストール

X11 をインストール:

$ sudo pacman -S xorg-server

xorg-server がないと, Xfce4はもちろんのことLightDMすら起動することができません.
なお, デスクトップ環境がインストールされていなくても LightDMのインストールと起動まではできますが, ログインができません.

LightDM のインストール

LightDM のインストール:

$ sudo pacman -S lightdm lightdm-gtk-greeter

LightDM の起動には, greeter が必要になります.
greeter には, いくつかの選択肢がありますが, デフォルトでは lightdm-gtk-greeter が設定されており,
lightdm-gtk-greeter をインストールしておけば, 特別な設定なしでLightDMが起動します.

Xfce4 のインストール

Xfce4をインストールします.
公式がサポートするデスクトップ環境には, xfce4 の他に, gnome, kde-plasma, mate, lxqt などがあります.
他のデスクトップ環境をインストールする場合, xfce4 を好みのデスクトップ環境に変えてインストールしてください.

$ sudo pacman -S xfce4

LightDM サービスの起動

systemctl を使って LightDM サービスを有効化します:

$ sudo systemctl enable lightdm.service

.service は省略可能です.

有効化したら再起動します.
再起動後にLightDM が起動しグラフィカルなログイン画面が表示されます.
適当なユーザでログインすると, インストールした Xfce4 が起動されるはずです.

lightdm-gtk-greeter を用いた場合, LightDM の右上にデスクトップ環境の選択メニューが表示されます.
複数のデスクトップ環境をインストールした場合は, ここでデスクトップ環境の選択が可能です.

まとめ

LightDM を用いて, Arch Linux にグラフィカルなログイン画面とデスクトップ環境 Xfce4 を導入しました.
基本的には必要なパッケージをインストールし, LightDM のサービスを有効化するだけでGUI環境の導入が可能です.

LightDM だけでなく, gdm, sddm, lxdm など各デスクトップ環境が提供するディスプレイマネージャに関しても同様の手続きで起動することができます.適当なディスプレイマネージャをインストール後にサービスを有効化することで再起動時にグラフィカルなログイン画面を起動することができます.

LightDM の詳細な設定(greeter やテーマの設定, 仮想コンソールへのログインなど)に関しては, 別の機会に述べようと思います.

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

wslで.lnkの参照先フルパスを取得

インストール (lnkinfo)

$ sudo apt install -y liblnk-utils

実行

$ wslpath -a $(lnkinfo /path/to/src.lnk | grep 'Local path' | sed 's/.*: //')
/mnt/c/path/to/dst
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【備忘録】覚えにくい用語

何回見ても、なんやったっけ?ていう用語を無理やり覚える方法
※個人的な覚え方で、解釈は適当です。

touch【ファイルを作成する】
=>なぜ、ファイルを作成するのにmkfilとかでなくtouchなのか。
元々存在しないファイルは、触れない(touch)できない。ファイルを作成することにより、そのファイルに触れる(touch)できるようになる。

mv【ファイル名を変更する】
=>パスは、コンピューターがファイルにアクセスする住所みたいなもの。
「東京/千代田区/1丁目/ハイツ リナックス」 というファイル(住所)があったとする。

マンション名が「ハイツ リナックス」から 「マックマンション」 に変わったとする。
「東京/千代田区/1丁目/マックマンション」

↑ コンピューターから見たら、ファイル名変更ではなく住所移動に見える。

【比較演算子が =< なのか <=なのか(順番)】
=> イコールが先だと 以上の時 => アロー演算子となってしまう。
だから、イコールが後。

【asc と desc】
ascは A から始まっている。よって通常の並び⇨昇順

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

LinuxでNATルーター

概要

LinuxでNATルーターを構成し、2つのVLANの一方のアドレスをNATし通信させる方法です。
内容は検証目的のため、セキュリティ等一切考慮しておりません。本番運用の際にはご注意ください。

想定シナリオ

以下の2つの組織が運用するVLANが存在するとします。

VLAN1: 192.168.1.0/24
VLAN2: 10.0.0.0/24

ここで VLAN1 の 192.168.1.100 から VLAN2 の 10.0.0.100 にアクセスしたいとします。
VLAN1 側組織は10.0.0.0/24のアドレスが他の用途に利用されているとし、VLAN1側では10.0.0.100のアドレスは192.168.2.100に見えるようにします。
一方VLAN2側では、192.168.1.100 をアドレス変換なくアクセスできるようにします。

設定手順

  1. CentOS 8 をインストールし、VLAN1とVLAN2に接続します。VLAN1をeth1とし、VLAN2をeth2とします。
  2. いろいろと面倒なので、SELinuxは無効化しておきます。/etc/selinux/configSELINUX=disabledにすればよいです。
  3. また、firewalldも無効化しておきます。systemctl disable firewalld
  4. ルーティング機能を有効化します。/etc/sysctl.confnet.ipv4.ip_forward=1を追加してください。
  5. 有効化するため、再起動します。
  6. iptablesでNAT設定を行います。
# iptables -t nat -A POSTROUTING -d 192.168.1.100 -j SNAT --to-source      192.168.2.100
# iptables -t nat -A PREROUTING  -d 192.168.2.100 -j DNAT --to-destination 10.0.0.100

1行目は、宛先が192.168.1.100のパケットを受信した場合に、ソースアドレスを192.168.2.100に変換。
2行目は、宛先が192.168.2.100のパケットを受信した場合に、宛先アドレスを10.0.0.100に変換。PREROUTINGを指定することで、宛先アドレスを変換した後にルーティングされるようにします。
この設定は再起動すると消えてしまうので、起動毎に実行してください。(永続化の方法がわかりませんでした)

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

プロセスを操るコマンド達 〜 プロセスの状態確認、優先度、バックグラウンド実行など

プロセスを操るコマンドを淡々と紹介します。

学習用、LPIC、LinuC対策などでご利用ください。

また、プロセスチーズのことだと思った人はブラウザバックを強く推奨します。

コマンド一覧

Linuxで動いているプログラムのことをプロセスという。

そんなプロセスを扱う以下のコマンドについて利用例と共に紹介する。(カッコで囲んでいるのはおまけ)

コマンド 説明
pgrep ユーザ名、UID、GIDなどを基に実行中のプロセスIDを検索する
top 実行中のプロセスをリアルタイムで表示する
ps プロセスの情報を取得する
pstree 現在動作しているプロセスをツリー形式で表示する
nice プロセスの優先度を変更する
renice 動作中のプロセスの優先度を変更する
jobs 実行中のプロセスを表示する
bg バックグラウンドジョブにする
fg フォアグラウンドジョブにする
kill プロセスにシグナル信号を送る
killall プロセスにシグナル信号を送る
(free) システムの空きメモリと利用メモリの量を表示する

pgrep

ユーザ名、UID、GIDなどを基に実行中のプロセスIDを検索するコマンド

$ pgrep -u root
1
2
3
4
6
...(省略)
$ pgrep -U 0
1
2
3
4
6
...(省略)

-uでユーザー名、-UでUIDを指定することができる

LINUXではrootのUIDは0

top

実行中のプロセスをリアルタイムで表示するコマンド

top - 22:06:29 up 1 day, 16:36,  1 user,  load average: 0.00, 0.02, 0.00
Tasks:  96 total,   1 running,  55 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1002108 total,   150664 free,   517700 used,   333744 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   330584 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                           
17870 mysql     20   0 1309152 319372      0 S  0.7 31.9   6:43.18 mysqld                                            
32132 ubuntu    20   0   44524   3928   3320 R  0.3  0.4   0:00.01 top                                               
    1 root      20   0  159948   6360   3880 S  0.0  0.6   0:04.36 systemd                                           
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd                                          
    3 root       0 -20       0      0      0 I  0.0  0.0   0:00.00 rcu_gp

psをオプションなしで実行すると、現在のシェルから起動したプロセスだけを表示する
自分の環境では遊びで立てていた mysqld や、今実行している top コマンドのプロセスも見ることができる
画面は自動で更新され、CPU使用率の高い順に表示されている
モニタリングは「q」を押すと終了する

「PID」はプロセスID、「USER」はプロセスを実行したユーザー、「%CPU」はCPUを消費している割合、「%MEM」はメモリを消費している割合を意味している。

ps

PS(ProceSs)コマンドはプロセスの情報を取得するコマンド

$ ps
  PID TTY          TIME CMD
31249 pts/0    00:00:00 bash
31348 pts/0    00:00:00 ps

オプションなしの実行をすると、その端末で起動したプロセスの一覧が表示される。
「PID」はプロセスID、「TTY」はプロセスを実行した端末名、「TIME」はプロセスの実行時間、「CMD」は実行コマンドを意味している。
結果より、シェルはbashを利用していることがわかる。

オプション 説明
a 他のユーザーのプロセスも表示する
u ユーザー名も表示する
x 端末から実行された物ではないプロセスも表示する
e カーネル・プロセス以外のすべてのプロセスに関する情報を表示する
f 完全なリストを生成する
o 表示するカラムをカスタムする

アクティブなプロセスを表示する

ps aux

$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.6 159948  6268 ?        Ss   Aug27   0:04 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Aug27   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        I<   Aug27   0:00 [rcu_gp]
...省略...
ubuntu   31248  0.0  0.3 107980  3628 ?        S    14:17   0:00 sshd: ubuntu@pts/0
ubuntu   31249  0.0  0.5  23112  5064 pts/0    Ss   14:17   0:00 -bash
ubuntu   31351  0.0  0.3  40088  3504 pts/0    R+   14:22   0:00 ps aux

ps -efという方法もある

$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Aug27 ?        00:00:04 /sbin/init
root         2     0  0 Aug27 ?        00:00:00 [kthreadd]
root         3     2  0 Aug27 ?        00:00:00 [rcu_gp]
...省略...
ubuntu   31248 31155  0 14:17 ?        00:00:00 sshd: ubuntu@pts/0
ubuntu   31249 31248  0 14:17 pts/0    00:00:00 -bash
ubuntu   31355 31249  0 14:27 pts/0    00:00:00 ps -ef

表示を好きにカスタムしちゃうのもいいね

$ ps -o pid,nice,user,cmd
  PID  NI USER     CMD
 3614   0 ubuntu   -bash
 4341   0 ubuntu   ps -o pid,nice,user,cmd

pstree

現在動作しているプロセスをツリー形式で表示するコマンド

以下はAWSのEC2で実行している例

$ pstree
systemd─┬─accounts-daemon───2*[{accounts-daemon}]
        ├─acpid
        ├─2*[agetty]
        ├─amazon-ssm-agen───8*[{amazon-ssm-agen}]
        ├─atd
        ├─containerd───8*[{containerd}]
        ├─cron
        ├─dbus-daemon
        ├─dockerd───9*[{dockerd}]
        ├─lvmetad
        ├─lxcfs───10*[{lxcfs}]
        ├─mysqld───38*[{mysqld}]
        ├─networkd-dispat───{networkd-dispat}
        ├─polkitd───2*[{polkitd}]
        ├─rsyslogd───3*[{rsyslogd}]
        ├─snapd───8*[{snapd}]
        ├─sshd───sshd───sshd───bash───pstree
        ├─systemd───(sd-pam)
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-network
        ├─systemd-resolve
        ├─systemd-timesyn───{systemd-timesyn}
        ├─systemd-udevd
        └─unattended-upgr───{unattended-upgr}

EC2にアクセスするために必要なsshdからbashが起動し、そのbashからpstreeが実行されているのがわかる

nice

プロセスの優先度を変更する

プロセスの優先度は、-20から19までで-20で定義されていて、低いほど優先度が高い

引数なしで実行すると、優先度は10足される

$ sleep 15 &
[2] 2644
[1]   Done                    nice sleep 15
$ ps -o pid,nice,user,cmd
  PID  NI USER     CMD
 2521   0 ubuntu   -bash
 2644   0 ubuntu   sleep 15
 2645   0 ubuntu   ps -o pid,nice,user,cmd
$ nice sleep 15 &
[1] 2634
$ ps -o pid,nice,user,cmd
  PID  NI USER     CMD
 2521   0 ubuntu   -bash
 2634  10 ubuntu   sleep 15
 2635   0 ubuntu   ps -o pid,nice,user,cmd

renice

実行中のプロセスの優先度を変更する

$ sleep 15 &
[1] 2651
$ ps -o pid,nice,user,cmd
  PID  NI USER     CMD
 2521   0 ubuntu   -bash
 2651   0 ubuntu   sleep 15
 2652   0 ubuntu   ps -o pid,nice,user,cmd
$ renice 10 2651
2651 (process ID) old priority 0, new priority 10
$ ps -o pid,nice,user,cmd
  PID  NI USER     CMD
 2521   0 ubuntu   -bash
 2651  10 ubuntu   sleep 15
 2655   0 ubuntu   ps -o pid,nice,user,cmd

jobs

(バックグラウンド)実行中のジョブを表示する。
ジョブはユーザーから見た処理の単位のことで、ユーザーに見える形のフォアグラウンドジョブと見えない形のバックグラウンドジョブがある。
bgコマンドを前につけるか、実行コマンドの後ろに「&」をつけることで、バックグラウンドジョブにすることができる。

$ sleep 60 &
[1] 3810
$ jobs
[1]+  Running                 sleep 60 &
$ kill -s SIGKILL %1
$ jobs
[1]+  Killed                  sleep 60

[1]%1 はジョブIDと呼ばれ、ユーザーごとに割り当てられる。

bg

バックグラウンドジョブにする

実行中のプログラムでCtrl + zを入力するか、
&をつけて実行してもバックグラウンドジョブになる。

fg

フォアグラウンドジョブにする

bashではフォアグラウンドジョブで動けるのは一つのプログラムだけである

kill

killコマンドを用いるとプロセスにシグナルという信号を送ることができる

シグナルID シグナル名 動作
1 SIGUP 端末の切断による終了
2 SIGINT 割り込みによる終了
9 SIGKILL 強制終了
15 SIGTERM 終了(デフォルト)
18 SIGCONT 再開

SIGTERMだとプログラムの終了処理が実行されるが、SIGKILLはそのまま強制終了される

ちなみに、「Control + c」で終了する時はSIGINTが送信されている

プロセスを終了する

プロセスIDが32147のプロセスを終了させたい時は以下のようにする

$ kill -15 32147

シグナルIDを指定して終了することもできる

$ kill -s SIGTERM 32147

プロセスを強制終了する

シグナルIDを指定して

$ kill -9 32147

シグナル名を指定して

$ kill -s SIGKILL 32147

※ SIGKILLなどは単にKILLとしてもコマンドは有効

killall

プロセス名を指定してプロセスにシグナル信号を送る

同じプログラムを複数実行してもプロセスごとに異なるPIDが割り当てられることになっているが、killallを用いると同じ名前のプロセスをまとめて終了できる

$ vi a.txt &
[1] 3728
$ ps
  PID TTY          TIME CMD
 3614 pts/0    00:00:00 bash
 3728 pts/0    00:00:00 vi
 3732 pts/0    00:00:00 ps
$ killall -15 vi
$ ps
  PID TTY          TIME CMD
 3614 pts/0    00:00:00 bash
 3728 pts/0    00:00:00 vi
 3734 pts/0    00:00:00 ps
$ killall -SIGKILL vi
[1]+  Killed                  vi a.txt
$ ps
  PID TTY          TIME CMD
 3614 pts/0    00:00:00 bash
 3736 pts/0    00:00:00 ps

free

システムの空きメモリと利用メモリの量を表示する

-t オプションと合わせると、物理メモリ、スワップメモリの合計を示す行も表示してくれる

$ free -t
              total        used        free      shared  buff/cache   available
Mem:        1002108      516296      104900         812      380912      331188
Swap:             0           0           0
Total:      1002108      516296      104900

まとめ

プロセスに凝るだけで(少なくとも用語くらいは)カーネルのプログラムを知ることができます。
どのようなプログラムがパソコンで動いているか意識しながら楽しいLinux生活を送りましょう。

一年ぶりのプロセスに関する話題でした。こっちもよろしくね。

プロセスの終了の仕方 ~ top & kill

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

Linux (ディレクトリ・パスについて)

ディレクトリについて、もう少し深く取り下げていきましょう。

下記の画像をご覧下さい。
image.png

簡易的ですが、ディレクトリツリーです。一番上は/(ルートディレクトリ)といいます。
ディレクトリの場所をコマンドで表記する場合に、パスという概念を覚えてください。
例えば、nekoディレクトリから見てimagesのパスは、/neko/date/imagesで表記される事なります。
homeディレクトリから見る場合は、/home/neko/date/imagesで表記されます。

パスは経路と考えてください。nekoからimagesに行く経路・homeからimagesの行く経路。
イメージ先行で行きましょう。

このファイルやディレクトリの経路を表すパスには2種類あります。


  1. 絶対パス

  2. 相対パス



上記の2種類です。絶対パスから紹介しましょう。


絶対パス



/(ルートディレクトリ)を基準にパスを表す方法です。
例えば、nekoの中のdateを表す場合は/home/neko/dateと表記します。

説明だけしてもよく分からないですよね。
mkdirコマンドとcdコマンドを使って、実演しましょう。

まずはmkdirコマンドで、ディレクトリを作成しましょう。
nekoのホームディレクトリ内で、neko-beyaを作成しましょう。

[neko@localhost ~]$ mkdir neko-beya
[neko@localhost ~]$ ls
neko-beya

neko-beyaに移動しましょう。
cdコマンドを使用します。このコマンドはディレクトリの移動に使用します。絶対パスを指定して下さい。

[neko@localhost ~]$ cd /home/neko/neko-beya
[neko@localhost neko-beya]$

~(チルダ)の部分が、neko-beyaに変わっていますか?
ちなみに、~はホームディレクトリを表しています。ログインして最初は、~になっています。


相対パス


ユーザが作業を行っているディレクトリを基準にパスを表記する方法です。
ユーザが作業を行っているディレクトリ=カレントディレクトリと言います。
覚えておいてください。知っている前提で書籍等でも解説される事があります。
例えば、カレントディレクトリがhome/nekoであるとしましょう。
neko-beyaを絶対パスで指定する時は、/home/neko/neko-beyaと表記します。
相対パスで指定する時は、neko-beyaで表記します。
カレントディレクトリがhomeである場合は、neko/neko-byaとなります。

実演しましょう。
pwdコマンドを使うと、カレントディレクトリが分かります。

[neko@localhost ~]$ pwd
/home/neko

/home/nekoがカレントディレクトリですね。neko-beyaに移動しましょう。

[neko@localhost ~]$ cd neko-beya
[neko@localhost neko-beya]$

いけましたか?

以上、


  • mkdir

  • cd

  • pwd

ディレクトリ・パスについてでした。

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

linux のファイルを削除するのに、どんな権限が必要かを調査しました。

linux のファイル権限って難しいですね。
ファイルを削除するのに、どんな権限が必要かを調査しましたので、メモを残します。

まず、使用する検証ツールを作る。

clear_folder.sh
#!/usr/bin/env bash -Ceuo pipefail

for ii in 640 641 642 643 644 645 646 647
do
    rm -rf ${ii}
done
create_folder.sh
#!/usr/bin/env bash -Ceuo pipefail

for ii in 640 641 642 643 644 645 646 647
do
    mkdir -m ${ii} ${ii} && cd ${ii}
    for kk in 640 641 642 643 644 645 646 647
    do
        touch ${kk}
        chmod ${kk} ${kk}
    done
    cd ..
done
check-f.sh
#!/usr/bin/env bash -Ceuo pipefail

for ii in 640 641 642 643 644 645 646 647
do
    for kk in 640 641 642 643 644 645 646 647
    do
        if [[ -f ${ii}/${kk} ]]; then
            echo ${ii}/${kk}
        fi
    done
done
check-rm-f.sh
#!/usr/bin/env bash -Ceuo pipefail

for ii in 640 641 642 643 644 645 646 647
do
    for kk in 640 641 642 643 644 645 646 647
    do
        rm -f ${ii}/${kk} && echo ${ii}/${kk}
    done
done

フォルダとファイルを作る(root)

id
uid=0(root) gid=0(root) groups=0(root)

sh create_folder.sh

ls -al
drwxrwxrwx. 10 root root 199  8月 30 00:00 .
dr-xr-xr-x. 18 root root 235  8月 29 23:19 ..
drw-r-----.  2 root root  94  8月 30 00:00 640
drw-r----x.  2 root root  94  8月 30 00:00 641
drw-r---w-.  2 root root  94  8月 30 00:00 642
drw-r---wx.  2 root root  94  8月 30 00:00 643
drw-r--r--.  2 root root  94  8月 30 00:00 644
drw-r--r-x.  2 root root  94  8月 30 00:00 645
drw-r--rw-.  2 root root  94  8月 30 00:00 646
drw-r--rwx.  2 root root  94  8月 30 00:00 647

find . -type f -ls
52669665    0 -rw-r-----   1 root     root     0  8月 30 00:00 ./640/640
52669666    0 -rw-r----x   1 root     root     0  8月 30 00:00 ./640/641
52669667    0 -rw-r---w-   1 root     root     0  8月 30 00:00 ./640/642
52669669    0 -rw-r---wx   1 root     root     0  8月 30 00:00 ./640/643
52669670    0 -rw-r--r--   1 root     root     0  8月 30 00:00 ./640/644
52669671    0 -rw-r--r-x   1 root     root     0  8月 30 00:00 ./640/645
52669672    0 -rw-r--rw-   1 root     root     0  8月 30 00:00 ./640/646
52669675    0 -rw-r--rwx   1 root     root     0  8月 30 00:00 ./640/647
 1273542    0 -rw-r-----   1 root     root     0  8月 30 00:00 ./641/640
 1273543    0 -rw-r----x   1 root     root     0  8月 30 00:00 ./641/641
 1273544    0 -rw-r---w-   1 root     root     0  8月 30 00:00 ./641/642
 1273545    0 -rw-r---wx   1 root     root     0  8月 30 00:00 ./641/643
 1273546    0 -rw-r--r--   1 root     root     0  8月 30 00:00 ./641/644
 1273547    0 -rw-r--r-x   1 root     root     0  8月 30 00:00 ./641/645
 1273548    0 -rw-r--rw-   1 root     root     0  8月 30 00:00 ./641/646
 1273549    0 -rw-r--rwx   1 root     root     0  8月 30 00:00 ./641/647
17935011    0 -rw-r-----   1 root     root     0  8月 30 00:00 ./642/640
17935012    0 -rw-r----x   1 root     root     0  8月 30 00:00 ./642/641
17935013    0 -rw-r---w-   1 root     root     0  8月 30 00:00 ./642/642
17935014    0 -rw-r---wx   1 root     root     0  8月 30 00:00 ./642/643
17935015    0 -rw-r--r--   1 root     root     0  8月 30 00:00 ./642/644
17935016    0 -rw-r--r-x   1 root     root     0  8月 30 00:00 ./642/645
17935017    0 -rw-r--rw-   1 root     root     0  8月 30 00:00 ./642/646
17935018    0 -rw-r--rwx   1 root     root     0  8月 30 00:00 ./642/647
33755963    0 -rw-r-----   1 root     root     0  8月 30 00:00 ./643/640
33755966    0 -rw-r----x   1 root     root     0  8月 30 00:00 ./643/641
33755967    0 -rw-r---w-   1 root     root     0  8月 30 00:00 ./643/642
33755968    0 -rw-r---wx   1 root     root     0  8月 30 00:00 ./643/643
34138697    0 -rw-r--r--   1 root     root     0  8月 30 00:00 ./643/644
34138698    0 -rw-r--r-x   1 root     root     0  8月 30 00:00 ./643/645
34138699    0 -rw-r--rw-   1 root     root     0  8月 30 00:00 ./643/646
34138700    0 -rw-r--rwx   1 root     root     0  8月 30 00:00 ./643/647
52669678    0 -rw-r-----   1 root     root     0  8月 30 00:00 ./644/640
52669679    0 -rw-r----x   1 root     root     0  8月 30 00:00 ./644/641
52669680    0 -rw-r---w-   1 root     root     0  8月 30 00:00 ./644/642
52669681    0 -rw-r---wx   1 root     root     0  8月 30 00:00 ./644/643
52669682    0 -rw-r--r--   1 root     root     0  8月 30 00:00 ./644/644
52669683    0 -rw-r--r-x   1 root     root     0  8月 30 00:00 ./644/645
52669684    0 -rw-r--rw-   1 root     root     0  8月 30 00:00 ./644/646
52669685    0 -rw-r--rwx   1 root     root     0  8月 30 00:00 ./644/647
 1273551    0 -rw-r-----   1 root     root     0  8月 30 00:00 ./645/640
 1273552    0 -rw-r----x   1 root     root     0  8月 30 00:00 ./645/641
 1273553    0 -rw-r---w-   1 root     root     0  8月 30 00:00 ./645/642
 1273554    0 -rw-r---wx   1 root     root     0  8月 30 00:00 ./645/643
 1273555    0 -rw-r--r--   1 root     root     0  8月 30 00:00 ./645/644
 1273556    0 -rw-r--r-x   1 root     root     0  8月 30 00:00 ./645/645
 1273557    0 -rw-r--rw-   1 root     root     0  8月 30 00:00 ./645/646
 1273558    0 -rw-r--rwx   1 root     root     0  8月 30 00:00 ./645/647
17935020    0 -rw-r-----   1 root     root     0  8月 30 00:00 ./646/640
17935021    0 -rw-r----x   1 root     root     0  8月 30 00:00 ./646/641
17935022    0 -rw-r---w-   1 root     root     0  8月 30 00:00 ./646/642
17935023    0 -rw-r---wx   1 root     root     0  8月 30 00:00 ./646/643
17935024    0 -rw-r--r--   1 root     root     0  8月 30 00:00 ./646/644
17935025    0 -rw-r--r-x   1 root     root     0  8月 30 00:00 ./646/645
17935026    0 -rw-r--rw-   1 root     root     0  8月 30 00:00 ./646/646
17935027    0 -rw-r--rwx   1 root     root     0  8月 30 00:00 ./646/647
34670676    0 -rw-r-----   1 root     root     0  8月 30 00:00 ./647/640
35401047    0 -rw-r----x   1 root     root     0  8月 30 00:00 ./647/641
35401048    0 -rw-r---w-   1 root     root     0  8月 30 00:00 ./647/642
35401051    0 -rw-r---wx   1 root     root     0  8月 30 00:00 ./647/643
35401052    0 -rw-r--r--   1 root     root     0  8月 30 00:00 ./647/644
35401060    0 -rw-r--r-x   1 root     root     0  8月 30 00:00 ./647/645
35401061    0 -rw-r--rw-   1 root     root     0  8月 30 00:00 ./647/646
35401062    0 -rw-r--rwx   1 root     root     0  8月 30 00:00 ./647/647

sh でいつも使用するファイル存在チェック -f を検証(一般ユーザー)

id
uid=1001(koryo) gid=1001(koryo) groups=1001(koryo)

sh check-f.sh
641/640
641/641
641/642
641/643
641/644
641/645
641/646
641/647
643/640
643/641
643/642
643/643
643/644
643/645
643/646
643/647
645/640
645/641
645/642
645/643
645/644
645/645
645/646
645/647
647/640
647/641
647/642
647/643
647/644
647/645
647/646
647/647

よく見ると、641、643、645、647 のフォルダの下のすべてのファイルが存在することになっています。
つまり:

結論1:ファイルのフォルダに、x 権限さえあれば、ファイル存在チェックすることができる。たとえファイル自身に何も権限がなくても。

sh 内で rm を使ってファイルを削除するときはどうなる?(一般ユーザー)

id
uid=1001(koryo) gid=1001(koryo) groups=1001(koryo)

sh check-rm-f.sh
rm: `640/640'   を削除できません:許可がありません
rm: `640/641'   を削除できません:許可がありません
rm: `640/642'   を削除できません:許可がありません
rm: `640/643'   を削除できません:許可がありません
rm: `640/644'   を削除できません:許可がありません
rm: `640/645'   を削除できません:許可がありません
rm: `640/646'   を削除できません:許可がありません
rm: `640/647'   を削除できません:許可がありません
rm: `641/640'   を削除できません:許可がありません
rm: `641/641'   を削除できません:許可がありません
rm: `641/642'   を削除できません:許可がありません
rm: `641/643'   を削除できません:許可がありません
rm: `641/644'   を削除できません:許可がありません
rm: `641/645'   を削除できません:許可がありません
rm: `641/646'   を削除できません:許可がありません
rm: `641/647'   を削除できません:許可がありません
rm: `642/640'   を削除できません:許可がありません
rm: `642/641'   を削除できません:許可がありません
rm: `642/642'   を削除できません:許可がありません
rm: `642/643'   を削除できません:許可がありません
rm: `642/644'   を削除できません:許可がありません
rm: `642/645'   を削除できません:許可がありません
rm: `642/646'   を削除できません:許可がありません
rm: `642/647'   を削除できません:許可がありません
643/640
643/641
643/642
643/643
643/644
643/645
643/646
643/647
rm: `644/640'   を削除できません:許可がありません
rm: `644/641'   を削除できません:許可がありません
rm: `644/642'   を削除できません:許可がありません
rm: `644/643'   を削除できません:許可がありません
rm: `644/644'   を削除できません:許可がありません
rm: `644/645'   を削除できません:許可がありません
rm: `644/646'   を削除できません:許可がありません
rm: `644/647'   を削除できません:許可がありません
rm: `645/640'   を削除できません:許可がありません
rm: `645/641'   を削除できません:許可がありません
rm: `645/642'   を削除できません:許可がありません
rm: `645/643'   を削除できません:許可がありません
rm: `645/644'   を削除できません:許可がありません
rm: `645/645'   を削除できません:許可がありません
rm: `645/646'   を削除できません:許可がありません
rm: `645/647'   を削除できません:許可がありません
rm: `646/640'   を削除できません:許可がありません
rm: `646/641'   を削除できません:許可がありません
rm: `646/642'   を削除できません:許可がありません
rm: `646/643'   を削除できません:許可がありません
rm: `646/644'   を削除できません:許可がありません
rm: `646/645'   を削除できません:許可がありません
rm: `646/646'   を削除できません:許可がありません
rm: `646/647'   を削除できません:許可がありません
647/640
647/641
647/642
647/643
647/644
647/645
647/646
647/647

削除されたのは、以下のファイルたち:(643,647 の下すべてのファイル)
643/640,641,642,643,644,645,646,647
647/640,641,642,643,644,645,646,647

結論2:ファイルのフォルダに、w 権限さえあれば、ファイルに権限がなくても削除することができる。

以上

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

pythonコマンドでpythonはpython3.8を指す

linuxでPythonコマンドを入力するとデフォルトで指すのは/usr/bin/python2.7です。
使いやすいのため、シンボリックリンクを作成して、pythonコマンドはpython3を指す。

健忘症患者のメモ:head_bandage:

#pythonのバージョンを表示
$ python -V
Python 2.7

#元のシンボリックリンクを削除
$ sudo rm -rf /usr/bin/python

#python関連ファイルを検索
$ whereis python
python: /usr/bin/python /usr/bin/python2.7 /usr/bin/python3.6.5 /usr/bin/python3.8.5 

#シンボリックリンクを作成
$ sudo ln -s /usr/bin/python3.8 /usr/bin/python

#pythonのバージョンを表示
$ python -V
Python 3.8.5

pipも同じです~~

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