diff options
author | Ross Burton <ross.burton@intel.com> | 2021-03-23 16:37:21 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2021-03-28 22:28:26 +0100 |
commit | 3743234dab23e4068e1d1fde9e1fa0bc09fdb182 (patch) | |
tree | 895588b21ba8104ee57b126cd27d15631d08e601 /meta/lib/oe | |
parent | e9929301d408962061ed6a94730a600fba1274d7 (diff) | |
download | poky-3743234dab23e4068e1d1fde9e1fa0bc09fdb182.tar.gz |
lib/oe/utils: add directory size function
For the purpose of image construction using du on a rootfs directory isn't
entirely satisfactory. Bare "du" will report the actual disk usage so file
systems which can compress the data will report less than the actual space
required. Using "du --apparent-size" will report the actual space used, but as
this simply sums the bytes used for content across an entire file system can
result in significant under-reporting due to block size overhead.
Attempt to solve these problems by implementing our own function to calculate
how large a rootfs will be. This function handles hardlinks correctly but
rounds up all sizes to multiples of the block size (currently, 4KB is the
hard-coded block size).
(From OE-Core rev: 6ca53ad7b26ee2b4e6d2c121c6f6d6eed7f6b56f)
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/lib/oe')
-rw-r--r-- | meta/lib/oe/utils.py | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/meta/lib/oe/utils.py b/meta/lib/oe/utils.py index 9a2187e36f..a84039f585 100644 --- a/meta/lib/oe/utils.py +++ b/meta/lib/oe/utils.py | |||
@@ -536,3 +536,34 @@ class ImageQAFailed(Exception): | |||
536 | def sh_quote(string): | 536 | def sh_quote(string): |
537 | import shlex | 537 | import shlex |
538 | return shlex.quote(string) | 538 | return shlex.quote(string) |
539 | |||
540 | def directory_size(root, blocksize=4096): | ||
541 | """ | ||
542 | Calculate the size of the directory, taking into account hard links, | ||
543 | rounding up every size to multiples of the blocksize. | ||
544 | """ | ||
545 | def roundup(size): | ||
546 | """ | ||
547 | Round the size up to the nearest multiple of the block size. | ||
548 | """ | ||
549 | import math | ||
550 | return math.ceil(size / blocksize) * blocksize | ||
551 | |||
552 | def getsize(filename): | ||
553 | """ | ||
554 | Get the size of the filename, not following symlinks, taking into | ||
555 | account hard links. | ||
556 | """ | ||
557 | stat = os.lstat(filename) | ||
558 | if stat.st_ino not in inodes: | ||
559 | inodes.add(stat.st_ino) | ||
560 | return stat.st_size | ||
561 | else: | ||
562 | return 0 | ||
563 | |||
564 | inodes = set() | ||
565 | total = 0 | ||
566 | for root, dirs, files in os.walk(root): | ||
567 | total += sum(roundup(getsize(os.path.join(root, name))) for name in files) | ||
568 | total += roundup(getsize(root)) | ||
569 | return total | ||