Comment connaître l'espace disque occupé par les packages dans OpenWrt?

J'essaye de configurer OpenWrt sur mon appareil et je suis sorti de l'espace. Je téléchargeais des packages d'outillage. Maintenant, comment puis-je déterminer leur poids afin de décider quoi désinstaller?

Est-il possible d'afficher la taille des packages installés avec OPKG?

Tous les environnements OpenWrt ne sont pas configurés de la même façon, donc ma réponse est un tir dans le noir …

L'exemple de sortie est tiré de OpenWrt-12.09 sur un "TP-Link TL-WDR4300".

ssh dans votre routeur.

Vérifiez vos files filesytsems.

 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 est la carte micro SD de mon stick UMTS … il suffit d'ignorer cela.

De nombreux routeurs sont flashés de la même manière, comme on le voit ici: Un système de files racine en lecture seule est rendu pseudo inscriptible par un système de files de superposition.

Regardez à l'intérieur /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 

Ce directory contient les informations sur les packages supplémentaires installés. Les files se terminant par .list sont des lists de files installés par le package avec le même nom (sans .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 

Le package zlib a 3 files installés.

 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 

Le packageage zlib a 73kbytes de files installés.

Un 1-liner brut pour coller tout cela set et sa sortie raccourcie:

 # 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!


Ajouté le 17/10/2014:

La sortie suivante provient de OpenWrt-12.09 sur un "TP-Link TL-WR703N" et montre comment append le sorting de la sortie par taille de package.

Jetez un oeil sur où et comment la variable S entre dans le jeu …

 # 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--- 

Encore une fois: HTH!

Basé sur la solution de yeti , il y a une autre possibilité, qui pourrait être plus rapide. Au lieu de calculer la taille avec du pour les files du file de list , nous pouvons utiliser la taille déclarée dans le file de control .

Quelque chose comme mon petit script opkg_sizes

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

Si vous voulez que la sortie soit sortingée, vous pouvez l'exécuter par sort :

 ./opkg_sizes | sort -n 

MODIFIER

Comparaison des résultats de mon script avec les différences révélées par le yeti . C'est parce qu'il a fait reference à /overlay/usr/lib/opkg/info alors que je pensais que le préfixe /overlay est inutile. Eh bien, je ne comprends pas très bien pourquoi, mais /usr/lib/opkg/info donne aussi les packages système, alors que /overlay/usr/lib/opkg/info ne donne que les packages de l'user.

Donc, si l'user est intéressé par les packages système, utilisez la première version. Mais pour ne réaliser que les packages de l'user, il suffit de replace la première ligne par:

  cd /overlay/usr/lib/opkg/info 

Après cela, les deux scripts se réfèrent aux mêmes packages, mais avec des nombres différents … (outre la différence évidente entre les octets et les kilo-octets :-))


 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 montre la taille en octets, du montre la taille de tous les blocs alloués par le file.

Cette réponse est une version améliorée de la réponse de Zvika . Puisque le code source est sensiblement différent, je crois qu'il est préférable de l'append comme réponse supplémentaire, au lieu d'une modification de l'original.

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

Le code d'origine exigeait trop de fourches, le rendant aussi lent qu'une seconde. Ce code amélioré est plus court et n'utilise que trois process, conduisant à un time de fonctionnement rapide de 0.02s (sur mon routeur).

Vous pouvez modifier les paths:

  • /overlay/usr/lib/opkg/info/*.control → packages installés par l'user. Ce sont les packages qui peuvent être supprimés afin de libérer de l'espace.
  • /rom/usr/lib/opkg/info/*.control → packages système. Ceux-ci ne peuvent pas être désinstallés. (À less que vous ne sachiez vraiment ce que vous faites.) Puisqu'ils sont stockés dans la partition en lecture seule, leur suppression ne libérera pas d'espace supplémentaire.
  • /usr/lib/opkg/info/*.control → tous les packages.