如何知道OpenWrt中程序包占用的磁盘空间?


Answers:


11

并非每个OpenWrt环境专家都以相同的方式进行设置,所以我的答案是在黑暗中拍摄...

示例输出来自“ TP-Link TL-WDR4300”上的OpenWrt-12.09。

ssh 进入您的路由器。

检查您的文件系统。

root@AP9:~# df
Filesystem           1K-blocks      Used Available Use% Mounted on
rootfs                    5184      2124      3060  41% /
/dev/root                 2048      2048         0 100% /rom
tmpfs                    63340       948     62392   1% /tmp
tmpfs                      512         0       512   0% /dev
/dev/mtdblock3            5184      2124      3060  41% /overlay
overlayfs:/overlay        5184      2124      3060  41% /
/dev/sda1             31234700    593536  29075728   2% /mnt/sda1

/dev/sda1 是我的UMTS记忆棒的micro SD卡...只需忽略此即可。

许多路由器以类似此处的方式闪烁:覆盖文件系统使只读根文件系统伪写。

看里面/overlay...

root@AP9:~# cd /overlay/usr/lib/opkg/info/
root@AP9:/overlay/usr/lib/opkg/info# ls *.list | tail -3
usb-modeswitch-data.list
usb-modeswitch.list
zlib.list

该目录包含有关额外安装的软件包的信息。以结尾.list的文件是软件包安装的具有类似名称(不带.list)的文件列表:

root@AP9:/overlay/usr/lib/opkg/info# cat zlib.list 
/usr/lib/libz.so.1.2.7
/usr/lib/libz.so.1
/usr/lib/libz.so

软件包zlib已安装3个文件。

root@AP9:/overlay/usr/lib/opkg/info# du $(cat zlib.list) 
71      /usr/lib/libz.so.1.2.7
1       /usr/lib/libz.so.1
1       /usr/lib/libz.so

程序包zlib具有73 KB的已安装文件。

粗糙的1-liner将所有这些粘合在一起,并且缩短了输出量:

# awk 'BEGIN{D="cd /overlay/usr/lib/opkg/info&&";C=D"ls *.list";while(C|getline>0){P=substr(F=$1,1,length($1)-5);J=D"du -sk $(cat "F")";s=0;while(J|getline>0){s+=$1;t+=$1}close(J);print s"\t"P}print t"\t---TOTAL---"}'
26      blkid
30      block-mount
17      chat
55      comgt
6       kmod-fs-exportfs
(((...some lines skipped...)))
14      portmap
48      swap-utils
223     usb-modeswitch-data
45      usb-modeswitch
73      zlib
4184    ---TOTAL---

HTH!


新增2014-10-17:

以下输出取自“ TP-Link TL-WR703N”上的OpenWrt-12.09,并显示了如何添加按包装尺寸对输出进行排序的方法。

看看变量在哪里以及如何S进入游戏...

# awk 'BEGIN{D="cd /overlay/usr/lib/opkg/info&&";C=D"ls *.list";S="sort -n";while(C|getli
ne>0){P=substr(F=$1,1,length($1)-5);J=D"du -sk $(cat "F")";s=0;while(J|getline>0){s+=$1;t+=$1}close(J)
;print s"\t"P|S}close(S);print t"\t---TOTAL---"}'
5       kmod-lib-crc16
5       luci-proto-3g
12      libuuid
13      kmod-usb-serial-wwan
17      chat
24      kmod-usb-acm
24      libusb
26      blkid
30      block-mount
41      kmod-usb-serial
45      usb-modeswitch
48      kmod-usb-serial-option
48      swap-utils
55      comgt
67      kmod-usb-storage
148     libblkid
154     kmod-scsi-core
223     usb-modeswitch-data
382     kmod-fs-ext4
1367    ---TOTAL---

再次:HTH!


新增2018-01-13:

以上方法已在OpenWrt-AA上进行了测试。

现在看看LEDE-17.01的路径发生了变化:更换/overlay/overlay/upper修复了这个。

现状(opkg-list-user-installed-sorted-by-size不是1班轮):

#!/usr/bin/awk -f
BEGIN {
        D="cd /overlay/upper/usr/lib/opkg/info&&"
        C=D"ls *.list"
        S="sort -n"
        while(C|getline>0) {
                P=substr(F=$1,1,length($1)-5)
                J=D"du -sk $(cat "F")"
                s=0
                while(J|getline>0) {
                        s+=$1
                        t+=$1
                }
                close(J)
                print s"\t"P|S
        }
        close(S)
        print t"\t---TOTAL---"
}

测试运行:

root@zsun0:~# ./opkg-list-user-installed-sorted-by-size
8       luci-ssl
9       libustream-mbedtls
13      px5g-mbedtls
338     libmbedtls
368     ---TOTAL---

悬而未决的问题:/overlay的结构何时发生变化?LEDE-17是OpenWrt-CC的继任者,我手头上没有运行OpenWrt的系统。因此,如果您在OpenWrt-BB或-CC上需要此功能,/overlay请先浏览一下内部。


太棒了!仅缺少排序;-)
bonanza

@bonanza ... Po!或AWKish中的“ simsAWKlabim” ...

4

根据yeti的解决方案,还有另一种可能,那就是更快。我们可以使用du文件中list声明的大小来代替计算文件中文件的大小control

像我的小opkg_sizes剧本

cd /usr/lib/opkg/info
for i in *.control
do
  echo `grep Size "$i" | cut -f 2 -d :` "${i%.control}"
done

如果要对输出进行排序,可以通过sort以下命令运行它:

./opkg_sizes | sort -n

编辑

比较我的脚本结果与雪人的显示差异进行比较。这是因为他/overlay/usr/lib/opkg/info在我以为/overlay前缀不是必需的时候提到了。好吧,我不完全理解为什么,但是/usr/lib/opkg/info还提供了系统软件包,而/overlay/usr/lib/opkg/info只提供了用户的软件包。

因此,如果用户也对系统软件包感兴趣,请使用第一个版本。但是,为了只获得用户的软件包,只需将第一行替换为:

 cd /overlay/usr/lib/opkg/info

这样做之后,两个脚本都引用相同的程序包,但是具有不同的数字...(除了字节和千字节之间明显的差异:-))


root@ap8:~# ls -l 1412453029-14.07-wdr4300-default-packages 
-rw-r--r--    1 root     root          2683 Oct  4 20:03 1412453029-14.07-wdr4300-default-packages
root@ap8:~# du 1412453029-14.07-wdr4300-default-packages 
3       1412453029-14.07-wdr4300-default-packages

ls显示字节大小,du显示文件分配的所有块的大小。


有人问,下载的程序包消耗了多少空间。删除闪存固件中安装的软件包不会释放覆盖文件系统中的空间。。。。。。至少这是我解释问题的方式...

我同意你对这个问题的理解。但是我认为/ overlay应该反映真实的系统,也许会有更多信息;但令我惊讶的是它包含的信息较少
2014年

同样,这两种方法给出不同的数字也很奇怪...
Zvika 2014年

du文件系统的块大小粒度。/ overlay只是文件系统层的文字部分。

好吧,我认为它得出的结论是你的答案更好……
Zvika 2014年

2

该答案是Zvika答案的改进版本。由于源代码本质上是不同的,我认为最好将其添加为附加答案,而不是对原始答案进行编辑。

#!/bin/sh
grep -H Installed-Size: /overlay/usr/lib/opkg/info/*.control | \
  sed 's,^.*/\([^/]\+\)\.control:Installed-Size: *\(.*\),\2\t\1,'

原代码需要太多叉,使得它作为慢一秒。改进后的代码更短,仅使用三个进程,从而在我的路由器上运行时间高达0.02s。

您可以调整路径:

  • /overlay/usr/lib/opkg/info/*.control→用户安装的软件包。这些是可以删除的软件包,以释放空间。
  • /rom/usr/lib/opkg/info/*.control→系统软件包。这些无法卸载。(除非你真的清楚自己在做什么。)由于它们存储在只读分区中,因此删除它们将不会释放额外的空间。
  • /usr/lib/opkg/info/*.control →所有包装。

0

对我而言,最简单的方法是使用find;

find / -size +500k

输出以下;

# find / -size +500k
/lib/libc.so
/lib/modules/4.4.92/mac80211.ko
/overlay/upper/usr/lib/libcrypto.so.1.0.0
/overlay/upper/usr/lib/libdns.so.165.0.4
/overlay/upper/usr/sbin/sshd
/rom/lib/libc.so
/rom/lib/modules/4.4.92/mac80211.ko
/usr/lib/libcrypto.so.1.0.0
/usr/lib/libdns.so.165.0.4
/usr/sbin/sshd

这些是我的LEDE安装中的“大”文件。我在路由器上需要一些额外的空间,以便可以格式化,分区和挂载一些USB存储空间。调整+500k为更适合您的文件大小。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.