当我尝试打印设备文件时,输出以十六进制格式显示二进制数据。但是在做一个ls -l /dev/sda
我得到:
brw-rw---- 1 root disk 8, 0 Jan 29 12:29 /dev/sda
我不知道文件的实际大小是多少?这些数字是什么意思?
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
。但是,当我们分开时else
,ls
了解到我们正在使用除块或字符设备以外的文件。对于这些文件,它会将存储在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/sda
或sudo fdisk -l
所有开发者sudo parted /dev/sda print
或sudo parted -l
所有开发者awk '{print $1*512}' /sys/class/block/sda/size
awk '{$3=$3*1024;print}' /proc/partitions
或awk '$4 == "sda1" {$3=$3*1024;print}' /proc/partitions
特定分区。旁注
/proc/devices
包含与块设备相对应的所有主要数字的列表du
,stat
并且find
命令可以显示这些引用的大小,但对于日常生活而言则不是必需的(如果有的话)512
(例如在/sys
文件系统下)的表示块,而其他一些则实现了-1024。这是Unix / Linux世界中的一个约定,因为这是分配硬盘驱动器上实际物理块的方式。ls
文档不同,OpenBSD手册页明确指出:“如果文件是特殊字符或块特殊文件,则该文件的主要和次要设备号将显示在size字段中。” (我加强调)参考
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句