设备文件的大小(ls -l输出中缺少)

阿比舍克·巴蒂亚(Abhishek Bhatia)

当我尝试打印设备文件时,输出以十六进制格式显示二进制数据。但是在做一个ls -l /dev/sda我得到:

brw-rw----  1 root disk      8,   0 Jan 29 12:29 /dev/sda

我不知道文件的实际大小是多少?这些数字是什么意思?

塞尔吉(Sergiy Kolodyazhnyy)

TL; DR:这就是开发人员实现的方式ls.c根据文件类型,长选项输出字符串的-l构建方式会有所不同。GNU文档未提及格式差异(请参阅有关OpenBSD手册页的附带说明)。

设备文件和ls源代码

/dev/sda是一个块设备(在本节的后面部分有说明)。它与常规文件不同。ls.c根据正在处理的文件类型构建长输出字符串。如下所示,对于块设备,与大小无关的内容不会附加到输出字符串!

ls.c 具有以下代码行:

   3757 static void
   3758 print_long_format (const struct fileinfo *f)
   3759 {

( partially omited )

   3868   if (f->stat_ok
   3869       && (S_ISCHR (f->stat.st_mode) || S_ISBLK (f->stat.st_mode)))
   3870     {
   3871       char majorbuf[INT_BUFSIZE_BOUND (uintmax_t)];
   3872       char minorbuf[INT_BUFSIZE_BOUND (uintmax_t)];
   3873       int blanks_width = (file_size_width
   3874                           - (major_device_number_width + 2
   3875                              + minor_device_number_width));
   3876       sprintf (p, "%*s, %*s ",
   3877                major_device_number_width + MAX (0, blanks_width),
   3878                umaxtostr (major (f->stat.st_rdev), majorbuf),
   3879                minor_device_number_width,
   3880                umaxtostr (minor (f->stat.st_rdev), minorbuf));
   3881       p += file_size_width + 1;
   3882     }
   3883   else
   3884     {
   3885       char hbuf[LONGEST_HUMAN_READABLE + 1];
   3886       char const *size =
   3887         (! f->stat_ok
   3888          ? "?"
   3889          : human_readable (unsigned_file_size (f->stat.st_size),
   3890                            hbuf, file_human_output_opts, 1,
   3891                            file_output_block_size));
   3892       int pad;
   3893       for (pad = file_size_width - mbswidth (size, 0); 0 < pad; pad--)
   3894         *p++ = ' ';
   3895       while ((*p++ = *size++))
   3896         continue;
   3897       p[-1] = ' ';
   3898     }

请注意,如果文件类型是S_ISCHR(字符设备,连续的数据流)或S_ISBLK(块设备,随机访问),则主设备号和次设备号被打印到字符数组p(本质上是一个字符串)。那是唯一附加到输出字符串的数据p但是,当我们分开时elsels了解到我们正在使用除块或字符设备以外的文件对于这些文件,它会将存储在size数组中的数据分配给该size数组的下一部分p(即while ((*p++ = *size++))部分)。

核心思想是ls知道正在查看的文件类型,并相应地建立输出

什么是设备文件?

本质上,它们是参考。它们是应用程序处理实际物理设备及其驱动程序的方式。例如,/dev/sda/dev/sr0(这是CD / DVD驱动器)。有些设备只是抽象的。例如,/dev/zero/dev/null,和/dev/random不是物理设备。它们是与内核进程交互的方式。

由于它们是引用,因此它们没有filesize是有意义的可以知道它们在/dev目录中占用的那些文件的大小,但是它们与它们所代表的实际设备不符!

因此,ls.c开发人员为什么以这种方式实现代码是可以理解的引用的文件大小是由于任何原因而不需要的时间的99.99%。

但是块设备(我们通常指硬盘驱动器和USB驱动器)是具有实际物理大小的物理设备,那么我们如何发现呢?

找出实际块设备的大小

下面的方法说明了如何找出`/ dev /中的块设备引用的硬盘/ ssd / USB驱动器的大小。

  • lsblk 或者 lsblk /dev/sda
  • sudo blockdev --getsize64 /dev/sda
  • sudo fdisk -l /dev/sdasudo fdisk -l所有开发者
  • sudo parted /dev/sda printsudo parted -l所有开发者
  • awk '{print $1*512}' /sys/class/block/sda/size
  • awk '{$3=$3*1024;print}' /proc/partitionsawk '$4 == "sda1" {$3=$3*1024;print}' /proc/partitions特定分区。

旁注

  • /proc/devices 包含与块设备相对应的所有主要数字的列表
  • dustat并且find命令可以显示这些引用的大小,但对于日常生活而言则不是必需的(如果有的话)
  • 块设备的表示之间有区别;一些文件实现了512(例如在/sys文件系统)的表示块,而其他一些则实现了-1024这是Unix / Linux世界中的一个约定,因为这是分配硬盘驱动器上实际物理块的方式。
  • 与GNUls文档不同OpenBSD手册页明确指出:“如果文件是特殊字符或块特殊文件,则文件的主要和次要设备号将显示在size字段中。” (我加强调)

参考

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从ls之类的文件中总结文件大小,如字节,KiB,MiB,GiB

输出文件中缺少外观?

Android Studio中缺少Kotlin暂存文件输出

减少FORTRAN中输出文件的大小

git分支和ls-remote中的不同文件夹大小写

过滤ls输出以仅显示小于特定大小的目录/文件

如何从PHP中的多维数组输出CSV文件中缺少属性的空格

ls -l和du-sh中的文件大小有什么区别?

ls -l输出文件和目录之间的区别?

输出`ls -l`命令中有几种可能的文件类型?

=在ls输出中.sock文件末尾的符号

LS命令输出到文件

EXT3:如果块大小为4K,为什么ls -l显示低于该大小的文件?

为什么ls -l输出的大小与ls -s不同?

在默认的PowerShell ls命令中显示人类可读的文件大小

目录的大小在'ls -l'命令的输出中意味着什么?

文件特权描述中“ b”和“ c”的含义(ls -l的输出)

在Unix / Linux系统的/ dev目录中的ls -l输出

奇怪的ls -l输出

作为ls命令输出的文件大小的不同度量

如何知道ls -l输出中每个元素的类型?

ls -l命令的输出中的total

ls -l命令的输出

从检查 ls-l 输出中删除文件的能力

在文件 b 中查找文件 a 中的单词并输出文件 a 中缺少的单词匹配

通过使用 ls -l 查找文件,AWK 命令以 mb、kb 或 gb 为单位打印大小

如何从ls输出中动态排除文件?

ls -l 是否以块或字节为单位打印文件大小?

ls 的打印输出 | wc -l 在包含两列的 txt 文件中