내 장치에서 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-라이너는 모든 것을 하나로 묶어 출력을 줄입니다.
# 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줄과 다름):
#!/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,'
이것원본 코드1초로 속도를 늦추려면 너무 많은 포크가 필요합니다. 개선된 코드는 더 짧고, 3개의 프로세스만 사용하며, 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
파일 크기를 자신에게 더 잘 맞게 조정하세요 .