![/proc/partitions 및 /sys/dev/block/의 값 단위는 무엇입니까?/크기?](https://linux55.com/image/151985/%2Fproc%2Fpartitions%20%EB%B0%8F%20%2Fsys%2Fdev%2Fblock%2F%EC%9D%98%20%EA%B0%92%20%EB%8B%A8%EC%9C%84%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%2F%ED%81%AC%EA%B8%B0%3F.png)
Android 기기의 샘플 emmc 블록 정보가 있습니다.
~에서
/proc/partitions
major minor #blocks name
179 1 5120 mmcblk0p1
/proc/partitions
내 작은 지혜로 파티션 1에 5120개의 블록이 있다고 나와 있으므로 블록을 사용한다고 가정합니다.
~에서
/sys/dev/block/179:0/mmcblk0p1/size
10240
/sys/…/size의 파티션 값은 /proc/partitions 값의 두 배인 것으로 보입니다. 그렇다면 왜 서로 다르며 단위는 무엇입니까?
답변1
/proc/partitions
1024바이트 블록의 크기를 표시합니다.
/sys/dev/block/*/*/size
512바이트 섹터의 크기를 표시합니다.
둘 다 장치의 논리적/물리적 블록/섹터 크기와 무관합니다.
먼저 proc(5)
맨페이지를 볼 수 있습니다.
/proc/partitions
각 파티션의 주 번호와 부 번호, 1024바이트 블록 수, 파티션 이름이 포함되어 있습니다.
두 번째는 반드시 녹음해야 합니다.어딘가에그러나 Linux 소스 코드를 직접 볼 수도 있습니다 block/partition-generic.c
.
ssize_t part_size_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct hd_struct *p = dev_to_part(dev);
return sprintf(buf, "%llu\n",(unsigned long long)part_nr_sects_read(p));
...
static DEVICE_ATTR(size, 0444, part_size_show, NULL);
/proc/partitions
그리고 정보를 생성하는 코드와 어떻게 관련되는지 block/genhd.c
:
static int show_partition(struct seq_file *seqf, void *v)
{
...
while ((part = disk_part_iter_next(&piter)))
seq_printf(seqf, "%4d %7d %10llu %s\n",
MAJOR(part_devt(part)), MINOR(part_devt(part)),
(unsigned long long)part_nr_sects_read(part) >> 1,
disk_name(sgp, part->partno, buf));
disk_part_iter_exit(&piter);
...
static const struct seq_operations partitions_op = {
...
.show = show_partition
둘 다 2로 나누기를 표현하는 것을 사용합니다 part_nr_sects_read()
(사용)./proc/partitions
>> 1
part_nr_sects_read()
장치의 섹터/블록 크기에 관계없이 항상 512바이트 섹터에 있는 검색된 nr_sects
필드 입니다. 예를 들어, 바이트 크기를 512로 나누는 함수 (동일한 필드 설정)를 사용하는 struct hd_struct
방법을 볼 수 있습니다 .drivers/block/nbd.c
set_capacity()
nr_sects
>> 9
static void nbd_size_update(struct nbd_device *nbd)
{
...
set_capacity(nbd->disk, config->bytesize >> 9);