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

SSHのパスワード認証を停止して完全に鍵認証に切り換える

前回の記事ではSSH接続に必要な公開鍵と秘密鍵の生成方法を書きました。

最後に、パスワード認証を停止する方法を紹介します。
これにより、誰もパスワード認証でSSH接続を開始できなくなり、代わりに公開鍵・秘密鍵の認証のみでSSH接続を開始できるようになります。

MainPC
$ sudo vi /etc/ssh/sshd_config

上記を打つと、sshについていの設定ファイルをvimで編集します。
vimで以下を検索します。

MainPC
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no

上記の部分のyesとnoをいじるだけなんですけども....
意外な落とし穴で、デフォルト状態では上から2つのコマンドはコメントアウト(#~)でなっています。
これだといくらyesやnoに変えても設定項目として反映されません笑
必ず、#を外して値を変更・保存してください。

さ、あとはsshシステムを再起動します。

MainPC
$ sudo systemctl restart sshd

これで、以前の記事をもう一度試してください。
おそらくパスワード認証はオフになっています。

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

セキュリティリスクを回避しながらSSH接続する

前回の記事では、パスワードを使った最も簡単な接続を紹介しました。
次はもう少しセキュリティを高めた方法を紹介します。
前回同様、会社のデスクトップパソコン(Main PC)を社内のどこからでも自分のノートPC(My PC)で接続できるようにします。

サーバー:Main PC
クライアント:My PC

open-sshと付属のパッケージをインストールします。こちらは以前の記事を御覧ください。

まず、セキュリティを高めるために、SSH接続では「秘密鍵」と「公開鍵」ファイルを理解しましょう。
これら「鍵」はSSH接続を開始し、~通信内容を暗号化・復号化するためにつかわれるものです。
例えば、自分のノートPC(My PC)から会社のデスクトップPC(Main PC)をSSH接続で操作するときにパスワードを使ってログインしていると、自分以外の誰かが操作できる可能性がでてきます。また、SSH接続の内容を他人が読み取る可能性もあります。
そこで、通信接続をはじめる際にパスワードを用いないで2台のPCを接続し、更に2台のPC間の通信内容を暗号化し、2台のPC間でしか復号化できないようにする事を実現したものが上記の2つの「鍵」です。

実際のSSH接続では、My PCで2つの鍵を生成し、そのうちの「公開鍵」をMain PCに登録します。My PCでは「秘密鍵」を使って通信を暗号化します。この暗号化した通信をMain PCは受け取り、公開鍵で復号化します。

では、「秘密鍵」と「公開鍵」を作成しましょう。こちらからはMy PC(自分のノートPC)で操作します。

MyPC
$ ssh-keygen -b 2048

上記を打つと、どこに2つの鍵を生成するか聞かれます。デフォルトの~/.sshで良いと思います。
次に上記の鍵を実際に鍵として使うためのパスワードを求められます。
このパスワードは忘れないでください。
(簡単にいうと、2つの鍵のうち秘密鍵はパスワードでしか開かない封筒に入れられてる状態で生成されるためです。実際に接続するときにはこのパスワードを一度いれて封筒から秘密鍵を取り出さないと使えません。)

次に、鍵が生成されたか確認しましょう

MyPC
$ ls ~/.ssh
id_rsa id_rsa.pub

鍵の生成場所は今回、~/.ssh (/home/user/.ssh)ですので、そこのファイルをlsで表示させます。
すると2つのファイルがあると思います。

id_rsa=秘密鍵
id_rsa.pub=公開鍵(pub=publication)

できました!!!!

それでは、この公開鍵をMain PCに持ってけばいいんですが、どこに置くか、どうやって持っていけばいいのか....面倒な人は以下を実行すれば勝手に公開鍵をMain PCに登録してくれます。

MyPC
$ cd ~/.ssh #1
$ ssh-copy-id -i id_rsa.pub user@192.168.1.1 #2
  (ssh-copy-id -i 公開鍵名(パスの指定もできます) Main PC(サーバー)のユーザー名@Main PCのIP)

#1で公開鍵の保存場所に移動します。
#2で~/.sshのid_rsa.pubを公開鍵に指定して、サーバー(Main PC)に送信しています。
サーバー(Main PC)のユーザー名やIPアドレスの調べ方は、以前の記事でお書きしていますので、そちらを参照ください。
実行するとMain PCのログインパスワードを聞かれますので入力してください

これで、My PCの公開鍵がMain PCに登録されました。

さて、後は接続です。
これまた結構簡単です。

$ cd ~/.ssh
$ ssh -I id_rsa(パスの指定でもOK:~/.ssh/id_rsa) user@192.168.1.1

あれ?パスワード聞かれる....意味ないんじゃ?
そうです。このパスワード認証をオフにしましょう。
次回の記事で書きます!!

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

Lenovo IdeaPad Duet ChromebookにVScodeをインストールする

Lenovo IdeaPad Duet Chromebook にVScodeの公式サイトのファイルを使ってインストールできなかったので、コミュニティビルド版サイトからインストールしました。起動確認済みです。

Lenovo IdeaPad Duet Chromebook

2020年6月に出た製品なのでまだ情報が少なかったのですが、たぶんVScodeも入るでしょーというノリで購入した経緯となります。

プロセッサが Media Tek Helio P60Tプロセッサ(2.00GHz) となっております

試してみたこと

全部失敗しました。成功した方法は次の項をご覧ください。

  • 公式サイトからインストールした.deb パッケージを マイファイル > ダウンロード より実行

    インストール中にエラーが発生しました というメッセージが出て失敗する

  • sudo apt install .debファイル をターミナルで実行

    → こちらも失敗。たぶん同じ理由だと思います。
    以下のようなエラーが出ました。

Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 code:amd64 : Depends: libnss3:amd64 (>= 2:3.26) but it is not installable
              Depends: apt:amd64 but it is not installable
              Depends: libxkbfile1:amd64 but it is not installable
              Depends: libsecret-1-0:amd64 but it is not installable
              Depends: libgtk-3-0:amd64 (>= 3.10.0) but it is not installable
              Depends: libxss1:amd64 but it is not installable
E: Unable to correct problems, you have held broken packages.

プロセッサがMedia Tekであることが関係しているのかなと思います。

ARMのプロセッサをベースにしているみたいですけど、ちょっと仕様が違うのでしょう。

  • Snapを経由する
    → Snapを使ってインストールをした経験がないので手順が定かではありませんが、みなさんのインストール手順をみようみまねでやったものの、インストールできず。

成功した方法

こちらの記事にてコミュニティビルド版というものの存在を知りました。

Community builds of Visual Studio Code

VScodeをマイナーなプラットフォーム向けに有志で調整してくれているみたいです。

公式のレポジトリが更新されるたびに、コミュニティビルド版もパッケージを更新しているようです。(公式がアップデートされる都度インストールしなおせばよいのでしょうか?未確認です)

FAQによると、拡張機能も偏ったプロセッサにのみ対応でなければたぶん動く!って書いてあります。

インストール方法

Chrome OSNative methodthe Release pageからバージョンを選び .deb 形式のパッケージをダウンロード。

ファイルを実行するとインストールが成功しました。

ちなみに私が試したとき最新パッケージをインストールしたのですが、拡張機能がインストールできなかったので、1つ古いバージョンをインストールしなおしたところ、拡張機能も無事にインストールができました。
なにかのバグかもしれません。

(インストール後に日本語入力できないって焦りましたが、Linuxに日本語入力が設定されていないためでした。そちらはまた別途)

まとめ

Lenovo IdeaPad Duet ChromebookにVScodeをインストールしたくて失敗した3つの方法と、コミュニティビルド版をインストールする手順を示しました。

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

mmap(2)したファイルは、いつ更新されるのか (1)

みんな大好きmmap(2)を使って、ファイルを仮想メモリ空間にMAP_SHAREDでマップすると、そのメモリへの書き込みがファイルに反映される。このメモリへの書き込み、いつ誰がどうやって検出しているのだろう。

仮想記憶とMMU

mmap(2)の機構、CPUの機能から考えると、大体2つの仕組みが考えられる。その前に、OSの動き、CPUの機能について簡単に説明しておく。

OSの重要な役割の一つは、各タスク (Unix系の用語ではプロセス) に独立の仮想メモリ空間を与えることである。あるプロセスの100番地には、(指定なき場合) 別のプロセスの100番地とは別な物理メモリが割り当てられる。PCやサーバ、スマートフォンなど、フルのLinuxの動作するようなCPUにおいて、仮想メモリ空間と物理メモリ空間のマッピングを行うハードウェアがMMU (Memory Management Unit) である。現在の多くのCPUは、MMUを内蔵しているが、かつてはCPUの近くに外付けされることもあった。Linuxは、メモリをあるサイズのページに分けて管理するページング型のMMUを前提としている。

x86_64やARM、Powerなど、現在主流の多くのCPUでは、原則ページのサイズは4KiBである。4KiBは12bitであるから、64bitの仮想メモリアドレスは、下位12bitのページオフセットと、上位52bitの仮想メモリ空間のページ番号 (仮想ページ番号) で表すことができる。

pt.png

MMUは、メモリ上に置かれたページテーブルという表を使って、仮想メモリ空間のページを物理メモリ空間のページに変換する。ページテーブルは、仮想ページ番号をインデックスとする配列といえる。実際には仮想メモリ空間は疎に使われることを利用して、多段階 (x86-64では4〜5段) にすることで、ページテーブルのサイズを圧縮している。またx86-64では64bitのうち実際には48bitしか使われていない。x86-64のページテーブルの各エントリ (PTE: Page Table Entry) は、64bitの幅を持ち、上位側に物理ページ番号 (PFN: Page Frame Number)、下位12bitにはページに関する各種情報をビットマップで持つ。本稿で重要なのは、下位側にある情報である。x86-64では以下のような情報を持つが、他のアーキテクチャでも (名前こそ違え) 同じような情報を持つ。

  • P (Present) bit: 1にセットされているとき、当該仮想ページに対応する物理ページが存在する (マップされている) ことを示す。P bitが0にクリアされている場合、物理的にメモリが割り当てられていないため、この仮想ページへのアクセスはページフォルトとなる。余談であるが、x86においては、P bitがクリアされているときも、上位bitで表されるPFNに対応する物理メモリが投機的にアクセスされてしまうことがあるのが、L1TF脆弱性である。P bitがクリアされているとき上位にOSが使用する情報を格納することは仕様上許されており、Linuxではswap領域内の位置の情報などを格納することがある。

  • D (Dirty) bit: 当該仮想ページに書き込みアクセスがあると、CPUによって自動的にセットされる。自動的にクリアされることはないので、クリアするのはOSの役割である。

  • A (Accessed) bit: 当該ページにアクセスがあると、CPUによって自動的にセットされる。自動的にクリアされることはないので、クリアするのはOSの役割である。

  • R/W (Read/Write) bit: クリアされている時、当該ページはリードオンリーとなり、書き込みは許されない。

pte.png
(出典: Intel® 64 and IA-32 Architectures Software Developer Manual Volume 3A)

プロセスがP bitがクリアされているページにアクセスしようとすると、ページフォルト (x86用語では#PF) という例外がOSに通知される。OSは、#PFを受けてページテーブルを適当に書き換え、プロセスの実行を再開してもよいし、不正メモリアクセス (Unix系OSでは典型的にはsegmentation faultシグナル) としてエラーにしてもよい。プロセスがR/W bitがクリアされているページに書き込みしようとしたときにもOSに#PF (write fault) が通知され、同様にページテーブルを適当に書き換え、プロセスの実行を再開しても良いし、エラーにしてもよい。

DとAは「CPUが変更することがある」というのが大きな特徴である。ページテーブルの他の部分をCPUが変更する事はなく、OSのみが変更する。またD、AともCPUは0から1にすることはあっても、逆に1から0にクリアすることはない。

ページキャッシュとキャッシュの書き出し

LinuxなどたいていのUnix系OSでは、ストレージのデータをメモリにキャッシュしているが、これはページ単位で行なわれるため、ページキャッシュと呼ばれる。ファイルのmmapは、このページキャッシュを仮想メモリ空間にマップすることで実現される。通常のwrite(2) (pwrite(2)、writev(2)などを含む) では、書き出しに先立ってページキャッシュを作成し (つまり、ストレージからページ全体の内容を読み出して)、このページキャッシュを書き換える。write(2)などのとき、OSはページキャッシュが書き換えられてストレージ上の原本との整合性が失われたことが把握できる。原本との整合性が失われたページのことをダーティページと呼ぶが、ダーティページは適切なタイミングでストレージに書き出され、原本と同じ状態、すなわちクリーンなページとなる。Linuxで、この書き出しを担当するのがかつてのbdflush、pdflush、最近のbdi flusherで、SIer各社秘伝のタレと化しているsysctlのチューニングパラメータ vm.dirty_ratioとかそのへんは、このbdi flusherの動作を変えるものである。

mmapの場合は事情が難しくなる。プロセスはファイルをmmapした領域を含め、メモリに勝手に書き込む。いつどこに書き込んだかは、普通にはOS (カーネル) からわからないわけだ。なんらかの方法で、プロセスがmmapされた領域に書いたこと、またどのページに書いたかを検出して、そのページをダーティとしなければならない。

余談だが、かつての実装の中には、mmap(2)はページキャッシュを使うものの、write(2)などでは別に用意されたバッファキャッシュという機構を使うものがあり、2つのキャッシュの間で余計なコピーが発生するとか、mmap(2)とwrite(2)などを同時並行的に使うとファイルの内容が壊れるなどといった問題があるものもあった (Linux-2.2まで、NetBSD-1.5までなど)。現在ではwrite(2)などにもページキャッシュを使うよう改良されており、このような問題は発生しない。

mmap域への書き込みの検出

先に書いたMMUの機能を踏まえると、mmap域への書き込みの補足方法として、2種類のやり方が考えられると思う。

  1. PTEのD bitがセットされているものを探し出してダーティとする。ストレージに書き出すときにD bitをクリアする。
    1a. 全てのページテーブル (全てのプロセスの仮想空間に対応する) をスキャンして探す。
    1b. 全ての物理ページに対して、それを指すPTEを調べて探す。

  2. R/W bitをクリアしておき、発生した#PF (write fault) を捉えてそのページをダーティとすると同時にR/W bitをセットしてプロセスを再開させる。ストレージに書き出す時にR/W bitをクリアする。

ページテーブルの調査は実はすでに行っていて、A bitを見ている。ページキャッシュは、長い間使われないと解放される (しないとメモリがいっぱいになってしまう) が、その「長い間使われていない」判定に使われる。これを、ページ置換アルゴリズムという。

たとえば、以下のようなアルゴリズムで解放するキャッシュを決める。まず、ページキャッシュに使われているページを全てリストに登録しておく。新たにページキャッシュとして確保されたページは、リストの末尾に追加していく。空きメモリが足りなくなってくると、このリストを先頭からスキャンし、ページを参照しているPTEのA bitを調べる。クリアされたままのページは、しばらく利用されていないと考えられるため、解放するが、セットされていれば、リストの末尾に移動する。これにより、リストは先頭付近が最近の利用頻度が低いページ、末尾付近がよく利用されているページに並んでくると考えられる (LRU: Least Recently Used順)。ここではページキャッシュについて書いたが、匿名メモリでも同様の処理をすることによって、swap領域に退避するページを決定することができる。

実際には、リストから外した後inactiveと呼ばれる別なリストに登録し、解放をしばらく待つことが一般的だ。最初に説明したリストをactiveリストと呼び、active、inactive、空きの比率を一定割合に保つようにする。また、上記を素朴に実装すると、スキャンが大きく偏るため、全体を効率よく公平にスキャンするための工夫もなされる。そのほか、スキャンはいつどういう条件で実行するか、とか、どれくらいのページを移動するか、とか、ページキャッシュと匿名メモリをどれくらい同様な、あるいは異なったあつかいにするか、などOSやバージョンによって細かな違いがあるが、大まかな動作はこんな感じだ。

mmapに話を戻す。1aのやり方 (仮に、ページテーブルスキャン方式と呼ぶ) は、PTEの調査をストレートに実行するものだ。D bitとA bitを同時に調査できる。複数の仮想空間からマップされている領域 (実行ファイルや共有ライブラリなど) は、使用中の全メモリを一周する間に複数回調べられることになる。

1bのやり方 (仮に、物理ページスキャン方式と呼ぶ) は、物理ページから、それをマップしている仮想空間、仮想アドレスを調べる方法が必要となる。A bitも同時に調査できるため、使用中の全物理ページを辿るには、先ほどのactive/inactiveリストを利用することができる。利用頻度に応じたスキャンの最適化はできそうだ。

1aにしても、1bにしても、一定の期間の間に使用中の全ページを調査する必要がある。さもないと、ダーティとなったページが長期間にわたって検出できなくなってしまう。ただ、1aの場合には、プロセススケジューラと連携して、最近スケジュールされていないプロセスの仮想空間のスキャンはスキップする、といった最適化は考えられる。

2つ目のやり方 (仮に、write fault捕捉方式と呼ぶ) では、#PFの処理が重いのではないかという点が問題になると思われる。あまりwrite faultが頻発すると、そのプロセスの実行が遅くなる可能性がある。メモリの近隣の領域にはまとまったアクセスがあることが知られているが (アクセスの局所性)、一度write faultが発生してR/W bitをセットした後しばらくページをダーティのままにしておき、書き出しの直前にR/W bitをクリアする、というようなことで、複数回のメモリ書き込みをまとめてストレージに書き出すような工夫などで軽減する必要がある。一方で、ダーティになる瞬間を捉えることができるため、ダーティとなった30秒後にストレージに書き出す (書き出し始める) ことを保証する、とか、ダーティページの数を一定以内に保つ、といったことが実現するのが容易になる。

長くなったので本稿はここまで。実際に幾つかのOSSのOSのソースコードを調べてみたところ、実際に1bの物理ページスキャン方式と、2のwrite fault捕捉方式については利用しているOSが見つかったので、次稿で紹介したい。

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

[LVM] パーティションを追加せずに仮想ディスクを拡張する

1.TL;DR

VMwareやKVMのハイパーバイザー環境にRHEL/CentOSをインストールするとデフォルトではLVM(論理ボリューム管理)となってしまいます。仮想ディスクを増やそうとすると、ハイパーバイザー環境で仮想ディスクをサイズを増やした後に、通常はパーティションを追加する事になります。パーティションは基本パーティションを最大4つまでしか作成できません(拡張パーティションを使えば更に増やせますが、ここでは割愛します)。ディスクサイズを増やすたびに、パーティションを追加するのはイマイチなので、別の方法を試しました。
LVMこっちじゃない.png

パーティションのサイズを増やして、最終的にOSが認識する論理ボリュームサイズを増やした。

2.作業の流れ

  • 仮想ディスクのサイズ拡張
  • パーティションのサイズ拡張
  • 物理ボリュームのサイズ拡張
  • 論理ボリュームのサイズ拡張

LVMの説明.png

この作業は最悪仮想マシンを壊してしまう可能性がある作業です。自己責任にて行ってください。

前提となる環境

  • ハイパーバイザー(物理マシン):CentOS 7.8.2003のKVM
  • 仮想マシン:CentOS 7.8.2003

3.変更前の状態

ディスク拡張前の状態を確認しておきます。
最初にハイパーバイザー側から見える情報です。
仮想ディスクのサイズは24GBと認識されています。実際に確保されているサイズは12GBです。

[root@hypervisor images]# qemu-img info vm1.img 
image: vm1.img
file format: qcow2
virtual size: 24G (25769803776 bytes)
disk size: 12G
cluster_size: 65536
Format specific information:
    compat: 0.10

次に仮想マシン内部から見える情報です。
拡張対象の2つ目のパーティションは24.7GBです。

[root@vm1 ~]# parted /dev/vda print
モデル: Virtio Block Device (virtblk)
ディスク /dev/vda: 25.8GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ: 

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  1075MB  1074MB  primary  xfs               boot
 2    1075MB  25.8GB  24.7GB  primary                    lvm

ファイルシステムを確認します。
ルートのパーティション /dev/mapper/cl_centos7template-root は 22GB です。

[root@vm1 ~]# df -h
ファイルシス                        サイズ  使用  残り 使用% マウント位置
:
/dev/mapper/cl_centos7template-root    22G  7.4G   15G   35% /
/dev/vda1                            1014M  245M  770M   25% /boot
:

4.仮想ディスクのサイズ拡張

ハイパーバイザのサーバへrootでログインして行います。
仮想ディスクを増やす前に仮想マシンはシャットダウンしておきましょう。

qemu-img resizeコマンドで10GB 増やします。

[root@hypervisor images]# qemu-img resize  vm1.img +10G
Image resized.

仮想ディスクのサイズが24GBから34GBに増えました。

[root@hypervisor images]# qemu-img info vm1.img 
image: vm1.img
file format: qcow2
virtual size: 34G (36507222016 bytes)
disk size: 12G
cluster_size: 65536
Format specific information:
    compat: 0.10

5.パーティションのサイズ拡張

ここからの作業は仮想マシンにrootでログインして行います。
partedコマンドでパーティションの割り当て状況を確認します。この時点では2番目のパーティションは24.7GBのままで増えていません。

[root@vm1 ~]# parted  /dev/vda print
モデル: Virtio Block Device (virtblk)
ディスク /dev/vda: 36.5GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ: 

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  1075MB  1074MB  primary  xfs               boot
 2    1075MB  25.8GB  24.7GB  primary                    lvm

パーティションはpartedコマンドのresizepartサブコマンドで増やします。
ここはインタラクティブな方法で入力します。
最初のオプション 2は2つ目のパーティションを示します。
-1s は最後のセクターまで増やすことを意味します。
resizepartサブコマンド実行後は何もレスポンスはありませんが、心配しないでください。
終了はqサブコマンドです。

[root@vm1 ~]# parted /dev/vda
GNU Parted 3.1
/dev/vda を使用
GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。

(parted) resizepart 2 -1s                                                 

(parted) q   

2番目のパーティションが24.7GBから35.4GBに増えました。

[root@vm1 ~]# parted  /dev/vda print                                   
モデル: Virtio Block Device (virtblk)
ディスク /dev/vda: 36.5GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ: 

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  1075MB  1074MB  primary  xfs               boot
 2    1075MB  36.5GB  35.4GB  primary                    lvm

6.物理ボリュームのサイズ拡張

物理ボリュームの細部はまだ増えていません。

[root@vm1 ~]# pvdisplay /dev/vda2
  --- Physical volume ---
  PV Name               /dev/vda2
  VG Name               cl_centos7template
  PV Size               <23.00 GiB / not usable 2.00 MiB
:

pvresizeコマンドで物理ボリュームのサイズを増やします。

[root@vm1 ~]# pvresize /dev/vda2
  Physical volume "/dev/vda2" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized

物理ボリュームのサイズが23GBから33GBに増えました。

[root@vm1 ~]# pvdisplay /dev/vda2
  --- Physical volume ---
  PV Name               /dev/vda2
  VG Name               cl_centos7template
  PV Size               <33.00 GiB / not usable 2.00 MiB
:

ボリュームグループのサイズは物理ボリュームの増加といっしょに増えます(33GB)。未割当(FREE)の領域が10GBある事がわかります。

[root@vm1 ~]# vgdisplay cl_centos7template
  --- Volume group ---
  VG Name               cl_centos7template
:
  VG Size               <33.00 GiB
  PE Size               4.00 MiB
  Total PE              8447
  Alloc PE / Size       5887 / <23.00 GiB
  Free  PE / Size       2560 / 10.00 GiB
  VG UUID               XZleoU-FvcU-pNs9-rIc7-4PrH-pZZ6-KfoyZm

7.論理ボリュームのサイズ拡張

最後にlvextendコマンドで論理ボリュームを増やします。
-l +100%FREE は空き領域のすべてを指します。
-r はファイルシステムも合わせてリサイズするオプションです(resize2fsコマンドと同義)。

[root@vm1 ~]# lvextend  -l +100%FREE  -r  /dev/cl_centos7template/root
  Size of logical volume cl_centos7template/root changed from <21.50 GiB (5503 extents) to <31.50 GiB (8063 extents).
  Logical volume cl_centos7template/root successfully resized.
meta-data=/dev/mapper/cl_centos7template-root isize=512    agcount=7, agsize=818944 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=5635072, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 5635072 to 8256512

論理ボリュームが31.5GBに増えました。

[root@vm1 ~]# lvdisplay /dev/cl_centos7template/root
  --- Logical volume ---
  LV Path                /dev/cl_centos7template/root
  LV Name                root
  VG Name                cl_centos7template
:
  LV Status              available
  # open                 1
  LV Size                <31.50 GiB
:

ファイルシステムも32Gへ増えていることが確認できます。

[root@vm1 ~]# df -h
ファイルシス                        サイズ  使用  残り 使用% マウント位置
:                             1000M     0 1000M    0% /sys/fs/cgroup
/dev/mapper/cl_centos7template-root    32G  7.4G   25G   24% /
/dev/vda1                            1014M  245M  770M   25% /boot
:

8.最後に

この面倒な手順を紹介しましたが、そもそもKVMやVMwareに作成する仮想マシンはLVMにする必要ないんですね。
物理マシンならLVMにすることで、HDDを追加した時にパーティションを分けずに論理ボリュームを増やすことができます。
あとはLVMスナップショットか。怖くて使ったことないけど。

非LVM(単純なパーティション)ならディスク拡張はもう少し簡単はずです。

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

[Linux] パーティションを追加せずに仮想ディスクを拡張する

1.TL;DR

VMwareやKVMのハイパーバイザー環境にRHEL/CentOSをインストールするとデフォルトではLVM(論理ボリューム管理)となってしまいます。仮想ディスクを増やそうとすると、ハイパーバイザー環境で仮想ディスクをサイズを増やした後に、通常はパーティションを追加する事になります。パーティションは基本パーティションを最大4つまでしか作成できません(拡張パーティションを使えば更に増やせますが、ここでは割愛します)。ディスクサイズを増やすたびに、パーティションを追加するのはイマイチなので、別の方法を試しました。

パーティションのサイズを増やして、最終的にOSが認識する論理ボリュームサイズを増やした。

2.作業の流れ

  • 仮想ディスクのサイズ拡張
  • パーティションのサイズ拡張
  • 物理ボリュームのサイズ拡張
  • 論理ボリュームのサイズ拡張

LVMの説明.png

この作業は最悪仮想マシンを壊してしまう可能性がある作業です。自己責任にて行ってください。

前提となる環境

  • ハイパーバイザー(物理マシン):CentOS 7.8.2003のKVM
  • 仮想マシン:CentOS 7.8.2003

3.変更前の状態

ディスク拡張前の状態を確認しておきます。
最初にハイパーバイザー側から見える情報です。
仮想ディスクのサイズは24GBと認識されています。実際に確保されているサイズは12GBです。

[root@hypervisor images]# qemu-img info vm1.img 
image: vm1.img
file format: qcow2
virtual size: 24G (25769803776 bytes)
disk size: 12G
cluster_size: 65536
Format specific information:
    compat: 0.10

次に仮想マシン内部から見える情報です。
拡張対象の2つ目のパーティションは24.7GBです。

[root@vm1 ~]# parted /dev/vda print
モデル: Virtio Block Device (virtblk)
ディスク /dev/vda: 25.8GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ: 

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  1075MB  1074MB  primary  xfs               boot
 2    1075MB  25.8GB  24.7GB  primary                    lvm

ファイルシステムを確認します。
ルートのパーティション /dev/mapper/cl_centos7template-root は 22GB です。

[root@vm1 ~]# df -h
ファイルシス                        サイズ  使用  残り 使用% マウント位置
:
/dev/mapper/cl_centos7template-root    22G  7.4G   15G   35% /
/dev/vda1                            1014M  245M  770M   25% /boot
:

4.仮想ディスクのサイズ拡張

ハイパーバイザのサーバへrootでログインして行います。
仮想ディスクを増やす前に仮想マシンはシャットダウンしておきましょう。

qemu-img resizeコマンドで10GB 増やします。

[root@hypervisor images]# qemu-img resize  vm1.img +10G
Image resized.

仮想ディスクのサイズが24GBから34GBに増えました。

[root@hypervisor images]# qemu-img info vm1.img 
image: vm1.img
file format: qcow2
virtual size: 34G (36507222016 bytes)
disk size: 12G
cluster_size: 65536
Format specific information:
    compat: 0.10

5.パーティションのサイズ拡張

ここからの作業は仮想マシンにrootでログインして行います。
partedコマンドでパーティションの割り当て状況を確認します。この時点では2番目のパーティションは24.7GBのままで増えていません。

[root@vm1 ~]# parted  /dev/vda print
モデル: Virtio Block Device (virtblk)
ディスク /dev/vda: 36.5GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ: 

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  1075MB  1074MB  primary  xfs               boot
 2    1075MB  25.8GB  24.7GB  primary                    lvm

パーティションはpartedコマンドのresizepartサブコマンドで増やします。
ここはインタラクティブな方法で入力します。
最初のオプション 2は2つ目のパーティションを示します。
-1s は最後のセクターまで増やすことを意味します。
resizepartサブコマンド実行後は何もレスポンスはありませんが、心配しないでください。
終了はqサブコマンドです。

[root@vm1 ~]# parted /dev/vda
GNU Parted 3.1
/dev/vda を使用
GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。

(parted) resizepart 2 -1s                                                 

(parted) q   

2番目のパーティションが24.7GBから35.4GBに増えました。

[root@vm1 ~]# parted  /dev/vda print                                   
モデル: Virtio Block Device (virtblk)
ディスク /dev/vda: 36.5GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ: 

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  1075MB  1074MB  primary  xfs               boot
 2    1075MB  36.5GB  35.4GB  primary                    lvm

6.物理ボリュームのサイズ拡張

物理ボリュームの細部はまだ増えていません。

[root@vm1 ~]# pvdisplay /dev/vda2
  --- Physical volume ---
  PV Name               /dev/vda2
  VG Name               cl_centos7template
  PV Size               <23.00 GiB / not usable 2.00 MiB
:

pvresizeコマンドで物理ボリュームのサイズを増やします。

[root@vm1 ~]# pvresize /dev/vda2
  Physical volume "/dev/vda2" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized

物理ボリュームのサイズが23GBから33GBに増えました。

[root@vm1 ~]# pvdisplay /dev/vda2
  --- Physical volume ---
  PV Name               /dev/vda2
  VG Name               cl_centos7template
  PV Size               <33.00 GiB / not usable 2.00 MiB
:

ボリュームグループのサイズは物理ボリュームの増加といっしょに増えます(33GB)。未割当(FREE)の領域が10GBある事がわかります。

[root@vm1 ~]# vgdisplay cl_centos7template
  --- Volume group ---
  VG Name               cl_centos7template
:
  VG Size               <33.00 GiB
  PE Size               4.00 MiB
  Total PE              8447
  Alloc PE / Size       5887 / <23.00 GiB
  Free  PE / Size       2560 / 10.00 GiB
  VG UUID               XZleoU-FvcU-pNs9-rIc7-4PrH-pZZ6-KfoyZm

7.論理ボリュームのサイズ拡張

最後にlvextendコマンドで論理ボリュームを増やします。
-l +100%FREE は空き領域のすべてを指します。
-r はファイルシステムも合わせてリサイズするオプションです(resize2fsコマンドと同義)。

[root@vm1 ~]# lvextend  -l +100%FREE  -r  /dev/cl_centos7template/root
  Size of logical volume cl_centos7template/root changed from <21.50 GiB (5503 extents) to <31.50 GiB (8063 extents).
  Logical volume cl_centos7template/root successfully resized.
meta-data=/dev/mapper/cl_centos7template-root isize=512    agcount=7, agsize=818944 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=5635072, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 5635072 to 8256512

論理ボリュームが31.5GBに増えました。

[root@vm1 ~]# lvdisplay /dev/cl_centos7template/root
  --- Logical volume ---
  LV Path                /dev/cl_centos7template/root
  LV Name                root
  VG Name                cl_centos7template
:
  LV Status              available
  # open                 1
  LV Size                <31.50 GiB
:

ファイルシステムも32Gへ増えていることが確認できます。

[root@vm1 ~]# df -h
ファイルシス                        サイズ  使用  残り 使用% マウント位置
:                             1000M     0 1000M    0% /sys/fs/cgroup
/dev/mapper/cl_centos7template-root    32G  7.4G   25G   24% /
/dev/vda1                            1014M  245M  770M   25% /boot
:

8.最後に

この面倒な手順を紹介しましたが、そもそもKVMやVMwareに作成する仮想マシンはLVMにする必要ないんですね。
物理マシンならLVMにすることで、HDDを追加した時にパーティションを分けずに論理ボリュームを増やすことができます。
あとはLVMスナップショットか。怖くて使ったことないけど。

非LVM(単純なパーティション)ならディスク拡張はもう少し簡単はずです。

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

[シェルスクリプト] 毎週、同じ内容を送信するのがめんどくさいので自動化してみた!!!

概要

毎週土曜日にもくもく勉強会を開催しているが、始まる少し前に「zoomのURLを貼り付けて、メール文章を考えてメール送信」 この作業がめんどくさい。
って事で、定型分を作成してslackに自動送信出来る様にしよう!!っていう内容になっています。

■大まかな流れ

1.ファイルを作成して実行権限を付与
2.slackにIncoming Webhookを登録して設定
3.コード作成(zoom URL + メール文章)
4.cronの設定(ジョブスケジューリング)

1.ファイルを作成して実行権限を付与

まず、プログラムを書くファイルを作成します。私は土曜日に土曜日に実行するファイルなので、shellscriptディレクトリにSaturday_executeというファイルを作成しました。(./shellscript/Saturday_executeのパスはcronの設定で使います。)
では、Saturday_executeに権限を付与していきましょ。

■ディレクトリ内のファイル情報を表示する

/shellscript
$ ls -l      #ディレクトリ内のファイル情報を表示する
-rw-r--r-- 1 ファイルの所有者名 ファイルの所属グループ ファイルサイズ 更新日時 Saturday_execute(ファイル名)

lsコマンドの使い方とオプション

表示された情報の詳細
- 左の3文字 : 所有者のアクセス権限
- 中央3文字 : 所有グループのアクセス権限
- 右の3文字 : 所有者のアクセス権限

-r:読み込み可
- w:書き込み可
- x:実行可
- -:アクセス権限なし

所有者のアクセス権限の3文字目が「-」なので、実行権限がないのが分かりますね。
実行権限がないので実行権限を与えましょう。

■実行権限の付与
権限の変更にはchmodコマンドを使用します。
chmodの使い方とオプション

/shellscript
$ chmod u+x Saturday_execute    #chmod 権限設定 ファイルパス

コマンド解説

記号 意味
u 所有者の権限

xは「■ディレクトリの情報を表示する」で説明しましたが、実行権限の事でしたね。

「Saturday_executeファイルの所有者に実行権限を付与する」という意味になります。

2. slackにIncoming Webhookを登録して設定

slackの左下に「Appの横にある+ボタン]からIncoming Webhookを検索します。
スクリーンショット 2020-07-26 11.53.54.png
「設定を追加」をクリックします
スクリーンショット 2020-07-26 12.48.02.png
通知をしたいチャンネルを選択し、「Incoming Webhook インテグレーションの追加」をクリックします。
スクリーンショット 2020-07-26 12.48.52.png
Webhook URLをコードに埋め込んで使う為コピーしておきます。
スクリーンショット 2020-07-26 12.49.01.png

これで設定完了!!

3.コード作成(zoom URL + メール文章)

Incoming WebhookのURL設定、slackの送信チャンネル、送信名、アイコン、メッセージを設定してcurlコマンドで送信する。

/shellscript/Saturday_execute
#!/bin/bash

#################################################################################
# 土曜日の朝に勉強会参加用のURLをメール送信
# 概要 : Incoming WebhookのURL設定、slackの送信チャンネル、送信名、アイコン、メッセージを設定してcurlコマンドで送信する。
# 実行日 : 毎週土曜日 9時55分
#################################################################################

#slackの「勉強会」チャンネルへ通知(Incoming WebHooksのURL)
WEBHOOKURL="コピーしたIncoming WebhookのURL"

###############################################################
#固定文文字列の作成
###############################################################
#slack 送信チャンネル
CHANNEL="#勉強会"
#slack 送信名
BOTNAME="勉強会案内のお知らせ"
#slack アイコン
FACEICON=":snail:"  #なめくじのアイコンを使用しています。設定を変更したい場合は「https://www.webfx.com/tools/emoji-cheat-sheet/」を使用。
#メッセージ内容
MESSAGE="今からもくもく勉強会を始めます。\n 下記のURLよりお入りください。\n ■時間:10時〜17時\n <zoom URL>"

curl -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"icon_emoji\": \"${FACEICON}\", \"text\": \"${MESSAGE}\" }" ${WEBHOOKURL}

コード内容は文字列を変数に格納してcurlコマンドで送信しているだけ!!

・基本操作が分からない方は下記を参照!
シェルスクリプトの基本コマンド
・curlコマンドの使い方が分からない方は下記を参照!
curlコマンドのオプション

4.cronの設定(ジョブスケジューリング)

ここまできたら残すは「指定の時間に指定のプログラムを実行」する設定のみ!!
■ジョブスケジューリングは、指定の時間に指定のプログラムを自動実行する機能。下記の2種類

・cron
- 定期的に自動実行
- crondとcrontabコマンドで構成
・at
- 1回だけ自動実行
- 標準入力でスクリプトを指定する

今回の実装は毎週通知なので、cronで行います。
それでは「/shellscript/Saturday_execute」ファイルを「毎週9時55分」に実行する様に設定して行きましょう。

$ crontab -e      #eオプションを付けて起動

スクリーンショット 2020-07-26 14.13.17.png

iでインサートモードに切り替えて下記を入力

crontab
# (分)(時)(日)(月)(曜日) 実行するコマンドのパス
55 9 * * sat bash ./shellscript/Saturday_execute    #毎週土曜日の9時55分「Saturday_execute」ファイルを実行

#入力後、escキー押して:wqで保存終了

excキー押して:wqで保存終了したら完成!!!

こんな感じでslackに通知が行きます。
スクリーンショット 2020-07-26 14.26.05.png

cronの詳細が分からない方は下記を参照してください。

cronで定期処理を行う
ronの書式で曜日指定に数字を使うのやめたい

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

apgで覚えやすいパスワードを生成する

普段パスワードはパスワードマネージャに覚えてもらっており(自分はkeepassxで管理している)パスワードはランダムな文字列であれば何でも問題ないのですが、たまにランダムだけど覚えておきたいパスワードが作りたくなる場面があります。例えば、チーム内で共有したいパスワードを生成しなければいけないときです。パスワードのポリシーは結構個人差が出るところで、ランダム過ぎても覚えられないと苦情がくるし、覚えやす過ぎても苦情がくる結構面倒な作業です。

linuxにはパスワード生成用にapgというコマンドがあり、これのデフォルトパスワードアルゴリズムがMorrie Gasser氏によって考案された、発音可能なランダム文字列を生成するアルゴリズムを使ってるようなので、このコマンドにランダムかつ、覚えやすそうなパスワードを生成してもらいます。

使用例

$ apg -m12 -t
idIpwikFiut: (id-Ip-wik-Fi-ut-COLON)
VuHanErtecGa (Vu-Han-Ert-ec-Ga)                                             
nufazVohujIm (nuf-az-Vo-huj-Im)
IbreksOvDafs (Ibr-eks-Ov-Dafs)
yeimFekejquo (yeim-Fek-ej-quo)
ricsobhawoj9 (rics-ob-haw-oj-NINE)

何個か候補を出してくます。-tで読み方を教えてくれるので、覚えやすそうなパスワードを選びましょう。

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

PATHを通すってどういうこと?コマンドはどこにある?

概要

コマンドをなんともなしにうちこんではいるけど、コマンドってどこのあるんだろうか。
PATHを通すってよく聞くけど、どういうことなんだろうか。
そんなことを思った初心者に向けて書いた記事です。
コマンドのコードを読むとかはしないです。

ちなみに各コマンドはMacとzshにて試してますが、Unix系なら似たようなものです。

結論

先に結論を言ってしまうと、PATHを通すとは、外部コマンドの場所をコマンドサーチパスに登録し、外部コマンドをパスで指定せずとも実行できるようにすることです。
詳細は下記に記します。

内部コマンドと外部コマンド

コマンドには以下のように、シェルに組み込まれている内部コマンド(ビルトインコマンド)と、特定のディレクトリ配下にファイルとして置かれている外部コマンドがあります。

パッケージ管理マネージャ.png

lsコマンドはどこにある?

ためしに lsコマンドの場所を which コマンドで見てみましょう。

$ which ls

出力:

/bin/ls

どうやら /bin 直下にあるようです。

/bin の中には何がある?

では次に/binの中を見てみましょう。

$ ls /bin

出力:

[       chmod       dash        df      expr        ksh     ln      mv      pwd     sh      sync        unlink
bash        cp      date        echo        hostname    launchctl   ls      pax     rm      sleep       tcsh        wait4path
cat     csh     dd      ed      kill        link        mkdir       ps      rmdir       stty        test        zsh

よく使うコマンドと同じ名前のファイルがありますね。

外部コマンドの実体はファイルです

試しにlsコマンドの中身を見てみると、バイナリファイルであることがわかります。

$ od -h /bin/ls | more

出力:

0000000      facf    feed    0007    0100    0003    0000    0002    0000
0000020      0013    0000    0710    0000    0085    0020    0000    0000
0000040      0019    0000    0048    0000    5f5f    4150    4547    455a
0000060      4f52    0000    0000    0000    0000    0000    0000    0000
(略)

外部コマンドを実行するには

内部コマンドは、コンピュータ起動時にメモリに読み込まれていますが、外部コマンドは、ディスクにファイルとして存在し(/bin配下など)、毎回ディスクから読み込まれるようになっています。

つまり、外部コマンドを実行する際は、直接パスを指定して外部コマンドを実行できます

例: 直接ファイルの置き場所を指定してlsコマンドを実行

$ /bin/ls

上記のようにすればコマンドを実行できますが、それでは面倒なので PATHという環境変数が用意されています。
これは厳密にはコマンドサーチパス(コマンド検索パス)と呼ばれるものです。

直接パスを指定しなくても、プログラムが勝手にコマンドサーチパスを見てコマンドを検索するため、以下のように lsコマンドが実行できるわけです。

$ ls

PATHの中身は、外部コマンドを有するディレクトリ群

PATHの中身をいったん見るために echo コマンドで PATHを見てみます。

$ echo $PATH

出力:

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin

結果をみるといくつかのディレクトリが:で区切られて出力されました。

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/Library/Apple/usr/bin

これらが外部コマンドの置き場所(パス)を示しています。

PATHが通っていないと

PATHが通っていなかったり、存在しないコマンドを実行しようとすると以下のようになります。

例: zshの場合

zsh: command not found: hogehoge

該当のコマンドを既に入れたはずなのに、not found などと言われる場合、
PATH が通ってないことが多いです。

PATHを通すには

PATH を通すためにやることは、環境変数PATHに、使いたいコマンドが置いてあるディレクトリのパスを追記する必要があります。

例えば、/hogehoge/bin 配下にあるphpコマンドを使いたい場合、
/hogehoge/binを環境変数PATHに追加します。

試しにexportコマンドを用いて追加してみます。

$ export PATH="/hogehoge/bin:$PATH"

echo で追加されているかどうか確認。(追加されたコマンドをうってみてもOK)

$ echo $PATH

出力:

/hogehoge/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin

上記のように、環境変数にはexportコマンドを用いて追加できますが、いちいちexportコマンドを使って追加するのは面倒なので、基本的に使用しているシェルの設定ファイルに追記します。

こうすることでシェルを起動する際に、自動的にPATHが上書きされるようになります。

例: zshの場合

HOMEディレクトリ配下の.zshrcファイルにて exportを用いて追記します。

.zshrc
export PATH="/hogehoge/bin:$PATH"

最後 $PATHと書いていますが、これは既存の環境変数PATHを展開しています。つまり、以下と同じ意味です。

.zshrc
export PATH="/hogehoge/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin"

このときに、既存のものを完全に上書きしてしまうと、いろいろなコマンドが使えなくなってしまうので注意。
例えば、以下のようにしてしまうと、/bin 配下などのコマンドが読み込まれなくなります。

.zshrc
export PATH="/hogehoge/bin"

以上のように、環境変数PATHを用いると、所定の外部コマンドを直接パスを指定せずに実行することができるようになります。
シェルの設定ファイルに関してわからない方は、自分の使っているシェルを調べて、書き方をググって見るとよいです。

PATHの優先順位

PATHには優先順位があります。
例えば以下の場合だと、左の/hogehoge/binから順番に読み込まれるようになっています。

PATH=/hogehoge/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin

例えば、/hogehoge/binと、/use/local/binにそれぞれphpというコマンドがあった場合、

$ php

と実行した場合に読み込まれるのは、/hogehoge/binphpコマンドになるということです。

このように、PATHを指定する際は、優先順位にも気をつける必要があります。

各コマンドの置き場所( /bin や /usr/local/bin など)の違い

外部コマンドの置き場所は、FHS(Filesystem Hierarchy Standard)で「こういうコマンドはこの場所に置きましょうね!」という形で標準化されています。
これにより、どのLinux系のシステムをいじっても、「この/binってディレクトリには緊急時でも使えるコアなコマンドが置いてあるんだな」と一目瞭然になるわけです。
(ただし、標準化されているとはいえ、強制しているわけではないので、各OSごとで変なコマンドが変な場所にあったりすることも)

これらで標準化されている外部コマンドの置き場所、それぞれの違いを以下の表にまとめてみましたが、一個ずつ見ていきます。

ディレクトリ シングルユーザモード ひとこと概要
/bin 利用可 緊急時でも使えるやつ
/usr/bin 利用不可 一般的なやつ
/usr/local/bin 利用不可 自作のスクリプトとか
/sbin 利用可 スーパーユーザー(root)特権が必要
/usr/sbin 利用不可 スーパーユーザー(root)特権が必要

/bin

シングルユーザモードでも使える一番コアな外部コマンドをこのディレクトリ配下に置きます。
シングルユーザモードとは、OSが正常に起動できないときなどの非常時に利用するものです。

最初でも確認したとおり、筆者のMacbookProの/binには以下のコマンドが入っていましたね。

[       chmod       dash        df      expr        ksh     ln      mv      pwd     sh      sync        unlink
bash        cp      date        echo        hostname    launchctl   ls      pax     rm      sleep       tcsh        wait4path
cat     csh     dd      ed      kill        link        mkdir       ps      rmdir       stty        test        zsh

これらのコマンドについて知らない人は、調べてもらえれば、どれもシンプルかつ重要なコマンドであることがわかります。

/usr/bin

シングルユーザモードで使わず、基本的にパッケージマネージャ(パッケージ管理システム)に管理されるコマンドを置きます。
パッケージマネージャは各OSごとにいろいろなものがありますが、ここでは触れません。
実際どんなコマンドがあるかは、自分のマシンのディレクトリを覗いて確認してみましょう。

/usr/local/bin

シングルユーザモードで使わず、パッケージマネージャに管理されないコマンドを置きます。

ちなみに、Macユーザーおなじみのパッケージマネージャであるhomebrewですが、
このディレクトリを使います。
なぜhomebrewがこの場所を使うかは、homebrewのページに書いてあります。

https://docs.brew.sh/FAQ#why-does-homebrew-prefer-i-install-to-usrlocal

翻訳すると、以下のように言っています。

Appleはこのディレクトリを非システムユーティリティ用に割り当てています。つまり、デフォルトでは /usr/local にはファイルが存在しないので、既存のツールやシステムツールを台無しにする心配はありません。

/sbin や /usr/sbin

基本的に上記の各階層のディレクトリと同じ扱いですが、binとは違い、システム管理者がいじるような管理用のコマンドを置きます。
これらはスーパーユーザー(root)権限が必要になるため、一般ユーザーでは使用できません。

まとめ

結論は先にも書いたとおり、

PATHを通すとは、外部コマンドの場所をコマンドサーチパスに登録し、外部コマンドをパスで指定せずとも実行できるようにすること

ということでした。

PATHを通すついでに、内部コマンドと外部コマンドにも言及している記事があまり見当たらなかったので、今回書いてみました。

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

CentOS 7 selinuxを無効化する

目的

  • CnetOS7のselinuxを無効化する方法をまとめる

実施環境

  • ハードウェア環境
項目 情報
OS CentOS 7 (7.8.2003)
ハードウェア Dell Studio 1537
プロセッサ Intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz
メモリ 4 GB DDR3
グラフィックス 不明

前提条件

  • 下記、または下記に準ずる方法でCentOS7のPCが構築されていること。

前提情報

  • 特になし

読後感

  • CentOS7のマシンのselinuxを無効化することができる。

詳細

  1. 下記コマンドを実行してselinuxの設定ファイルのバックアップを作る。

    $ sudo cp /etc/selinux/config /etc/selinux/config_org
    
  2. 下記コマンドを実行してselinuxの設定ファイルを開く。

    $ sudo vi /etc/selinux/config
    
  3. 開いたファイル内のSELINUXの部分を下記の様に修正する。(typoするとCentOSのPCが起動しなくなる恐れがあるので注意する)

    SELINUX=disabled
    
  4. 保存して閉じる。

  5. CentOS7のPCを再起動する

  6. 下記コマンドを実行してselinuxの設定値を出力する。

    $ getenforce
    
  7. 下記の様に出力されれば設定が完了している。

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

Ubuntuでパーティションのマウントポイントを変更した

インストール時にミスっていたのか、ストレージの残りが6GBになっていた
/homeに割り当てていたはずの領域がおかしくなっていたのでmount pointを変更して解決した

手順

  1. Gpartedでmount pointの確認

/homeにmountしていたつもりだったpartitionが/media/UUIDにmountされていた

  1. マウントポイントを変更

以下の手順でmount pointを変更した

  • fstabの確認
cat /etc/fstab
  • GpartedでUUIDを確認
  • fstab編集
<file system> <mount point> <type> <options> <dump> <pass>

UUID=<UUID> /home ext4 default 0 0 
sudo mount -a
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む