LVMを使ってみる。

小さいサイズのHDDが何個かあって、どかんと大きいサイズでボリュームを作りたいときなぁというときは、ハードウェアRAID使えば複数のHDDを1つのドライブとして扱うことができますが、コントローラカードを買わなければならなかったり、買ったカードにディスクを繋ぎ変えたり、ディスクもタイプ(SAS/SATA)を合わせなければならなかったりといろいろ手間だったりします。

ただ、LinuxでもOSで認識している複数のHDDをグループ化して大きなサイズで使用する機能がLogical Volume Management(LVM)というので提供されておりまして、ハード的な要件を気にせず気軽に使えるので、考え方と使い方をまとめてみました。

ハードウェアRAIDを使ったことがある人はそんなにハードルは高くないと思います。

 

一応、完成形はこんな感じです。

 

f:id:linlinrh:20180202155906p:plain

物理ディスクをグループ化して、グループから論理的なボリュームを作ります。

 

 

  • PV(Physical Volume):
    物理のHDDは2本ですが、片方(sdc)のHDDはパーティションを切ってそのパーティションをPVとして設定します。
    ※パティーションの境目でVGを作れるよ!というのを説明するためにあえて作ってますが、通常はHDDまるごとでVGは作ると思うのであまりやらないかもです。

  • VG(Volume Group):
    上のPVでボリュームグループをつくります。物理的な境目をなくします。

  • LV(Logical Volume):
    作ったボリュームグループからフレキシブルに、論理的なボリュームを切り出します。論理的な境目を作ります。

 

作業の流れです。

基本、PV→VG→LVの3ステップなのですが、今回はパーティションをPVにするために準備作業がありますが。パーティションを使わないときは飛ばしてください。以下手順になります。

 

 

0.準備(オプション)

1本目のHDD(sdb)はスルーして、2本目のHDD(sdc)にパーティションを作成します。今回partedコマンドを使いましたが、もちろんfdiskコマンドでもOKです。

■ボリュームラベルの作成
partedコマンドのmklabel オプションでmsdosを指定するとMBRになります。他gptがあります。

 

[root@host1 ~]# parted /dev/sdc mklabel msdos
Information: You may need to update /etc/fstab.

…infomationの行はpartedコマンドを実行すると出てきますが無視して大丈夫です。

 

■プライマリパーティションの作成

タイプprimaryのパーティション1を201MBで作成します。


[root@host1 ~]# parted /dev/sdc mkpart primary 1 201m
Information: You may need to update /etc/fstab.

 

»printオプションでプライマリパーティションが作成されたかを確認

[root@host1 ~]# parted /dev/sdc print
Model: VMware Virtual disk (scsi)
Disk /dev/sdc: 2147MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start     End      Size     Type      File system Flags
1           1049kB 201MB 200MB primary
[root@host1 ~]#

 

1.PV(物理ボリューム)の作成

LVMでディスクの領域を使うにあたっては、予めPVとしてその領域を予約して起きます。

 

pvcreateコマンドで、領域を設定します。複数PVに設定する場合はスペース区切りでデバイス名を指定します。ここでは、/dev/sdbと/dev/sdc1(パーティション)です。
※オプション-vをつけるとy/nのプロンプトをyで通してくれるので便利です。

 

[root@host1 ~]# pvcreate -v /dev/sdb /dev/sdc1
WARNING: Device for PV kz10h1-geHB-RDlB-Edi1-7S4K-rwfh-l3RN5D not found or rejected by a filter.
Wiping internal VG cache
Wiping cache of LVM-capable devices
WARNING: Device for PV kz10h1-geHB-RDlB-Edi1-7S4K-rwfh-l3RN5D not found or rejected by a filter.
Wiping signatures on new PV /dev/sdb.
Wiping signatures on new PV /dev/sdc1.
Set up physical volume for "/dev/sdb" with 4194304 available sectors.
Zeroing start of device /dev/sdb.
Writing physical volume data to disk "/dev/sdb".
Physical volume "/dev/sdb" successfully created.
Set up physical volume for "/dev/sdc1" with 391168 available sectors.
Zeroing start of device /dev/sdc1.
Writing physical volume data to disk "/dev/sdc1".
Physical volume "/dev/sdc1" successfully created.
[root@host1 ~]#

 

»PV作成後の確認
[root@host1 ~]# pvs
WARNING: Device for PV kz10h1-geHB-RDlB-Edi1-7S4K-rwfh-l3RN5D not found or rejected by a filter.
PV VG Fmt Attr PSize PFree
/dev/sda2 vg00 lvm2 a--   11.19g     8.00m
/dev/sdb            lvm2 ---     2.00g      2.00g
/dev/sdc1          lvm2 --- 191.00m 191.00m
[root@host1 ~]#

 


2.VG(ボリューム・グループ)作成

VG作成もvgcreateでPVを指定してあげるだけなんですけど、今回は、オプション-sを使用してエクステントのサイズを16MBで設定しました。エクステントはLV(論理VOL)に割り当てる際の最小単位となります。デフォルトは4MBですね。ランダムアクセスが多いときは小さいほうがいいですし、シーケンシャルアクセスが多いときは大きい方がいいと思いますが、特にこれと言った感じでもなければ、デフォルトで良いかと。オプション-vは例のy/nのプロンプトをyで通してくれるので便利なやつです。


[root@host1 ~]# vgcreate -s 16 vg01 /dev/sdb /dev/sdc1 -v
WARNING: Device for PV kz10h1-geHB-RDlB-Edi1-7S4K-rwfh-l3RN5D not found or rejected by a filter.
Wiping internal VG cache
Wiping cache of LVM-capable devices
WARNING: Device for PV kz10h1-geHB-RDlB-Edi1-7S4K-rwfh-l3RN5D not found or rejected by a filter.
Wiping signatures on new PV /dev/sdb.
Wiping signatures on new PV /dev/sdc1.
Adding physical volume '/dev/sdb' to volume group 'vg01'
Adding physical volume '/dev/sdc1' to volume group 'vg01'
Archiving volume group "vg01" metadata (seqno 0).
Creating volume group backup "/etc/lvm/backup/vg01" (seqno 1).
Volume group "vg01" successfully created
[root@host1 ~]#

 

» VG作成後の確認 
[root@host1 ~]# vgs    ...VGの情報
VG #PV #LV #SN Attr VSize VFree
vg00 1  3  0  wz--n- 11.19g 8.00m
vg01 2  0  0  wz--n- 2.16g 2.16g
[root@host1 ~]#

[root@host1 ~]# pvs   ...PVの情報
WARNING: Device for PV kz10h1-geHB-RDlB-Edi1-7S4K-rwfh-l3RN5D not found or rejected by a filter.
PV VG Fmt Attr PSize PFree
/dev/sda2 vg00 lvm2 a-- 11.19g 8.00m
/dev/sdb  vg01 lvm2 a-- 1.98g 1.98g
/dev/sdc1   vg01 lvm2 a-- 176.00m 176.00m
[root@host1 ~]#

 

[root@host1 ~]# vgdisplay -v vg01   ...VGの詳細 ※-vをつけると詳細表示
--- Volume group ---
VG Name vg01
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 2.16 GiB
PE Size 16.00 MiB
Total PE 138
Alloc PE / Size 0 / 0
Free PE / Size 138 / 2.16 GiB
VG UUID qeYXfr-Yfs6-dEdO-Werb-1Iji-3E8p-3M2ILl

--- Physical volumes ---
PV Name /dev/sdb
PV UUID RcjuXH-9LAj-oxKA-HhM3-1rFf-Aolm-XnH82s
PV Status allocatable
Total PE / Free PE 127 / 127

PV Name /dev/sdc1
PV UUID D1ODWI-9Nml-ZTWY-rRe0-H3YA-aUQ9-ovGlMf
PV Status allocatable
Total PE / Free PE 11 / 11


3.LV(論理ボリューム)作成

 LVの作成はlvcreateで行います。サイズ指定はオプション-Lになります。単位を付けないとMB指定になります。

 

1つ目のLVを600MBで、vg01上に作成します。

 

[root@host1 ~]# lvcreate -L 600 vg01 -v
Rounding up size to full physical extent 608.00 MiB
Archiving volume group "vg01" metadata (seqno 1).
Creating logical volume lvol0
Creating volume group backup "/etc/lvm/backup/vg01" (seqno 2).
Activating logical volume vg01/lvol0.
activation/volume_list configuration setting not defined: Checking only host tags for vg01/lvol0.
Creating vg01-lvol0
Loading vg01-lvol0 table (253:3)
Resuming vg01-lvol0 (253:3)
Wiping known signatures on logical volume "vg01/lvol0"
Found existing signature on /dev/vg01/lvol0 at offset 536: LABEL="(null)" UUID="kz10h1-geHB-RDlB-Edi1-7S4K-rwfh-l3RN5D" TYPE="LVM2_member" USAGE="raid"
WARNING: LVM2_member signature detected on /dev/vg01/lvol0 at offset 536. Wipe it? [y/n]:    …-vをつけたのに出てしまいました。。。
Accepted input: [y]
Wiping LVM2_member signature on /dev/vg01/lvol0.
Initializing 4.00 KiB of logical volume "vg01/lvol0" with value 0.
Logical volume "lvol0" created.
[root@host1 ~]#

 

2つ目のVLを作成します。

今度はサイスを1.2GB(単位をgで)で、オプション-nで名前をtestVolにして作成します。

 

[root@host1 ~]# lvcreate -L 1.2g -n testVol vg01
Rounding up size to full physical extent 1.20 GiB
Logical volume "testVol" created.
[root@host1 ~]#

2度目以降のLV作成は、メッセージが少ないですね。

 

» LV作成後の確認 

[root@host1 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home vg00 -wi-ao---- 956.00m
root vg00 -wi-ao---- 9.31g
swap vg00 -wi-ao---- 956.00m
lvol0 vg01 -wi-a----- 608.00m
testVol vg01 -wi-a----- 1.20g


[root@host1 ~]# lvscan
ACTIVE '/dev/vg01/lvol0' [608.00 MiB] inherit
ACTIVE '/dev/vg01/testVol' [1.20 GiB] inherit
ACTIVE '/dev/vg00/root' [9.31 GiB] inherit
ACTIVE '/dev/vg00/home' [956.00 MiB] inherit
ACTIVE '/dev/vg00/swap' [956.00 MiB] inherit
[root@host1 ~]#

 

[root@host1 ~]# lvdisplay /dev/vg01/lvol0
--- Logical volume ---
LV Path /dev/vg01/lvol0
LV Name lvol0
VG Name vg01
LV UUID cXdAjp-ajia-S8rI-3xUi-naqx-wS1a-D2sMcj
LV Write Access read/write
LV Creation host, time host1.example.com, 2018-02-02 15:19:55 +0900
LV Status available
# open 0
LV Size 608.00 MiB
Current LE 38
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3

[root@host1 ~]#

 


[root@host1 ~]# lvdisplay /dev/vg01/testVol
--- Logical volume ---
LV Path /dev/vg01/testVol
LV Name testVol
VG Name vg01
LV UUID nnmIZp-Ldse-tUVh-xwB8-nOkK-XklO-utD1kt
LV Write Access read/write
LV Creation host, time host1.example.com, 2018-02-02 15:22:44 +0900
LV Status available
# open 0
LV Size 1.20 GiB
Current LE 77
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:4
[root@host1 ~]#

 

 

以上でした。

ユーザがログインできないとき

小ネタです。

なんかしらの原因でログインできないときの確認方法と解除方法です。

前に、ユーザ管理をやりましたが補足です。

linlinrh.hatenadiary.jp

アカウントロックの場合

ロックがかかっていないかを確認します。

[root@host1 ~]# passwd -S mary
mary LK 2018-01-12 0 99999 7 -1 (Password locked.)
[root@host1 ~]#

ロックされていると、lockedになります。

 

アンロックします。
[root@host1 ~]# passwd -u mary
Unlocking password for user mary.
passwd: Success
[root@host1 ~]#

ロックが解除されたか確認します。
[root@host1 ~]# passwd -S mary
mary PS 2018-01-12 0 99999 7 -1 (Password set, SHA512 crypt.)
[root@host1 ~]#

setに変わってロックが解除されます。

 

ユーザの利用期限を超えている場合

ユーザがどんな状況になっているかを、rootでログインして確認してみます。chageコマンドの-lオプションでみてみると。

[root@host1 ~]# chage -l hanako
Last password change : Jan 12, 2018
Password expires : never
Password inactive : never
Account expires : Dec 31, 2017
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
[root@host1 ~]#

2017年の大晦日にアカウント期限が切れています。

 

解除するには、-Eオプションに-1を指定します。


[root@host1 ~]# chage -E -1 hanako

 

もう一度確認してみます。
[root@host1 ~]# chage -l hanako
Last password change : Jan 12, 2018
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
[root@host1 ~]#

neverになりまして復活です。

 

ではでは。

今更ですが、FTPを使ってみる。

SSHが入っていれば、SFTPとかSCPが使えるわけですが、Network スイッチのファームウェアやコンフィグをおいたり、PXEブートの参照先としてFTPが使いたいということもあろうかと思うのでやってみたいと思います。

Windowsでもいいんでしょうけど、Linuxのほうがなんとなく簡単な気がします。

 

インストール

前回もやりましたけど、

linlinrh.hatenadiary.jp

yumを使うと便利ですね。もちろんrpmでもできないことはないですが、パッケージの依存関係のメッセージが出たりして大変だったりします。

[root@host1 local]# yum install -y vsftpd

Installed:

 vsftpd.x86_64 0:3.0.2-21.el7

 

Complete!

[root@host1 local]#

すでにインストールされているかどうかの確認であれば

# yum list installed |grep ftpd

リポジトリに入っているかどうかの確認であれば

# yum list available |grep ftpd

というのでチェックできます。

 

ftpサービスの起動

RHEL7からは、サービス関係の制御ではsystemctlを使用します。

[root@host1 ~]# systemctl start vsftpd
[root@host1 ~]#

 

エラーが出てないでの立ち上がっているかとは思いますが、念の為、起動状況も確認します。

[root@host1 ~]# systemctl status vsftpd
??sftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2018-01-12 09:15:17 JST; 29s ago
Process: 8204 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
Main PID: 8205 (vsftpd)
CGroup: /system.slice/vsftpd.service
??8205 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

Jan 12 09:15:17 host1.example.com systemd[1]: Starting Vsftpd ftp daemon...
Jan 12 09:15:17 host1.example.com systemd[1]: Started Vsftpd ftp daemon.
[root@host1 ~]#

 

余談ですが、RHEL6で使用していたserviceコマンドも使えたりします。

[root@host1 ~]# service vsftpd status
Redirecting to /bin/systemctl status vsftpd.service
??sftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2018-01-12 09:15:17 JST; 3min 43s ago
Process: 8204 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
Main PID: 8205 (vsftpd)
CGroup: /system.slice/vsftpd.service
??8205 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

Jan 12 09:15:17 host1.example.com systemd[1]: Starting Vsftpd ftp daemon...
Jan 12 09:15:17 host1.example.com systemd[1]: Started Vsftpd ftp daemon.
[root@host1 ~]#

 

firewallでftpを許可

これも前にやりましたが、

linlinrh.hatenadiary.jp

RHEL7からはfirewalldで制御します。RHEL6まではiptablesですね。

[root@host1 ~]# firewall-cmd --permanent --add-service=ftp
success[root@host1 ~]#

 

一時的に開けるだけなら --parmanentオプションは不要です。また、--parmanentを指定した場合は、サービスの再起動が必要です。

[root@host1 ~]# firewall-cmd --reload
success
[root@host1 ~]#

 

ftp用のユーザ設定

 

デフォルトの状態であれば、ブラックリストに載っていないLinuxのユーザであれば入れます。 

Windowsコマンドプロンプトftpコマンドからだとこんな感じになります。

C:\>ftp 192.168.0.125
Connected to 192.168.0.125.
220 (vsFTPd 3.0.2)
User (192.168.0.125:(none)): hanako
331 Please specify the password.
Password: ...パスワードを入力
230 Login successful.
ftp>

successfulになっていればOKですね。

 

ちなみに、ブラックリストは次のファイルです。
[root@host1 ~]# cat /etc/vsftpd/ftpusers

root
bin
daemon

ここに、ftpで使われたくないユーザを書き込めばログインできなくなります。rootは使ってほしくないユーザNo.1なのでデフォルトで入っていますね。

 

 

デフォルトでanonymousも有効

ftpクライアントで、さっき入ったユーザのセッションを閉じて、anonymousで入ったら入れました。

 

ftp> close
221 Goodbye.
ftp> open 192.168.0.125
Connected to 192.168.0.125.
220 (vsFTPd 3.0.2)
User (192.168.0.125:(none)): anonymous
331 Please specify the password.
Password:
230 Login successful.

どのディレクトリにいるのかとpwdを実行するとなんと/(ルート)なのですが、

ftp> pwd
257 "/"

そこは流石にOSのルートなはずもなく、実際は/var/ftpディレクトリとなります。

 

ユーザホーム以外へのftpアクセスについて

anonymousにファイルを公開するんであれば、このフォルダ配下にアップロードするユーザがアクセスできるフォルダを作っておけばいいですね。

と思ったんですけど、実際に/var/ftp配下にディレクトリを作って、所有者を変更後にftpでputとかmkdirをしても、errorで帰ってきてしまいました。

 

/var/log/messagesをみてみると、SELinuixが何やら拒否している形跡が。。

Jan 12 16:37:44 host1 setroubleshoot: SELinux is preventing vsftpd from write access on the directory share. For complete SELinux messages. run sealert -l 200a3b32-e9d4-4eef-b1c3-e0c16047367c
Jan 12 16:37:44 host1 python: SELinux is preventing vsftpd from write access on the directory share.#012#012***** Plugin allow_anon_write (53.1 confidence) suggests ******************#012#012If you want to allow vsftpd to be able to write to shared public content#012Then you need to change the label on share to....

 

どうやら、SE Linuxは、デフォルトでftp経由でのユーザのホームディレクトリ以外へのアクセスを制限しているらしく、解除してあげないと行けないらしく次のコマンドを実行したら解決しました。

# setsebool -P allow_ftpd_full_access

 

なんか、あっさりできるかなぁと思ったら案外いろいろありますね。

 

手っ取り早くFTPしたいときは、3d daemonですかね。

www.infraexpert.com

でも本家からのダウンロードはできない模様ですが。。

ローカルにyumのリポジトリを作る。

前回DVDをyumリポジトリ登録するというのをやりましたけど、

linlinrh.hatenadiary.jp

多分インストールメディアはみんなでシェアすると思うので、そんなに長くは借りれないはずなので、サーバのローカルにおいてレポジトリ化すると言うのをやってみます。

DVDからパッケージをコピー

まず、DVDのパッケージを保存しておくフォルダを作成してDVDからコピーします。

[root@host1 ~]# mkdir -p /var/local && cd /var/local
[root@host1 local]# cp /mnt/Packages/* /var/local  

 

リポジトリの作成

コピーしたパッケージを読み込んでリポジトリを作るcreaterepoを実行しますが、とりあえずインストールされているか確認してみます。

[root@host1 yum.repos.d]# yum list installed |grep createrepo
createrepo.noarch 0.9.9-28.el7 @rhel-7-server-rpms
[root@host1 yum.repos.d]#

出てくれば、インストール済みです。多分入っているとは思いますが。。

 

入っていないときには、インストールしてください。

DVDのリポジトリが有効な場合は、yumからインストールできますし、

[root@host1 local]# yum -y install createrepo

リポジトリがない場合は、findでDVDからrpmを見つけてインストールします。

[root@host1 yum.repos.d]# find /mnt/Packages/ |grep createrepo
/mnt/Packages/createrepo-0.9.9-26.el7.noarch.rpm
[root@host1 yum.repos.d]#
[root@host1 yum.repos.d]# rpm -ivh /mnt/Packages/createrepo-0.9.9-26.el7.noarch.rpm

 

でもって、リポジトリの作成をします。

[root@host1 local]# createrepo -v /var/local

Worker 1: reading zziplib-0.13.62-5.el7.i686.rpm

Worker 0: reading zziplib-0.13.62-5.el7.x86_64.rpm

Workers Finished

Saving Primary metadata

Saving file lists metadata

Saving other metadata

Generating sqlite DBs

Starting other db creation: Thu Jan 11 13:49:35 2018

Ending other db creation: Thu Jan 11 13:49:36 2018

Starting filelists db creation: Thu Jan 11 13:49:37 2018

Ending filelists db creation: Thu Jan 11 13:49:39 2018

Starting primary db creation: Thu Jan 11 13:49:40 2018

Ending primary db creation: Thu Jan 11 13:49:42 2018

Sqlite DBs complete

[root@host1 local]#

 

yumの設定ファイルを作成

プロンプトが帰ってきたら、ディレクトリにリポジトリのファイルができているかを確認します。

[root@host1 local]# ll /var/local/repodata

total 14444

-rw-r--r--. 1 root root 1853328 Jan 11 13:49 35cf830f57db22a70b3be5163c918ac83a78ed923f9630f0478dfc0dde9b9815-primary.xml.gz

[root@host1 local]#

あとは、yumのデーモンが読み込む設定ファイルを作成します。

[root@host1 local]# vi /etc/yum.repos.d/local.repo

==記述例===

[local]
name=local repo
baseurl=file:///var/local/
enabled=1
gpgcheck=0

=========

DVDのリポジトリファイルが有れば、流用してもいいかもです。あと、DVDのファイルの方は使わなくなるので消しておきます。

 

yumキャッシュの再作成

DVDのリポジトリのキャッシュを一旦クリアします。

[root@host1 yum.repos.d]# yum clean all

Cleaning repos: local

Cleaning up everything

 

リポジトリのリストを取得すると、新しい設定ファイルから再度キャッシュします。

 

[root@host1 local]# yum -v repolist

Setting up Package Sacks

pkgsack time: 0.002

Repo-id      : local

Repo-name    : local repo

Repo-revision: 1515646125

Repo-updated : Thu Jan 11 13:49:42 2018

Repo-pkgs    : 4,751

Repo-size    : 3.1 G

Repo-baseurl : file:///var/local/

Repo-expire  : 21,600 second(s) (last: Thu Jan 11 15:49:36 2018)

 Filter     : read-only:present

Repo-filename: /etc/yum.repos.d/local.repo

 

repolist: 4,751

[root@host1 local]#

 

yumの動作確認

試しにftpをインストールしてみます。

[root@host1 local]# yum install -y vsftpd

Installed:

 vsftpd.x86_64 0:3.0.2-21.el7

 

Complete!

[root@host1 local]#

 

おまけ

Red Hatサブスクリプションが設定されると、インターネット経由でのRed Hatから提供されているリポジトリが登録されますので、ローカルで完結したいときには、サブスクリプションを解除します。

[root@host1 local]# subscription-manager unsubscribe --all
1 subscription removed at the server.
1 local certificate has been deleted.
[root@host1 local]#

詳しいことは下記を参照ください。

5.3.2. コマンドラインを使用したサブスクリプションのアタッチと削除 - Red Hat Customer Portal

 

ではでは。

 

 

ホームディレクトリの移行。

ユーザを作成する際にホームディレクトリ を惰性で作ってしまったはいいけれど、あとでちゃんとした場所に収めたいと言うことがあるのではないかと思いまして、今回はホームディレクトリの引っ越しをやってみたいと思います。

ユーザhanakoは、/home/hanakoがホームディレクトリになっておりまして、新たに/home/testdir2を作成してそちらに引っ越します。

始めにディレクトリを作成します。(mvとかcpでも元ディレクトリを利用してもいいですが、アクセス権の設定も説明したいので新規作成します。)

[root@host1 ~]# cd /home
[root@host1 home]# mkdir testdir2
[root@host1 home]# ll   …ls -lのエイリアスでですね。


drwxr-xr-x. 2 root root 6 Jan 10 14:55 testdir2

作ったディレクトリは、所有ユーザ所有グループがrootになっているので、どちらhanakoへ変更します。
[root@host1 home]# chown hanako testdir2/
[root@host1 home]# chgrp hanako testdir2/

[root@host1 home]# ll

drwx------. 3 hanako hanako 78 Dec 27 17:01 hanako

drwxr-xr-x. 2 hanako hanako 6 Jan 10 14:55 testdir2

ホームディレクトリと同じになってますね。

 

このままだと、まだ元のディレクトリの方をユーザが使用しているので、
(その辺の設定は、/etc/passwdに記載されていますので、grepコマンドなどでファイルを見るとどのディレクトリを使っているかがわかります。)

[root@host1 home]# grep hanako /etc/passwd
hanako:x:1013:1014::/home/hanako:/bin/bash

 

新しく作成したディレクトリをホームに設定し直します。usermodコマンドを使用します。(もちろん、/etc/passwdをviで書き換えてもOKです。)

[root@host1 home]# usermod -d /home/testdir2/ hanako
[root@host1 home]#
[root@host1 home]# grep hanako /etc/passwd
hanako:x:1013:1014::/home/testdir2/:/bin/bash

もう一度/etc/passwdを確認すると/home/testdir2/に変わっていますので、念の為、suでユーザhanakoに入ってみます。

[root@host1 home]#
[root@host1 home]# su - hanako
Last login: Wed Jan 10 15:30:52 JST 2018 on pts/0
-bash-4.2$
-bash-4.2$ pwd
/home/testdir2/
-bash-4.2$

ログイン直後のpwdの結果、/home/testdir2/におりますので、ホームディレクトリとして設定されたのだなぁと。


ちなみに、存在しないディレクトリで指定しても、コマンドは通ります。
root@host1 home]# usermod -d /home/testdir22/ hanako
[root@host1 home]#


でも、ログインすると怒られます。
[root@host1 home]# su - hanako
su: warning: cannot change directory to /home/testdir22/: No such file or directory
-bash-4.2$ pwd
/home
-bash-4.2$

 

 

今のホームディレクトリをそのまま移動して使いたいときは、-mオプションを使います。(普通はこちらを使うことが多いかなぁと。)


[root@host1 home]# grep hanako /etc/passwd
hanako:x:1013:1014::/home/testdir2/:/bin/bash
[root@host1 home]#
[root@host1 home]# usermod -d /home/testdir22/ -m hanako
[root@host1 home]#
[root@host1 home]# ll

drwxr-xr-x. 4 hanako hanako 56 Jan 10 15:33 testdir22

[root@host1 home]#

もともとtestdir2だったのが、testdir22に変わっています。。

そして、/etc/passwdの内容も書き換わります。

[root@host1 home]# grep hanako /etc/passwd
hanako:x:1013:1014::/home/testdir22/:/bin/bash

 

おまけ。。


他のユーザにRead/Writeのアクセス権を与えたいときは、グループアクセス権を設定します。

chmodのはアクセス権を変更するコマンドです。
アクセス権の話は後ほどまた何処かでやるかもしれないですが、とりあえず760と指定すると、

所有ユーザ :読取-4,書込-2,実行-1(合計:7
所有グループ読取-4,書込-2,実行-0(合計:6
その他ユーザ:読取-0,書込-0,実行-0(合計:0

と言ったアクセス制御を行うことができます。


[root@host1 home]# chmod 760 /home/testdir22/
[root@host1 home]# ll

drwxrw----. 4 hanako hanako 56 Jan 10 15:33 testdir22

[root@host1 home]#

このようにグループのアクセス権に対して読取/書込(rw-)が付きまして、その他のアクセス権が消えました(---)ね!


後は、taroをhanakoのグループに参加させれば完了です。
[root@host1 home]# id taro
uid=1010(taro) gid=1011(taro) groups=1011(taro)
[root@host1 home]#

いまユーザtaroはグループtaroにだけ所属しておりますので、グループhanakoも追加します。


[root@host1 home]# usermod -G taro,hanako taro
[root@host1 home]#

前回やりましたけど、グループを追加する場合でも既存のグループも記載しないといけません。書かれていないグループは消えてしまいます。。


[root@host1 home]# id taro
uid=1010(taro) gid=1011(taro) groups=1011(taro),1014(hanako)
[root@host1 home]#

 

ではでは。

ユーザの管理

ユーザの管理で使用する一般的なコマンドをご案内します。

 

ユーザ作成:useradd

ユーザ作成時に適用されるデフォルトの値を確認するには、オプション-Dを指定します。

[root@host1 ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@host1 ~]#

 

実際にユーザを作成してみます。パスワードも設定する場合は、オプション-pです。

[root@host1 ~]# useradd Taro -p Abcd123$

[root@host1 ~]#

 

作成されたユーザを確認してみます。

[root@host1 ~]# id Taro
uid=1009(Taro) gid=1010(Taro) groups=1010(Taro)
[root@host1 ~]#

※UserID:1009、GroupID:1010で作成されていることがわかります。

 

[root@host1 ~]# finger Taro
Login: Taro Name:
Directory: /home/Taro Shell: /bin/bash
Never logged in.
No mail.
No Plan.
[root@host1 ~]#

ホームディレクトシェルがわかります。

※fingerコマンドはデフォルトで入っていなかったので、yumでインストールしました。

 

基本、Linuxのユーザは、次のファイルに追記されています。


[root@host1 ~]# grep Taro /etc/passwd
Taro:x:1009:1010::/home/Taro:/bin/bash
[root@host1 ~]#

※UserIDとGroupID、ホームディレクトリ、シェルが記載されていますね。


[root@host1 ~]# grep Taro /etc/shadow
Taro:Abcd123$:17527:0:99999:7:::
[root@host1 ~]#

※パスワードが見えますね。/etc/passwdと/etc/shadowはUserName(Taro)でリンクされています。

 

また、パスワードのポリシーは下記のコマンドで確認できます。

[root@host1 ~]# chage -l Taro
Last password change : Dec 27, 2017
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
[root@host1 ~]#

 

ユーザ情報を変更してみる。

セカンダリグループを変えてみる。

useraddのオプション-Gを使って、所属するグループ名を指定します。

[root@host1 ~]# usermod -G dba Taro
[root@host1 ~]#
[root@host1 ~]# id Taro
uid=1009(Taro) gid=1010(Taro) groups=1010(Taro),1009(dba)
[root@host1 ~]#

※1009(dba)が追加されました。

ただ、/etc/passwdでは、追加したグループが見えてきません。

[root@host1 ~]# grep Taro /etc/passwd
Taro:x:1009:1010::/home/Taro:/bin/bash
[root@host1 ~]#

セカンダリグループの情報は、/etc/groupに記載されます。

[root@host1 ~]# grep Taro /etc/group
dba:x:1009:larry,gary,Taro
Taro:x:1010:
[root@host1 ~]#

※dbaに対して、Taroが割り当てられています。

 

 

ちなみに、追加したセカンダリグループの削除は、””(ブランク)を指定します。

[root@host1 ~]# usermod -G "" Taro
[root@host1 ~]# id Taro
uid=1009(Taro) gid=1010(Taro) groups=1010(Taro)
[root@host1 ~]#

1009(dba)が消えました。


複数のセカンダリグループに参加していた場合は、削除したいグループを抜いた形で指定します。

 

一旦、複数のセカンダリーグループにTaroを追加。

[root@host1 ~]# usermod -G dba,harry,barry Taro
[root@host1 ~]# id Taro
uid=1009(Taro) gid=1010(Taro) groups=1010(Taro),1004(barry),1005(harry),1009(dba)
[root@host1 ~]#

セカンダリグループからdbaだけを削除

[root@host1 ~]# usermod -G harry,barry Taro
[root@host1 ~]# id Taro
uid=1009(Taro) gid=1010(Taro) groups=1010(Taro),1004(barry),1005(harry)
[root@host1 ~]#

結論としては、グループを削除しているのではなく参加するグループを指定し直しているだけの動きとなります。

 

パスワードのポリシーを変えてみる。

パスワードのポリシーを変えるには、chageコマンドを使用します。

ユーザを作成した時は、パスワード期限が決められていないので、設定してみます。


[root@host1 ~]# chage -E 2017-12-31 Taro
[root@host1 ~]#
[root@host1 ~]# chage -l Taro
Last password change : Dec 27, 2017
Password expires : never
Password inactive : never
Account expires : Dec 31, 2017
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
[root@host1 ~]#

※期限が変わりました。

プロンプトの表示形式の環境変数「PS1」をひたすら変えてみた。

プロンプトの表示を変更できる環境変数PS1ですが、いろいろと変更できるようなので、一通り打って表示してみました。

まずは、最後にもとに戻せるように今の値を控えておきました。


[root@host1 ~]# echo $PS1
[\u@\h \W]\$
[root@host1 ~]#

 

\u :ログインユーザ名 -->root

\h:ホスト名。最初の.(ドット)まで -->host1

\W:カレントディレクトリ(ワーキングディレクトリ) -->~(ユーザホームDir)

が入ってますね。

 

書式の一覧はこちらを参考にしました。

bashのプロンプトを変更するには

 

また、書式はたくさんあるので忘れてしまったときは、bashのmanで確認することもできます。

[root@host1 ~]# man bash

manの中でpromptingで検索して、"n"(次検索)を何回か押してるとと出てきます。

/prompting

f:id:linlinrh:20171114115651p:plain

 

 

 

基本的には、PS1="書式"と打てばプロンプトに反映されます。
試しに$のプロンプトに変えるには、

[root@host1 ~]# PS1="$ " 

となります。

 

以下、他の書式に変えてみた結果です。


$ PS1="\d "  ...日付に変更(「曜 日 月 日」の形式)
Tue Nov 14


Tue Nov 14 PS1="\a "  ...ベル文字 - Wikipediaを表示する?

   ...何にも表示されてません。ビープ音鳴らしてくれるみたいです。


PS1="\e "  ...エスケープ文字 - Wikipediaを表示する

   ...何にも表示されてません。特殊文字をプロンプトに出したいときに前につけるのではと。

 

PS1="\h "  ...ホスト名。最初の.(ドット)まで
host1


host1 PS1="\H "   ...ホスト名。全部
host1.example.com


host1.example.com PS1="\n "  ...改行

  ...↑改行されて、この行から文字が打てます。

PS1="\r "   ...復帰?なんのことかはわかりませんでした。


PS1="\s "  ...シェル名を表示
-bash


-bash PS1="\t "  ...時刻表示「HH:MM:SS」。24H
21:20:37


21:20:37 PS1="\T "  ...時刻表示「HH:MM:SS」。12H
09:20:44


21:20:44 PS1="\@ "  ...時刻表示1「am/pm」。12H
09:21 AM 

 

09:21 AM PS1="\u "  ...ログインユーザ
root 

 

root PS1="\v "  ...bashのバージョン
4.2 

 

4.2 PS1="\V "  ... bashのリリース
4.2.46 


4.2.46 PS1="\w "  ...カレントディレクトリ。絶対バスで表示
~    ...ホーム配下のフォルダーへ移動
~ cd Videos/
~/Videos   ...ホームDirからの絶対パスで表示されました。
~/Videos cd /etc  .../etcに移動してみると。
/etc   ...絶低パスで表示


/etc PS1="\W "  ...カレントディレクトリ。絶対パスなし。
etc   .../(スラッシュ)が表示されなくなりました。
etc cd  ...ホームDirへと。


~ PS1="\! "   ...このコマンドの履歴番号
493 
493   ...改行だけだとカウントアップしません。

 

493 PS1="\# "  ...コマンド番号(現在セッション中の実行回数)

85 


85 PS1="\111 "  ...8進数nnnに対応する文字
I   ...適当に111を入れたらI(インドのアイ)になりました。


I PS1="\\ "  ...バックスラッシュを表示(手前の\はエスケープ文字ですね。)
\ 


\ PS1="[ "  ...括弧
[ PS1="] "  ...括弧閉じ
]


] PS1="[\u@\h \W]\$"  ...もとに戻して終わりです。
[root@host1 ~]$

 

以上でした。。。