【Linux】ディレクトリにファイルが作れない・コピーできない原因
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