適応障害で退職、そして転職へ

40代、元システムエンジニアの日記です。 適応障害、転職活動など日々のことを書いています。

【Linux】ディレクトリにファイルが作れない・コピーできない原因

f:id:kzms4126:20180924140323j:plain

Linuxでディレクトリにファイルが作れない・コピーできない原因をまとめます。また実際にそのことを確認します。

注意!
パーティションの操作を誤るとデータを失います。
コマンドを実行する前にひと呼吸して確認を。

ディレクトリに書き込み権限がない

書き込み権限がないディレクトリに、touch コマンドで新規ファイル作成を試みます。

書き込み権限のないディレクトリの作成

[testuser@localhost ~]$ mkdir -v -m=500 testdir
mkdir: ディレクトリ `testdir' を作成しました
[testuser@localhost ~]$ ls -ld testdir
dr-x------. 2 testuser users 6 10月  6 11:50 testdir

作成したディレクトリに新規ファイルを作成

[testuser@localhost ~]$ cd testdir/
[testuser@localhost testdir]$ touch testfile
touch: `testfile' に touch できません: 許可がありません

新規ファイルが作成できないことを確認できました。

ディスク空き容量が足りない

パーティションを作成し、ディスク空き容量より大きいファイルのコピーを試みます。

パーティションとファイルシステムの作成

1GiBのパーティションにxfsファイルシステムを作成します。

[root@localhost ~]# parted /dev/sdb -s mkpart primary 1MiB 1GiB
[root@localhost ~]# parted /dev/sdb -s print
モデル: Msft Virtual Disk (scsi)
ディスク /dev/sdb: 4295MB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始    終了    サイズ  ファイルシステム  名前     フラグ
 1    1049kB  1074MB  1073MB  xfs               primary

[root@localhost ~]# mkfs -t xfs -f /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=65472 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=261888, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=1605, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

作成したファイルシステムをマウント

[root@localhost ~]# mount -t xfs /dev/sdb1 /mnt/test
[root@localhost ~]# df
ファイルシス            1K-ブロック    使用   使用可 使用% マウント位置
(途中省略)
/dev/sdb1                   1041132   32992  1008140    4% /mnt/test

ディスク空き容量より大きいファイルを作成しコピー

[root@localhost ~]# dd if=/dev/zero of=testfile bs=1024KB count=1500
1500+0 レコード入力
1500+0 レコード出力
1536000000 バイト (1.5 GB) コピーされました、 0.598443 秒、 2.6 GB/秒
[root@localhost ~]# cp testfile /mnt/test/
cp: `/mnt/test/testfile' の書き込みエラー: デバイスに空き領域がありません
cp: `/mnt/test/testfile' の拡張に失敗しました: デバイスに空き領域がありません

ファイルコピーエラーが発生しました。/mnt/test にコピー途中のファイルが作成されました。

ディクスクォータを超えている

クォータを設定し、それを超えるようにファイルをコピーします。

クォータの適用

/etc/fstab ファイルのマウントオプションに「usrquota」を追加します。
[root@localhost ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Thu Jul 19 13:35:31 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
(途中省略)
/dev/sdb1    /mnt/test    xfs    defaults,usrquota 1 2
マウントオプションの変更を適用するため、ファイルシステムをアンマウントし再びマウントします。
[root@localhost ~]# umount /mnt/test
[root@localhost ~]# mount /mnt/test
quotacheck コマンドでクォータデータベースを初期化します。

xfsファイルシステムでは不要です。

XFS ファイルシステムでは、クォータ・データはファイルシステム・メタデータの一部であると見なされます。

quotaon コマンドでクォータを有効にします。

xfsファイルシステムでは不要です。

XFS ファイルシステムの場合、ファイルが uqnoenforce、gqnoenforce、または pqnoenforce オプションを使ってマウントされていない限り、クォータ・チェックがデフォルトで起動されます。xfs クォータを操作するには、xfs_quota コマンドで -x (expert の略) オプションを指定します。

クォータ制限のしきい値を設定

edquota コマンドを使ってクォータ制限のしきい値を設定します。
ソフト制限 10MB、ハード制限 20MBに設定します。(1 Block=1kバイト)
以上でクォータの適用は完了です。

[root@localhost ~]# edquota -u testuser

Disk quotas for user testuser (uid 1000):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sdb1                         0      10000      20000          0        0        0

クォータを超えるファイルの作成

[testuser@localhost test]$ dd if=/dev/zero of=test bs=15MB count=1
1+0 レコード入力
1+0 レコード出力
15000000 バイト (15 MB) コピーされました、 0.00736688 秒、 2.0 GB/秒
[testuser@localhost test]$ cat test test > test2
cat: 書き込みエラー: ディスク使用量制限を超過しました

書き込みエラーが発生しました。/mnt/test に書き込み途中のファイルが作成されました。

iノード(インデックスノード)に空きがない

iノードが枯渇した状態で新規ファイルを作成します。

パーティションとファイルシステムの作成

[root@localhost ~]# parted /dev/sdb -s mkpart primary 1075MiB 2GiB
[root@localhost ~]# parted /dev/sdb -s print
モデル: Msft Virtual Disk (scsi)
ディスク /dev/sdb: 4295MB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始    終了    サイズ  ファイルシステム  名前     フラグ
 1    1049kB  1074MB  1073MB  xfs               primary
 2    1127MB  2147MB  1020MB  xfs               primary

[root@localhost ~]# mkfs -t xfs -f -i size=512,maxpct=1 /dev/sdb2
meta-data=/dev/sdb2              isize=512    agcount=4, agsize=62272 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=249088, imaxpct=1
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=1605, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

作成したファイルシステムをマウント

[root@localhost ~]# mount -t xfs /dev/sdb2 /mnt/test2
[root@localhost ~]# df -i
ファイルシス            Iノード I使用   I残り I使用% マウント位置
/dev/mapper/centos-root 8910848 86315 8824533     1% /
devtmpfs                 113501   379  113122     1% /dev
tmpfs                    116511     1  116510     1% /dev/shm
tmpfs                    116511   633  115878     1% /run
tmpfs                    116511    16  116495     1% /sys/fs/cgroup
/dev/sda1                524288   326  523962     1% /boot
/dev/sdb1                523776     6  523770     1% /mnt/test
tmpfs                    116511     1  116510     1% /run/user/0
/dev/sdb2                 19904     3   19901     1% /mnt/test2

大量のファイルを作成しiノードを枯渇させ、その状態で新規ファイルを作成

root@localhost test2]# touch {1..19901}.txt
[root@localhost test2]# df -i
ファイルシス            Iノード I使用   I残り I使用% マウント位置
/dev/mapper/centos-root 8910848 86316 8824532     1% /
devtmpfs                 113501   379  113122     1% /dev
tmpfs                    116511     1  116510     1% /dev/shm
tmpfs                    116511   633  115878     1% /run
tmpfs                    116511    16  116495     1% /sys/fs/cgroup
/dev/sda1                524288   326  523962     1% /boot
/dev/sdb1                523776     6  523770     1% /mnt/test
tmpfs                    116511     1  116510     1% /run/user/0
/dev/sdb2                 19904 19904       0   100% /mnt/test2

[root@localhost test2]# df
ファイルシス            1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/centos-root    17811456 5354428 12457028   31% /
devtmpfs                     454004       0   454004    0% /dev
tmpfs                        466044       0   466044    0% /dev/shm
tmpfs                        466044    6856   459188    2% /run
tmpfs                        466044       0   466044    0% /sys/fs/cgroup
/dev/sda1                   1038336  134588   903748   13% /boot
/dev/sdb1                   1041132   52964   988168    6% /mnt/test
tmpfs                         93212       0    93212    0% /run/user/0
/dev/sdb2                    989932   43696   946236    5% /mnt/test2

[root@localhost test2]# touch test.txt
touch: `test.txt' に touch できません: デバイスに空き領域がありません

新規ファイルが作成できないことを確認できました。

参考サイト

ディスククォータを設定する際に参考にしました。
www.ibm.com