我正在尝试在我的设备上配置 OpenWrt,但空间不足。我正在下载一些工具包。现在我如何确定它们的权重以便决定卸载什么?
是否可以使用 OPKG 显示已安装软件包的大小?
答案1
并非每个 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 棒的微型 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
有 73kbyte 的安装文件。
一个粗略的 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---
哈!
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---
再次:哈!
2018年1月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---"
}
测试运行:
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
。
答案2
基于雪人的解决方案,还有另一种可能性,可能会更快。我们可以使用文件中声明的大小,而不是计算文件中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
显示文件分配的所有块的大小。
答案3
这个答案是一个改进版本兹维卡的回答。由于源代码有很大不同,我认为最好将其添加为附加答案,而不是对原始答案进行编辑。
#!/bin/sh
grep -H Installed-Size: /overlay/usr/lib/opkg/info/*.control | \
sed 's,^.*/\([^/]\+\)\.control:Installed-Size: *\(.*\),\2\t\1,'
这原始代码需要太多的分叉,使其慢至一秒。改进后的代码更短,仅使用三个进程,运行时间极快,为 0.02 秒(在我的路由器上)。
您可以调整路径:
/overlay/usr/lib/opkg/info/*.control
→ 用户安装的软件包。这些是可以删除以释放空间的包。/rom/usr/lib/opkg/info/*.control
→ 系统包。这些无法卸载。 (除非你真的知道你在做什么。)由于它们存储在只读分区中,删除它们不会释放额外的空间。/usr/lib/opkg/info/*.control
→ 所有包裹。
答案4
对我来说,最简单的方法是使用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
为更适合您的文件大小。