20201126のLinuxに関する記事は6件です。

linux user 追加

1ユーザ追加  abcde

useradd abcde

2パスワード追加

passwd abcde

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

Linuxのディレクトリ構成の確認

勉強前イメージ

独自でインストールするときとかどこにディレクトリほったらいいかわからなくて....
なんとなくイメージでやってたけど確認する

調査

今回はCentOS7のroot配下のディレクトリを取ってきました。

/

最上位のディレクトリ、つまりrootディレクトリ。

/bin

システムを管理する上で基本コマンドが入っている。
cd, cp, mvなどOSをインストールしたときの標準コマンドのプログラムが入っている

/boot

ブートに必要なファイルが入っている。
カーネルイメージとかが保存されている

/dev

デバイスのファイルが入っているディレクトリ。
sdaやcdromなど

/etc

ほとんどの設定ファイルが置かれているディレクトリ
httpdとかインストールしたら /etc/httpd に設定ファイルが置かれたりする

/home

一般ユーザのホームディレクトリ。
ユーザが追加されるごとに/home配下にディレクトリが作成される

/lib

システムを起動するのに必要なドライバモジュールやライブラリファイル用のディレクトリになります

/lib64

64bitの場合は/libでなくこちらのディレクトリが使用される。
一覧を作ったサーバは64bitだったので、libはみずにlib64を見ているってことかな。

/media

CD-ROMやフロッピーディスクなどの外付けメディア用のディレクトリ。

/mnt

一時的なファイルシステムのマウントに使うディレクトリ

/opt

rpmなどパッケージ管理システムのインストール先。

/proc

プロセスのIDの付いたディレクトリが置かれています
各プロセス名によってディレクトリが存在し、現在実行されているプロセスに対する情報とデータが含まれている

/root

rootユーザーのホームディレクトリ

/run

実行中のプログラムのPIDファイルを格納するときによく使われるディレクトリです
.pidというファイルを使って重複して起動しないために使われることが多い
再起動の際にデータが削除されます

/sbin

システム管理者用のコマンド(再起動やファイルシステムの操作等)が置かれている
新しいコマンドの追加や変更は推奨されていません

/srv

ftp、wwwなどで利用するユーザー用のスペース

/sys

動作しているプロセスやドライバのうち、ドライバ関連がまとめられている

/tmp

テンポラリデータの保存場所。

/usr

各ユーザーが共通して利用するライブラリのデータを保存する場所
ソースからコンパイルしたアプリケーションなどはこちらにインストールされる。
/etcに保存されている設定のシンボリックリンクが貼られることがある

/var

ログやキャッシュなどのデータが保存されている

勉強後イメージ

/etcに設定ファイルが置かれないようなミドルウェアってあるけどあれの違いってなんなのかな...
あと/mediaにCD-ROMのディレクトリあるけど、/dev/cdromとどう違うんだろう...
いろいろ疑問が出てきたのでまた今度確認する。
今回はライブラリとかどこ置いたらいいんやろ...って思うことが多いから、どういう役割をしてるのかでも知れたので良かったと思います

参考

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

Wordpressの「予期しないエラー」でテーマが選べない場合の対処法

環境

CentOS8、MariaDB 10.3.17、PHP 7.4.13、apache 2.4.37、SELINUX=enforcing

問題

Wordpressのテーマを変更しようとして、「新規追加」ボタンを押すと、エラーが出てテーマを選択できない。
image.png

原因

そもそも自分が操作しているクライアントPCとは繋がっており、ファイアーウォールとかではない。ということでSELinuxのログを見るとdeniedの文字が大量に出てる。

# aureport --avc

AVC Report
===============================================================
# date time comm subj syscall class permission obj result event
===============================================================
1. 11/25/2020 19:00:36 ? system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 0 (null) (null) (null) unset 141
2. 11/25/2020 19:34:17 php-fpm system_u:system_r:httpd_t:s0 0 tcp_socket name_connect system_u:object_r:http_port_t:s0 denied 226
...

RedHatのドキュメントによると、SELinuxをdisableにしていない場合、SELinuxはApacheが外部ネットワークと通信するのを許可しない。なので、テーマだけでなくプラグインの追加とか、外部ネットワークとの通信が発生する処理なら全て同じエラーが発生する。

4.4.2. Security-Enhanced Linux
This reference environment has been set up and tested with Security-Enhanced Linux (SELinux) enabled in ENFORCING mode. Once again, please refer to the Red Hat documentation on SELinux for further details on using and configuring this feature. For any other operating system, consult the respective documentation for security and firewall solutions to ensure that maximum security is maintained while the ports required by your application are opened.

When enabled in ENFORCING mode, by default, SELinux prevents Apache web server from establishing network connections. On the machine hosting Apache web server, configure SELinux it to allow httpd network connections:

# /usr/sbin/setsebool httpd_can_network_connect 1

対処法

ということで、上記のコマンドでSELinuxにApacheの外部ネットワークとの通信を許可させる。
めでたく解決。
image.png

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

LinuxにDockerをInstallするAnsible-Galaxy

LinuxDockerをインストールするたびに、

「ubuntu docker install」
「centos docker install」

などをググって、Docker公式サイトより手動でインストールしていました。

毎回インストールするのは手間なので、自動化したいと思っていた矢先、
OSSで素晴らしいansible-galaxyを見つけましたので、紹介したいと思います。

使用するansible-galaxy

Ansible Galaxy: https://galaxy.ansible.com/geerlingguy/docker
GitHub: https://github.com/geerlingguy/ansible-role-docker

Ansible Playbookを書いてみる

VirtualBox上にUbuntu20.04のVMを作成します。
Vagrantを用いて、Provisioning ToolとしてAnsibleを使用し、そのPlaybookでDockerをインストールします。

Vagrantfileを作成する

以下のVagrantfileを作成します。

IPアドレスは192.168.0.3/24としてあります。

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.define "ansible-docker" do |node|
    node.vm.box = "bento/ubuntu-20.04"
    node.vm.hostname = "ansible-docker"
    node.vm.network "private", ip: "192.168.0.3", netmask: "255.255.255.0"
    node.vm.provider "virtualbox" do |vb|
      vb.memory = "1024"
    end
  end

  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "./install_docker.yml"
    ansible.inventory_path = "./inventory.ini"
    ansible.limit = 'all'
  end
end

roleをインストールする

rolesディレクトリを作成して、その中に今回使用するroleをインストールします。

mkdir roles
ansible-galaxy install geerlingguy.docker -p roles/

InventoryとPlaybookを作る

inventory.ini

[ansible-docker]
192.168.0.3

install_docker.yml

---
hosts: all
  roles:
    role: geerlingguy.docker
    become: yes

Playbookを実行する

ディレクトリ構造は以下のようになっています。

.
├── Vagrantfile
├── install_docker.yml
├── inventory.ini
└── roles
     └── geerlingguy.docker
         ├── LICENSE
         ├── README.md
         ├── defaults
         │   └── main.yml
         ├── handlers
         │   └── main.yml
         ├── meta
         │   └── main.yml
         ├── molecule
         │   └── default
         │       ├── converge.yml
         │       └── molecule.yml
         └── tasks
             ├── docker-compose.yml
             ├── docker-users.yml
             ├── main.yml
             ├── setup-Debian.yml
             └── setup-RedHat.yml

以下のコマンドでVM作成します。(ホストOSでAnsible実行環境が整備されている必要があります。)

vagrant up

docker,docker-composeがインストールされていることを確認できます。

vagrant@ansible-docker:~$ sudo docker -v
Docker version 19.03.12, build 48a66213fe
vagrant@ansible-docker:~$ sudo docker-compose -v
docker-compose version 1.26.0, build d4451659
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ubuntu20.04のlibvirtdで--listenできない

KVMを使って仮想化しようと思い、libvirtdを設定した際、いつも通り /etc/default/libvirtdlibvirtd_opts="-l"にしてリスタートしたところ、

libvirtd[3872]: --listen parameter not permitted with systemd activation sockets, see 'man libvirtd' for further guidance
systemd[1]: libvirtd.service: Main process exited, code=exited, status=6/NOTCONFIGURED
systemd[1]: libvirtd.service: Failed with result 'exit-code'.
systemd[1]: Failed to start Virtualization daemon.
systemd[1]: libvirtd.service: Scheduled restart job, restart counter is at 2.
systemd[1]: Stopped Virtualization daemon.

と吐いて上手く起動できない。

メッセージの通り、 man libvirtdして確認したところ、

OPTIONS
...
       -l, --listen

       Listen for TCP/IP connections. This should not be set if using systemd socket activation. Instead activate the libvirtd-tls.socket or libvirtd-tcp.socket unit files.
...

との事。

libvirtdのバージョン5からは -lは使えませんので、 libvirtd-tcp.socket使ってね。という事らしい。
しかも、libvirtd.serviceが起動する前に起動させないとならないので、 /lib/systemd/system/libvirtd.serviceを編集

[Unit]
...
Wants=libvirtd-tcp.socket ←追記
...

適用します。

# systemctl daemon-reload

libvirtd-tcp.socketの自動起動を有効にします。

# systemctl enable libvirtd-tcp.socket

念のため、システムを再起動させます。

無事にtcp16509をlistenしている事が確認できました。
※PIDが1/initでちょっとキモイ

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

【Linux】ブートプロセスについて

低レイヤーの学習が疎かだったので勉強中。
定期的にアウトプットしていこうと思う。

TL;DR

Linuxの起動順序(ブートプロセス)は
【BIOS/UEFI → ブートローダ → カーネル → init】
の流れで行われる。

1. BIOS起動〜ブートローダ起動

【BIOSとは】

ファームウェアの一つ。Basic I/O Systemの略でBIOSらしい。
最もハードウェアに近い部分を司り、物理的なハードウェア(マザーボード)上に搭載されている。BIOS自身はプログラムであり、フラッシュメモリ(フラッシュROM)に格納されている。

主に以下の設定ができる。

  • 日付と時刻
  • 電源管理
  • 起動デバイスの優先順位
  • 組み込みデバイスの有効/無効化

【処理の流れ】

1-1. PCの電源投入と同時にBIOS実行

これはそのまんまの意味。
BIOSはフラッシュメモリに格納されているため、何度も繰り返し書き込みができ、通電をやめても記憶内容が維持される。

1-2. POST処理

PCに接続している周辺機器(ビデオ、キーボード、メモリ、マウス、FDD、HDDなど)や組み込まれているパーツをチェックし、正常にPCを起動できるかどうかをチェックする。このことをPOST(Power On Self Test)処理というらしい。

1-3. 起動ドライブの決定

プログラムが動作し、設定された起動デバイスの優先順位に従ってOSが格納された外部記憶装置へアクセス。

BIOS → CD-DVD (優先順位:高)
     → HDD_01
   → HDD_02
   → HDD_03
   → USB    (優先順位:低)

参照先のデバイスにOS起動ファイルがあればそいつに引導を渡し、空だったり起動用ファイルが無い場合はBIOSは次のデバイスを参照する。この過程で起動ドライブが決定し、BIOSはそのドライブの先頭セクタをロードする。

1-4. MBR読み込み ~ ブートローダ起動

起動ドライブ先頭領域(MBR)に記録されたOS起動用のプログラム(2次ブートローダ)を主記憶装置(メインメモリ/RAM)に読み込み、制御を移す。メモリ上に読み込んだ「ブートローダ」を実行する。

【MBRとは】

Master Boot Recordの略称であり、ハードディスクの先頭セクタに置かれ、PC起動時に最初に読み込まれる領域。

【ブートローダとは】

BIOSによる呼び出しを受け、外部記憶装置からOSを読み出して起動するもの。
ブートローダはプログラムであり、実際には二段階の異なるプログラムに分かれていることが多い。一般的に「ブートローダ」と言われているものは「二次ブートローダ」であり、前述したBIOSなどが「一次ブートローダ」という言葉で説明されるようなこともある。

Linuxでは一般的にGRUBというブートローダが用いられることが多い。

ユーザがどれか1つのOSを選択すると、GRUBはそのOSのカーネルとRAMディスクをメモリ上にロードし、カーネルの先頭アドレスにジャンプするとその役目を終える。

2. カーネル起動

  • 高度にハードウェアを認識・制御。ルートファイルシステムのマウントなど様々な初期化処理を行う。
  • メモリ上に展開された初期RAMディスク内の、ファイルシステムへアクセスするために必要なドライバやスクリプトを使用してルートファイルシステムからマウントする
  • その後、initと言う特別な最初のプロセスをルートファイルシステムから起動する。

3. initプロセス起動

initは、UNIXおよびUnix系システムのプログラムのひとつであり、他の全てのプロセスを起動する役目を持つ。
デーモンとして動作し、一般にPID 1 を付与される。ブートローダがカーネルを起動し、カーネルがinitを起動する。という流れになる。

initの種類

BSD系/System V系のOSかによって異なる

initの代替

設計上の限界に対処するために、様々な代替が開発されてきた。
代表的なものとして

  • Upstart
  • systemd

がある。

その他

UEFI,GPTという存在について

実はBIOSはもう古くて、現在はUEFIというものに変わりつつある。
(UEFIはUnified Extensible Firmware Interfaceの略)
こいつは従来のBIOSを拡張した新しいファームウェアで、

  • GUI操作をサポート
  • ファームウェアが使用可能なメモリ量の上限緩和

などといった点でBIOSより優れている。

その他にもBIOSとUEFIの違いはいくつかあるが、その内のひとつとしてMBRとGPTがある。
HDDやSSDのディスクの先頭には、MBRかGPTというディスクのパーティション形式を規定する領域があり、

  • BIOSでインストールするとMBR
  • UEFIでインストールするとGPT

になる。システムドライブのパーティション形式は必ずこのようになり、前者をBIOSブート、後者をUEFIブートとも言う。

この辺の違いについても、後日追って書くようにしていきたい。

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