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

Suz*_*ioc 17 openwrt package-management ipkg opkg

我正在尝试在我的设备上配置 OpenWrt 并且空间不足。我正在下载一些工具包。现在我如何确定它们的权重,以便决定卸载什么?

是否可以使用 OPKG 显示已安装包的大小?

小智 14

并非每个 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
Run Code Online (Sandbox Code Playgroud)

/dev/sda1 是我的 UMTS 棒的微型 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
Run Code Online (Sandbox Code Playgroud)

此目录包含有关额外安装的软件包的信息。以 结尾.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
Run Code Online (Sandbox Code Playgroud)

软件包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
Run Code Online (Sandbox Code Playgroud)

zlib有 73kbytes 的已安装文件。

一个粗略的 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---
Run Code Online (Sandbox Code Playgroud)

哼!


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---
Run Code Online (Sandbox Code Playgroud)

再次:HTH!


2018-01-13 添加:

上述方式已在 OpenWrt-AA 上进行了测试。

现在查看 LEDE-17.01 的路径已更改:替换/overlay/overlay/upper修复此问题。

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

#!/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---"
}
Run Code Online (Sandbox Code Playgroud)

测试运行:

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

开放性问题:/overlay的结构发生这种变化是什么时候?LEDE-17 是 OpenWrt-CC 的继任者,我手头没有运行 OpenWrt 的系统。所以如果你在 OpenWrt-BB 或 -CC 上需要这个,先看看里面/overlay