mount가 장치 대신 /dev/loop0에 디렉토리를 마운트하는 이유는 무엇입니까? 해당 디렉토리에 모든 파일을 쓸 수는 없다는 사실이 밝혀졌습니다(너무 작기 때문에).

mount가 장치 대신 /dev/loop0에 디렉토리를 마운트하는 이유는 무엇입니까? 해당 디렉토리에 모든 파일을 쓸 수는 없다는 사실이 밝혀졌습니다(너무 작기 때문에).

100MB 파티션에 약 38MB의 파일을 쓰고 싶습니다. 그러나 파티션을 디렉터리에 마운트하면 해당 파티션이 /dev/loop0대신 마운트됩니다 /dev/sdc1 (예제에서는).

mv이는 이제 명령으로 장치에 38MB의 파일을 모두 쓸 수 없기 때문에 문제가 되는 것 같습니다 . 내가 한 일은 다음과 같습니다(아래는 내 사용 사례이지만 이것이 관련이 있는지 확실하지 않습니다).라즈베리 파이 3):

[slife pi]# fdisk /dev/sdc

Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): o
Created a new DOS disklabel with disk identifier 0x2ec21fb4.

Command (m for help): p
Disk /dev/sdc: 29.83 GiB, 32010928128 bytes, 62521344 sectors
Disk model: Card  Reader
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x2ec21fb4

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-62521343, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-62521343, default 62521343): +100M

Created a new partition 1 of type 'Linux' and of size 100 MiB.

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): c
Changed type of partition 'Linux' to 'W95 FAT32 (LBA)'.

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (206848-62521343, default 206848):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (206848-62521343, default 62521343):

Created a new partition 2 of type 'Linux' and of size 29.7 GiB.
Partition #2 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: y

The signature will be removed by a write command.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

[slife pi]# mkfs.vfat /dev/sdc1
mkfs.fat 4.1 (2017-01-24)
[slife pi]# ls
ArchLinuxARM-rpi-latest.tar.gz  ArchLinuxARM-rpi-latest.tar.gz.1  boot  root  unzipped
[slife pi]# mount /dev/sdc1 boot
[slife pi]# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0    10M  0 loop /mnt/pi/boot
sda      8:0    0   1.8T  0 disk
├─sda1   8:1    0   260M  0 part
├─sda2   8:2    0    16M  0 part
├─sda3   8:3    0   1.3T  0 part
├─sda4   8:4    0   873M  0 part
├─sda5   8:5    0    16G  0 part [SWAP]
├─sda6   8:6    0   512M  0 part /boot/EFI
└─sda7   8:7    0 570.2G  0 part /
sdc      8:32   1  29.8G  0 disk
├─sdc1   8:33   1   100M  0 part
└─sdc2   8:34   1  29.7G  0 part
sr0     11:0    1  1024M  0 rom
[slife pi]# mkfs.ext4 /dev/sdc2
mke2fs 1.45.4 (23-Sep-2019)
Creating filesystem with 7789312 4k blocks and 1949696 inodes
Filesystem UUID: e4033af0-dd50-4286-abc4-ea6982b21439
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

[slife pi]# mount /dev/sdc2 root
[slife pi]# bsdtar -xpf ArchLinuxARM-rpi-2-latest.tar.gz -C root
[slife pi]# sync
[slife pi]# mv root/boot/* boot
mv: error writing 'boot/kernel7.img': No space left on device
mv: cannot create directory 'boot/overlays': No space left on device
mv: error writing 'boot/start4cd.elf': No space left on device
mv: error writing 'boot/start4db.elf': No space left on device
mv: error writing 'boot/start4.elf': No space left on device
mv: error writing 'boot/start4x.elf': No space left on device
mv: error writing 'boot/start_cd.elf': No space left on device
mv: error writing 'boot/start_db.elf': No space left on device
mv: error writing 'boot/start.elf': No space left on device
mv: error writing 'boot/start_x.elf': No space left on device

보시다시피, mount /dev/sdc1 boot명령 후에는 /dev/loop0대신 설치되었습니다 /dev/sdc1. 결과적으로 이 작업을 수행했을 때 많은 파일이 mv root/boot/* boot반환되었습니다 .No space left on device

그렇다면 이러한 파일을 어떻게 올바르게 이동할 수 있습니까 /dev/sdc1?

다음은 디렉토리의 크기를 보여주는 du호출 입니다 root/boot(참고로 "unzipped"라는 디렉토리에 로컬로 내용의 압축을 풀었습니다).

[slife unzipped]# du boot
940 boot/overlays
38776   boot
[slife unzipped]# du -h boot
940K    boot/overlays
38M boot


/dev/sdc1편집(전체 경로를 명확히 하기 위해): to /mnt/pi/boot

/dev/sdc2to를 설치하려고 합니다 /mnt/pi/root(이것은 성공했습니다).

편집 2: 출력df -i /dev/sdc1

Filesystem      Inodes IUsed   IFree IUse% Mounted on
dev            2024406   546 2023860    1% /dev

편집 3: @telcoM이 요청한 명령 출력:

slife: ~ » losetup -l -a
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0         0      0         1  0 /dev/sdc1   0     512
slife: ~ » ls -l /dev/sdc1
-rw-r--r-- 1 root root 10485760 Dec 30 12:49 /dev/sdc1

답변1

장치 /dev/sdc1노드가 일반 10M 파일로 대체되었으며 이제 10M 파티션 이미지 파일로 작동합니다. 이는 일부 이전 명령의 오류로 인해 발생할 수 있습니다.

먼저 파일을 제거합니다.

umount /mnt/pi/boot
losetup -l -a
## if the output of the losetup command above is not empty, run this command:
losetup -r /dev/loop0

그런 다음 이미지 파일을 옆으로 옮깁니다.

mv /dev/sdc1 /tmp/sdc1-image-10M.ima

(아마도 이 파일은 쓸모가 없을 것 같으니 삭제하셔도 되지만, 후회하는 것보다는 안전이 더 낫습니다...)

이를 실제 블록 장치 노드로 교체하고(원하는 대로) 권한을 설정합니다. 이는 mknod최신 시스템에서 이 명령을 사용하는 몇 가지 이유 중 하나입니다.

mknod /dev/sdc1 b 8 33
chown root:disk /dev/sdc1
chmod 660 /dev/sdc1

mknod 명령의 매개변수는 다음과 같습니다.

  • 생성할 장치의 이름
  • 장치 유형: b= 블록 장치, c= 문자 장치.
  • 주요 장치 번호: lsblk출력 에서sdc1
  • 부 번호: 또한 lsblk출력 에서sdc1

이제 Access에서는 /dev/sdc1예상치 못한 이미지 파일이 아닌 실제 파티션을 다시 제공해야 합니다. 원래 mkfs.vfat명령은 실제 ​​파티션이 아닌 이미지 파일에 영향을 미치므로 이 작업을 다시 수행해야 합니다.

mkfs.vfat /dev/sdc1
mount /dev/sdc1 /mnt/pi/boot

그러면 다음을 계속할 수 있습니다.

mv /mnt/pi/root/boot/* /mnt/pi/boot

(명확성을 위해 전체 경로를 사용하고 있습니다. 물론 원하는 경우 현재 디렉터리에 비해 더 짧은 경로를 사용할 수도 있습니다.)

답변2

@telecoM이 말했듯 /dev/sdc1이 장치 노드별이 아닌 일반 10MB 파일입니다. 장치 노드가 자동으로 생성되므로 udev간단히 다음을 수행할 수 있습니다.

  1. 제거하다 /dev/sdc1:sudo rm /dev/sdc1
  2. SD 카드/썸 드라이브 제거
  3. SD 카드/썸 드라이브 삽입

관련 정보