Merge pull request #132 from fosslinux/kexec

Kexec, Kernel, sysc, etc, etc
master
fosslinux 1 year ago committed by GitHub
commit acfe6cc771
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 66
      .cirrus.yml
  2. 1
      .gitignore
  3. 2
      .reuse/dep5
  4. 14
      LICENSES/BSD-4-Clause.txt
  5. 117
      LICENSES/GPL-2.0-only.txt
  6. 27
      README.rst
  7. 19
      SHA256SUMS.sources
  8. 164
      lib/sysgeneral.py
  9. 15
      lib/utils.py
  10. 73
      parts.rst
  11. 93
      rootfs.py
  12. 266
      sysa.py
  13. 12
      sysa/after.kaem
  14. 2
      sysa/bash-2.05b/checksums
  15. 1
      sysa/bash-5.1/checksums
  16. 38
      sysa/binutils-2.14/checksums
  17. 1
      sysa/bison-2.3/checksums
  18. 2
      sysa/bison-3.4.1/checksums/stage1
  19. 2
      sysa/bison-3.4.1/checksums/stage2
  20. 2
      sysa/bison-3.4.1/checksums/stage3
  21. 3
      sysa/bison-3.4.1/files/config.h
  22. 5
      sysa/bison-3.4.1/files/configmake.h
  23. 1
      sysa/bison-3.4.2/checksums
  24. 2
      sysa/bzip2-1.0.8/checksums/bzip2-pass1
  25. 2
      sysa/bzip2-1.0.8/checksums/bzip2-pass2
  26. 108
      sysa/coreutils-5.0/checksums/pass1
  27. 120
      sysa/coreutils-5.0/checksums/pass2
  28. 6
      sysa/coreutils-6.10/checksums
  29. 3
      sysa/coreutils-6.10/mk/main.mk
  30. 107
      sysa/coreutils-8.32/checksums
  31. 4
      sysa/diffutils-2.7/checksums
  32. 2
      sysa/dist-3.5-236/checksums
  33. 14
      sysa/findutils-4.2.33/checksums
  34. 2
      sysa/flex-2.5.11/checksums
  35. 1
      sysa/flex-2.5.33/checksums
  36. 2
      sysa/flex-2.6.4/checksums
  37. 2
      sysa/gawk-3.0.4/checksums
  38. 24
      sysa/gcc-4.0.4/checksums/pass1
  39. 24
      sysa/gcc-4.0.4/checksums/pass2
  40. 5
      sysa/gcc-4.0.4/pass1.sh
  41. 7
      sysa/gcc-4.0.4/pass2.sh
  42. 25
      sysa/gcc-4.7.4/checksums
  43. 33
      sysa/gettext-0.21/checksums
  44. 2
      sysa/gmp-6.2.1/checksums
  45. 1
      sysa/gperf-3.1/checksums
  46. 2
      sysa/grep-2.4/checksums
  47. 2
      sysa/gzip-1.2.4/checksums
  48. 6
      sysa/heirloom-devtools-070527/checksums
  49. 30
      sysa/kbd-1.15/kbd-1.15.sh
  50. 16
      sysa/kbd-1.15/patches/fcntl.patch
  51. 2
      sysa/kexec-tools-2.0.22/checksums
  52. 16
      sysa/kexec-tools-2.0.22/kexec-tools-2.0.22.sh
  53. 17
      sysa/kexec-tools-2.0.22/patches/bad-gcc-arg.patch
  54. 4
      sysa/libtool-1.4/checksums
  55. 4
      sysa/libtool-2.2.4/checksums
  56. 2
      sysa/libunistring-0.9.10/checksums
  57. 3930
      sysa/linux-4.9.10/files/config
  58. 62
      sysa/linux-4.9.10/linux-4.9.10.sh
  59. 18
      sysa/linux-4.9.10/patches/bad-asm.patch
  60. 22
      sysa/linux-4.9.10/patches/disable-broken-check.patch
  61. 17
      sysa/linux-4.9.10/patches/linking.patch
  62. 18
      sysa/linux-4.9.10/patches/regen.patch
  63. 34
      sysa/linux-4.9.10/patches/remove-alternative-asm.patch
  64. 23
      sysa/linux-4.9.10/patches/remove-kconfig.patch
  65. 22
      sysa/linux-4.9.10/patches/use-less-ram.patch
  66. 910
      sysa/linux-headers-5.10.41/checksums
  67. 67
      sysa/linux-headers-5.10.41/linux-headers-5.10.41.sh
  68. 18
      sysa/linux-headers-5.10.41/patches/sed-args.patch
  69. 20
      sysa/linux-headers-5.10.41/patches/winsize.patch
  70. 2
      sysa/m4-1.4.7/checksums
  71. 2
      sysa/make-3.80/checksums
  72. 5
      sysa/make-3.80/make-3.80.kaem
  73. 27
      sysa/make-3.82/make-3.82.sh
  74. 1
      sysa/make-4.2.1/checksums
  75. 10
      sysa/mes-0.23/checksums
  76. 26
      sysa/mes/checksums
  77. 5
      sysa/mes/files/mescc.scm
  78. 2
      sysa/mpc-1.2.1/checksums
  79. 2
      sysa/mpfr-4.1.0/checksums
  80. 28
      sysa/musl-1.1.24/checksums/pass1
  81. 28
      sysa/musl-1.1.24/checksums/pass2
  82. 28
      sysa/musl-1.1.24/checksums/pass3
  83. 28
      sysa/musl-1.2.2/checksums
  84. 2
      sysa/patch-2.5.9/checksums
  85. 1
      sysa/patch-2.7.6/checksums
  86. 2
      sysa/perl-5.000/checksums
  87. 11
      sysa/perl-5.000/files/config.h
  88. 2
      sysa/perl-5.003/checksums
  89. 1
      sysa/perl-5.003/files/config.h
  90. 1
      sysa/perl-5.10.1/checksums
  91. 81
      sysa/perl-5.32.1/checksums
  92. 2
      sysa/perl-5.6.2/checksums
  93. 13
      sysa/perl-5.6.2/files/config.h
  94. 2
      sysa/perl5.004_05/checksums
  95. 13
      sysa/perl5.004_05/files/config.h
  96. 2
      sysa/perl5.005_03/checksums
  97. 13
      sysa/perl5.005_03/files/config.h
  98. 1
      sysa/pkg-config-0.29.2/checksums
  99. 58
      sysa/run.sh
  100. 2
      sysa/sed-4.0.9/checksums/pass1
  101. Some files were not shown because too many files have changed in this diff Show More

@ -9,10 +9,11 @@ pylint_task:
deps_script:
- apt-get -y update
- apt-get -y dist-upgrade
- apt-get -y install python3-requests pylint
- apt-get -y install python3-pip python3-requests
- apt-get -y clean
- pip3 install pylint
check_script:
- pylint rootfs.py sysa.py lib/utils.py
- pylint rootfs.py sysa.py sysb.py sysc.py lib/utils.py lib/sysgeneral.py --disable=duplicate-code
shell_lint_task:
container:
@ -23,7 +24,7 @@ shell_lint_task:
- apt-get -y install shellcheck
- apt-get -y clean
check_script:
- shellcheck sysa/run.sh sysa/helpers.sh
- shellcheck sysa/run.sh sysb/run.sh sysc/run.sh sysc/run2.sh sysglobal/helpers.sh
reuse_lint_task:
container:
@ -37,32 +38,33 @@ reuse_lint_task:
check_script:
- reuse lint
run_task:
timeout_in: 180m
container:
image: potyarkin/molecule:host-kvm
kvm: true
cpu: 2
memory: 4G
# Required background services
dbus_background_script:
- mkdir -p /var/run/dbus
- /usr/bin/dbus-daemon --system --nofork --nopidfile
virtlogd_background_script:
- /usr/sbin/virtlogd
libvirtd_background_script:
- sleep 2 && /usr/sbin/libvirtd
iptables_legacy_script:
- update-alternatives --set iptables /usr/sbin/iptables-legacy
deps_script:
- apt-get -y update
- apt-get -y dist-upgrade
- apt-get -y install sudo git cpio linux-image-4.19.0-16-amd64 expect wget
- apt-get -y clean
submodule_script:
- git submodule update --init --recursive
kernel_script:
- cp /boot/vmlinuz-4.19.0-16-amd64 ./kernel
run_script:
- ./.cirrus.expect | tee -a /tmp/run.log
- grep -q 'Bootstrapping completed.' /tmp/run.log
# XXX: Takes too long right now
#run_task:
# timeout_in: 180m
# container:
# image: potyarkin/molecule:host-kvm
# kvm: true
# cpu: 2
# memory: 4G
# # Required background services
# dbus_background_script:
# - mkdir -p /var/run/dbus
# - /usr/bin/dbus-daemon --system --nofork --nopidfile
# virtlogd_background_script:
# - /usr/sbin/virtlogd
# libvirtd_background_script:
# - sleep 2 && /usr/sbin/libvirtd
# iptables_legacy_script:
# - update-alternatives --set iptables /usr/sbin/iptables-legacy
# deps_script:
# - apt-get -y update
# - apt-get -y dist-upgrade
# - apt-get -y install sudo git cpio linux-image-4.19.0-16-amd64 expect wget
# - apt-get -y clean
# submodule_script:
# - git submodule update --init --recursive
# kernel_script:
# - cp /boot/vmlinuz-4.19.0-16-amd64 ./kernel
# run_script:
# - ./.cirrus.expect | tee -a /tmp/run.log
# - grep -q 'Bootstrapping completed.' /tmp/run.log

1
.gitignore vendored

@ -7,3 +7,4 @@ tmp/
kernel
sources/
__pycache__
sysglobal/bootstrap.cfg

@ -9,6 +9,6 @@ Source: https://github.com/fosslinux/live-bootstrap
# Copyright: $YEAR $NAME <$CONTACT>
# License: ...
Files: SHA256SUMS.sources sysa/pre-sha.sha256sums sysa/*/checksums sysa/*/checksums/*
Files: SHA256SUMS.sources sysa/pre-sha.sha256sums sysa/*/checksums sysa/*/checksums/* sysc/*/checksums sysc/*/checksums/*
Copyright: none
License: MIT

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -25,7 +25,10 @@ Get me started!
a. Alternatively, run ``./rootfs.py --chroot`` to run it in a chroot.
b. Alternatively, run ``./rootfs.py`` but don’t run the actual
virtualization and instead copy sysa/tmp/initramfs to a USB or
some other device and boot from bare metal.
some other device and boot from bare metal. NOTE: we now require
a hard drive. This is currently hardcoded as sda. You also need
to put ``sysc/tmp/disk.img`` onto your sda on the bootstrapping
machine.
5. Wait.
6. If you can, observe the many binaries in ``/after/bin``! When the
@ -129,4 +132,24 @@ sysa
sysa is the first ‘system’ used in live-bootstrap. We move to a new
system after a reboot, which often occurs after the movement to a new
kernel. It is run by the seed Linux kernel provided by the user. It
currently compiles everything.
compiles everything we need to be able to compile our own Linux kernel.
It runs fully in an initramfs and does not rely on disk support in the
seed Linux kernel.
sysb
~~~~
sysb is the second 'system' of live-bootstrap. This uses the Linux 4.9.10
kernel compiled within sysa. As we do not rely on disk support in sysa, we
need this intermediate system to be able to add the missing binaries to sysc
before moving into it. This is executed through kexec from sysa. At this point,
a SATA disk IS required.
sysc
~~~~
sysc is the (current) last 'system' of live-bootstrap. This is a continuation
from sysb, executed through util-linux's ``switch_root`` command which moves
the entire rootfs without a reboot. Every package from here on out is compiled
under this system, taking binaries from sysa. Chroot mode skips sysb, as it
is obviously irrelevant for a chroot.

@ -87,3 +87,22 @@ de23af78fca90ce32dff2dd45b3432b2334740bb9bb7b05bf60fdbfc396ceb9c tcc-0.9.27.tar
988403c1542d15ad044600b909997ba3079b10e03224c61188117f3676b02caa texinfo-6.7.tar.xz
166c48d2842519bc4f96333bff9e265f8cdda44d38e40594ef3f9bbb52890490 xz-5.0.5.tar.bz2
4ff941449631ace0d4d203e3483be9dbc9da454084111f97ea0a2114e19bf066 zlib-1.2.11.tar.xz
c40385e142989c91989413f3c5a31282b2ffdca16b69cd3ecfde537b8a474921 flex-2.5.33.tar.gz
b10d7e9e354be72aee4e4911cf19dd27b5c527d4e7200857365b5fcdeea0dffb bison-2.3.tar.bz2
0190f28cb155fedd22bf8558c3e8705eed9eacfb7ae29e7508d025a68eb90899 gnulib-b28236b.tar.gz
9385f2c8c2ca8b1dc4a7c31903f1f8dc8f2ba867dc2a9e5c93012ed6b564e826 perl-5.10.1.tar.bz2
54437ae4211867de7ad55723f68b94c29cb2f08a23f431e0bbbc9f34ee384f47 dist-3.5-236.tar.gz
e40b8f018c1da64edd1cc9a6fce5fa63b2e707e404e20cad91fbae337c98a5b7 make-4.2.1.tar.gz
27d05534699735dc69e86add5b808d6cb35900ad3fd63fa82e3eb644336abfa0 bison-3.4.2.tar.xz
8cced51f89a950472473856f86e88f5daf97a2347756125ccdc8ee907deec570 gnulib-672663a.tar.gz
57cc47c735c8300a8ce2fa0643507b44c4ae59012bfdad0121313db639e02309 perl-5.32.1.tar.xz
3ec396d97debb6c1a112c1c6ff58b03a55866b75cd4fe06b74295ac9c5fc5ff2 perl-5f2dc80.tar.bz2
84d2079a20ba32f5e2d5bc79a5dcb1de94d0176c67d75d5a20d533ea6c90d691 linux-headers-5.10.41.tar.gz
af618de7848142f204b57811f703de3ae7aa3f5bc5d52226db35800fa8fc4dff kexec-tools-2.0.22.tar.gz
f694bee56099b8d72c3843d97e27f2306aa9946741e34a27391f6f6f19c7bcd0 util-linux-2.19.1.tar.gz
203c93e004ac7ad0e50423ff54d89e40fa99f45b207b2b892a4d70211feebe05 kbd-1.15.tar.gz
ff2bf7656c4d1c6fdda3b8bebb21f09153a736bcba169aaf65eab25fa113bf3a automake-1.16.3.tar.xz
3d991b33e604187c5881a0abc2e102d5b9776da5569640e73778f85d617242e7 make-3.82.tar.gz
97ff15f9550c6e85c25173b3cf5c7e89a2d39fb923112f2c8bc2729cf64bf6d8 linux-4.9.10.tar.gz
db316ba381e5a9916ace64acf822f0de70a724df06f73c18d79c5d16385a0cf1 deblob-4.9
62912c9e999cc25c8cf494533d5bab8c22d9e0ee081649d3c05197b3a096aa3b deblob-check

@ -0,0 +1,164 @@
#!/usr/bin/env python3
"""
This file contains a few functions to be shared by all Sys* classes
"""
# SPDX-FileCopyrightText: 2021 fosslinux <fosslinux@aussies.space>
# SPDX-FileCopyrightText: 2021 Andrius Štikonas <andrius@stikonas.eu>
# SPDX-License-Identifier: GPL-3.0-or-later
import os
import hashlib
import shutil
import glob
import subprocess
import requests
from lib.utils import mount, umount, get_target, copytree
class SysGeneral:
"""
A class from which all Sys* class are extended.
Contains functions used in all Sys*
"""
# All of these are variables defined in the individual Sys* classes
preserve_tmp = None
tmp_dir = None
base_dir = None
git_dir = None
sys_dir = None
initramfs_path = None
def __del__(self):
if not self.preserve_tmp:
print("Unmounting tmpfs from %s" % (self.tmp_dir))
umount(self.tmp_dir)
os.rmdir(self.tmp_dir)
def mount_tmpfs(self):
"""Mount the tmpfs for this sysx"""
if not os.path.isdir(self.tmp_dir):
os.mkdir(self.tmp_dir)
print("Mounting tmpfs on %s" % (self.tmp_dir))
mount('tmpfs', self.tmp_dir, 'tmpfs', 'size=8G')
def check_file(self, file_name):
"""Check hash of downloaded source file."""
checksum_store = os.path.join(self.git_dir, 'SHA256SUMS.sources')
with open(checksum_store, encoding="utf_8") as checksum_file:
hashes = checksum_file.read().splitlines()
for hash_line in hashes:
if os.path.basename(file_name) in hash_line:
# Hash is in store, check it
expected_hash = hash_line.split()[0]
with open(file_name, "rb") as downloaded_file:
downloaded_content = downloaded_file.read() # read entire file as bytes
readable_hash = hashlib.sha256(downloaded_content).hexdigest()
if expected_hash == readable_hash:
return
raise Exception("Checksum mismatch")
raise Exception("File checksum is not yet recorded")
def download_file(self, url, file_name=None):
"""
Download a single source archive.
"""
cache_dir = os.path.join(self.git_dir, 'sources')
# Automatically determine file name based on URL.
if file_name is None:
file_name = os.path.basename(url)
abs_file_name = os.path.join(cache_dir, file_name)
# Create a cache directory for downloaded sources
if not os.path.isdir(cache_dir):
os.mkdir(cache_dir)
# Actually download the file
if not os.path.isfile(abs_file_name):
print("Downloading: %s" % (file_name))
request = requests.get(url, allow_redirects=True)
# pylint: disable=consider-using-with
open(abs_file_name, 'wb').write(request.content)
# Check SHA256 hash
self.check_file(abs_file_name)
return abs_file_name
def get_file(self, url, mkbuild=False, output=None):
"""
Download and prepare source packages
url can be either:
1. a single URL
2. list of URLs to download. In this case the first URL is the primary URL
from which we derive the name of package directory
output can be used to override file name of the downloaded file(s).
mkbuild=True can be used to pre-create build directories before
mkdir is available.
"""
# Single URL
if isinstance(url, str):
assert output is None or isinstance(output, str)
file_name = url if output is None else output
urls = [url]
outputs = [output]
# Multiple URLs
elif isinstance(url, list):
assert output is None or len(output) == len(url)
file_name = url[0] if output is None else output[0]
urls = url
outputs = output if output is not None else [None] * len(url)
else:
raise TypeError("url must be either a string or a list of strings")
# Determine installation directory
target_name = get_target(file_name)
target_src_dir = os.path.join(self.base_dir, target_name, 'src')
# Install base files
src_tree = os.path.join(self.sys_dir, target_name)
copytree(src_tree, self.base_dir)
if not os.path.isdir(target_src_dir):
os.mkdir(target_src_dir)
for i, _ in enumerate(urls):
# Download files into cache directory
tarball = self.download_file(urls[i], outputs[i])
# Install sources into target directory
shutil.copy2(tarball, target_src_dir)
if mkbuild:
os.mkdir(os.path.join(self.base_dir, target_name, 'build'))
def deploy_sysglobal_files(self):
"""Deploy files common to all Sys*"""
sysglobal_files = ['bootstrap.cfg', 'helpers.sh']
for file in sysglobal_files:
shutil.copy2(os.path.join(self.git_dir, 'sysglobal', file),
self.base_dir)
def make_initramfs(self):
"""Package binary bootstrap seeds and sources into initramfs."""
self.initramfs_path = os.path.join(self.tmp_dir, 'initramfs')
# Create a list of files to go within the initramfs
file_list = glob.glob(os.path.join(self.tmp_dir, '**'), recursive=True)
# Use built-in removeprefix once we can use Python 3.9
def remove_prefix(text, prefix):
if text.startswith(prefix):
return text[len(prefix):]
return text # or whatever
file_list = [remove_prefix(f, self.tmp_dir + os.sep) for f in file_list]
# Create the initramfs
with open(self.initramfs_path, "w", encoding="utf_8") as initramfs:
# pylint: disable=consider-using-with
cpio = subprocess.Popen(
["cpio", "--format", "newc", "--create",
"--directory", self.tmp_dir],
stdin=subprocess.PIPE, stdout=initramfs)
cpio.communicate(input='\n'.join(file_list).encode())

@ -5,13 +5,13 @@ This file contains a few self-contained helper functions
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2021 Andrius Štikonas <andrius@stikonas.eu>
# SPDX-FileCopyrightText: 2021 fosslinux <fosslinux@aussies.space>
import os
import shutil
import subprocess
import sys
def run(*args, **kwargs):
"""A small wrapper around subprocess.run"""
arguments = [str(arg) for arg in args]
@ -25,6 +25,19 @@ def run(*args, **kwargs):
print("Bootstrapping failed")
sys.exit(1)
def create_disk(image, disk_type, fs_type, size):
"""Create a disk image, with a filesystem on it"""
run('truncate', '-s', size, image)
# First find the device we will use, then actually use it
loop_dev = run('losetup', '-f', capture_output=True).stdout.decode().strip()
run('sudo', 'losetup', loop_dev, image)
# Create the partition
run('sudo', 'parted', '--script', image, 'mklabel', disk_type, 'mkpart',
'primary', 'ext4', '0%', '100%')
run('sudo', 'partprobe', loop_dev)
run('sudo', 'mkfs.' + fs_type, loop_dev + "p1")
return loop_dev
def mount(source, target, fs_type, options='', **kwargs):
"""Mount filesystem"""
run('sudo', 'mount', source, target, '-t', fs_type, '-o', options, **kwargs)

@ -535,6 +535,79 @@ gcc 4.0.4
Rebuild GCC with GCC and also against the latest musl.
util-linux 2.19.1
=================
``util-linux`` contains a number of general system administration utilities.
Most pressingly, we need these for being able to mount disks (for non-chroot
mode, but it is built it in chroot mode anyway because it will likely be useful
later). The latest version is not used because of autotools/GCC
incompatibilities.
kbd-1.15
========
``kbd`` contains ``loadkeys`` which is required for building the Linux kernel.
The 2.x series is not used because it requires particular features of autotools
that we do not have avaliable.
make 3.82
=========
GNU Make is updated by .02. The most notable thing is this is now built properly
using the build system and GCC, which means that it does not randomly segfault
while building the Linux kernel.
kexec-tools 2.0.22
==================
``kexec`` is a utility for the Linux kernel that allows the re-execution of the
Linux kernel without a manual restart from within a running system. It is a
kind of soft-restart. It is only built for non-chroot mode, as we only use it
in non-chroot mode. It is used to go into sysb/sysc.
create_sysb
===========
The next step is not a package, but the creation of the sysb rootfs, containing
all of the scripts for sysb (which merely move to sysc). Again, this is only
done in non-chroot mode, because sysb does not exist in chroot mode.
Linux kernel 4.9.10
===================
A lot going on here. This is the first (and currently only) time the Linux kernel
is built. Firstly, Linux kernel version 4.9.x is used because newer versions
require much more stringent requirements on the make, GCC, binutils versions.
However, the docs are also wrong, as the latest of the 4.9.x series does not
work with our version of binutils. However, a much earlier 4.9.10 does
(selected arbitarily, could go newer but did not test), with a small amount
of patching. This is also modern enough for most hardware and to cause few
problems with software built in sysc. Secondly, the linux-libre scripts are used
to deblob the kernel. Unauditable, unbootstrappable binary blobs within our
kernel are unacceptable. Our gawk is too buggy/old so we use sed instead for
this operation. Every other pregenerated file is appended with ``_shipped`` so
we use a ``find`` command to remove those, which are automatically regenerated.
The kernel config was originally taken from Void Linux, and was then modified
for the requirements of live-bootstrap, including compiler features, drivers,
and removing modules. Speaking of which, modules cannot be used. These cannot
be transferred to subsequent systems, and we do not have ``modprobe``. Lastly,
the initramfs of sysb is generated in this stage, using ``gen_init_cpio`` within
the Linux kernel tree. This avoids the compilation of ``cpio`` as well.
go_sysb
=======
This is the last step of sysa, run for non-chroot mode. It uses kexec to load
the new Linux kernel into RAM and execute it, moving into sysb.
sysb
====
sysb is purely a transition to sysc, allowing binaries from sysa to get onto a
disk (as sysa does not nessecarily have hard disk support in the kernel).
It populates device nodes, mounts sysc, copies over data, and executes sysc.
bash 5.1
========

@ -10,16 +10,28 @@ you can run bootstap inside chroot.
# SPDX-FileCopyrightText: 2021 Andrius Štikonas <andrius@stikonas.eu>
# SPDX-FileCopyrightText: 2021 Bastian Bittorf <bb@npl.de>
# SPDX-FileCopyrightText: 2021 Melg Eight <public.melg8@gmail.com>
# SPDX-FileCopyrightText: 2021 fosslinux <fosslinux@aussies.space>
import argparse
import glob
import os
import subprocess
import shutil
from sysa import SysA
from sysb import SysB
from sysc import SysC
from lib.utils import run
def create_configuration_file(args):
"""
Creates bootstrap.cfg file which would contain options used to
customize bootstrap.
"""
config_path = os.path.join('sysglobal', 'bootstrap.cfg')
with open(config_path, "w", encoding="utf_8") as config:
config.write("FORCE_TIMESTAMPS=" + str(args.force_timestamps) + "\n")
config.write("CHROOT=" + str(args.chroot) + "\n")
config.write("DISK=sda1\n")
def main():
"""
A few command line arguments to customize bootstrap.
@ -56,35 +68,20 @@ def main():
if args.arch != "x86":
raise ValueError("Only x86 is supported at the moment.")
system_a = SysA(arch=args.arch, preserve_tmp=args.preserve, tmpdir=args.tmpdir,
force_timestamps=args.force_timestamps)
initramfs_path = os.path.join(system_a.tmp_dir, "initramfs")
if not args.chroot:
make_initramfs(system_a.tmp_dir, initramfs_path)
bootstrap(args, system_a.tmp_dir, initramfs_path)
create_configuration_file(args)
def make_initramfs(tmp_dir, initramfs_path):
"""Package binary bootstrap seeds and sources into initramfs."""
file_list = glob.glob(os.path.join(tmp_dir, '**'), recursive=True)
system_b = SysB(arch=args.arch, preserve_tmp=args.preserve,
tmpdir=args.tmpdir, chroot=args.chroot)
system_a = SysA(arch=args.arch, preserve_tmp=args.preserve,
tmpdir=args.tmpdir, chroot=args.chroot, sysb_tmp=system_b.tmp_dir)
system_c = SysC(arch=args.arch, preserve_tmp=args.preserve,
tmpdir=args.tmpdir, chroot=args.chroot)
# Use built-in removeprefix once we can use Python 3.9
def remove_prefix(text, prefix):
if text.startswith(prefix):
return text[len(prefix):]
return text # or whatever
bootstrap(args, system_a, system_b, system_c)
file_list = [remove_prefix(f, tmp_dir + os.sep) for f in file_list]
with open(initramfs_path, "w") as initramfs:
cpio = subprocess.Popen(["cpio", "--format", "newc", "--create", "--directory", tmp_dir],
stdin=subprocess.PIPE, stdout=initramfs)
cpio.communicate(input='\n'.join(file_list).encode())
def bootstrap(args, tmp_dir, initramfs_path):
def bootstrap(args, system_a, system_b, system_c):
"""Kick off bootstrap process."""
print("Bootstrapping %s" % (args.arch))
print("Bootstrapping %s -- SysA" % (args.arch))
if args.chroot:
find_chroot = """
import shutil
@ -92,11 +89,19 @@ print(shutil.which('chroot'))
"""
chroot_binary = run('sudo', 'python3', '-c', find_chroot,
capture_output=True).stdout.decode().strip()
# sysa
init = os.path.join(os.sep, 'bootstrap-seeds', 'POSIX', args.arch, 'kaem-optional-seed')
run('sudo', 'env', '-i', 'PATH=/bin', chroot_binary, tmp_dir, init)
return
if args.minikernel:
run('sudo', 'env', '-i', 'PATH=/bin', chroot_binary, system_a.tmp_dir, init)
# Perform the steps for sysa -> sysc transition that would occur within
# qemu if we were running not in chroot
# We skip sysb as that is only pertinent to "hardware" (not chroot)
system_c.chroot_transition(system_a.tmp_dir)
# sysc
print("Bootstrapping %s -- SysC" % (args.arch))
init = os.path.join(os.sep, 'init')
run('sudo', chroot_binary, system_c.tmp_dir, init)
elif args.minikernel:
if os.path.isdir('kritis-linux'):
shutil.rmtree('kritis-linux')
@ -111,19 +116,21 @@ print(shutil.which('chroot'))
'--qemucpu', '486',
'--kernel', '3.18.140',
'--features', 'kflock,highrestimers',
'--ramsize', str(args.qemu_ram) + 'M',
'--initrd', initramfs_path,
# Hack to add -hda /dev/blah
'--ramsize', str(args.qemu_ram) + 'M -hda ' + system_b.dev_name,
'--initrd', system_a.initramfs_path,
'--log', '/tmp/bootstrap.log')
return
run(args.qemu_cmd,
'-enable-kvm',
'-m', str(args.qemu_ram) + 'M',
'-nographic',
'-no-reboot',
'-kernel', args.kernel,
'-initrd', initramfs_path,
'-append', "console=ttyS0")
else:
run(args.qemu_cmd,
'-enable-kvm',
'-m', str(args.qemu_ram) + 'M',
'-no-reboot',
'-hda', system_c.dev_name,
'-kernel', args.kernel,
'-initrd', system_a.initramfs_path,
'-nographic',
'-append', 'console=ttyS0')
if __name__ == "__main__":
main()

@ -3,131 +3,40 @@
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2021 Andrius Štikonas <andrius@stikonas.eu>
# SPDX-FileCopyrightText: 2021 Melg Eight <public.melg8@gmail.com>
# SPDX-FileCopyrightText: 2021 fosslinux <fosslinux@aussies.space>
import hashlib
import os
from distutils.dir_util import copy_tree
import shutil
import requests
from lib.utils import copytree
from lib.sysgeneral import SysGeneral
from lib.utils import mount, umount, copytree, get_target
class SysA:
# pylint: disable=consider-using-with
class SysA(SysGeneral):
"""
Class responsible for preparing sources for System A.
"""
def __init__(self, arch, preserve_tmp, tmpdir, force_timestamps):
# pylint: disable=too-many-instance-attributes,too-many-arguments
def __init__(self, arch, preserve_tmp, tmpdir, chroot, sysb_tmp):
self.git_dir = os.path.dirname(os.path.join(__file__))
self.arch = arch
self.preserve_tmp = preserve_tmp
self.sys_dir = os.path.join(self.git_dir, 'sysa')
if tmpdir is None:
self.tmp_dir = os.path.join(self.git_dir, 'sysa', 'tmp')
self.tmp_dir = os.path.join(self.sys_dir, 'tmp')
else:
self.tmp_dir = tmpdir
self.sysa_dir = os.path.join(self.git_dir, 'sysa')
self.tmp_dir = os.path.join(tmpdir, 'sysa')
os.mkdir(self.tmp_dir)
self.after_dir = os.path.join(self.tmp_dir, 'after')
self.force_timestamps = force_timestamps
self.base_dir = self.after_dir
self.sysb_tmp = sysb_tmp
self.prepare()
def __del__(self):
if not self.preserve_tmp:
print("Unmounting tmpfs from %s" % (self.tmp_dir))
umount(self.tmp_dir)
os.rmdir(self.tmp_dir)
def check_file(self, file_name):
"""Check hash of downloaded source file."""
checksum_store = os.path.join(self.git_dir, 'SHA256SUMS.sources')
with open(checksum_store) as checksum_file:
hashes = checksum_file.read().splitlines()
for hash_line in hashes:
if os.path.basename(file_name) in hash_line:
# Hash is in store, check it
expected_hash = hash_line.split()[0]
with open(file_name, "rb") as downloaded_file:
downloaded_content = downloaded_file.read() # read entire file as bytes
readable_hash = hashlib.sha256(downloaded_content).hexdigest()
if expected_hash == readable_hash:
return
raise Exception("Checksum mismatch")
raise Exception("File checksum is not yet recorded")
def download_file(self, url, file_name=None):
"""
Download a single source archive.
"""
cache_dir = os.path.join(self.git_dir, 'sources')
# Automatically determine file name based on URL.
if file_name is None:
file_name = os.path.basename(url)
abs_file_name = os.path.join(cache_dir, file_name)
# Create a cache directory for downloaded sources
if not os.path.isdir(cache_dir):
os.mkdir(cache_dir)
# Actually download the file
if not os.path.isfile(abs_file_name):
print("Downloading: %s" % (file_name))
response = requests.get(url, allow_redirects=True, stream=True)
if response.status_code == 200:
with open(abs_file_name, 'wb') as target_file:
target_file.write(response.raw.read())
else:
raise Exception("Download failed.")
# Check SHA256 hash
self.check_file(abs_file_name)
return abs_file_name
def get_file(self, url, output=None):
"""
Download and prepare source packages
url can be either:
1. a single URL
2. list of URLs to download. In this case the first URL is the primary URL
from which we derive the name of package directory
output can be used to override file name of the downloaded file(s).
"""
# Single URL
if isinstance(url, str):
assert output is None or isinstance(output, str)
file_name = url if output is None else output
urls = [url]
outputs = [output]
# Multiple URLs
elif isinstance(url, list):
assert output is None or len(output) == len(url)
file_name = url[0] if output is None else output[0]
urls = url
outputs = output if output is not None else [None] * len(url)
else:
raise TypeError("url must be either a string or a list of strings")
# Determine installation directory
target_name = get_target(file_name)
target_src_dir = os.path.join(self.after_dir, target_name, 'src')
# Install base files
src_tree = os.path.join(self.sysa_dir, target_name)
copytree(src_tree, self.after_dir)
if not os.path.isdir(target_src_dir):
os.mkdir(target_src_dir)
for i, _ in enumerate(urls):
# Download files into cache directory
tarball = self.download_file(urls[i], outputs[i])
# Install sources into target directory
shutil.copy2(tarball, target_src_dir)
if not chroot:
self.make_initramfs()
def prepare(self):
"""
@ -135,17 +44,23 @@ class SysA:
We create an empty tmpfs, unpack stage0-posix.
Rest of the files are unpacked into more structured directory /after
"""
if not os.path.isdir(self.tmp_dir):
os.mkdir(self.tmp_dir)
print("Mounting tmpfs on %s" % (self.tmp_dir))
mount('tmpfs', self.tmp_dir, 'tmpfs', 'size=8G')
self.mount_tmpfs()
os.mkdir(self.after_dir)
self.stage0_posix()
self.after()
# sysb must be added to sysa as it is another initramfs stage
self.sysb()
def sysb(self):
"""Copy in sysb files for sysb."""
shutil.copytree(self.sysb_tmp, os.path.join(self.tmp_dir, 'sysb'),
shutil.ignore_patterns('tmp'))
def stage0_posix(self):
"""Copy in all of the stage0-posix"""
stage0_posix_base_dir = os.path.join(self.sysa_dir, 'stage0-posix', 'src')
stage0_posix_base_dir = os.path.join(self.sys_dir, 'stage0-posix', 'src')
stage0_posix_arch_dir = os.path.join(stage0_posix_base_dir, self.arch)
copy_tree(stage0_posix_arch_dir, self.tmp_dir)
@ -166,14 +81,14 @@ class SysA:
copytree(mescc_tools_extra_dir, self.tmp_dir)
# bootstrap seeds
bootstrap_seeds_dir = os.path.join(self.sysa_dir, 'stage0-posix', 'src', 'bootstrap-seeds')
bootstrap_seeds_dir = os.path.join(self.sys_dir, 'stage0-posix', 'src', 'bootstrap-seeds')
copytree(bootstrap_seeds_dir, self.tmp_dir)
kaem_optional_seed = os.path.join(bootstrap_seeds_dir, 'POSIX',
self.arch, 'kaem-optional-seed')
shutil.copy2(kaem_optional_seed, os.path.join(self.tmp_dir, 'init'))
# stage0-posix hook to continue running live-bootstrap
shutil.copy2(os.path.join(self.sysa_dir, 'after.kaem'),
shutil.copy2(os.path.join(self.sys_dir, 'after.kaem'),
os.path.join(self.tmp_dir, 'after.kaem'))
# create directories needed
@ -190,25 +105,15 @@ class SysA:
the stage0-posix one is hella messy.
"""
self.create_configuration_file()
self.deploy_extra_files()
self.deploy_sysglobal_files()
self.get_packages()
def create_configuration_file(self):
"""
Creates bootstrap.cfg file which would contain options used to
customize bootstrap.
"""
os.mkdir(self.after_dir)
config_path = os.path.join(self.after_dir, "bootstrap.cfg")
with open(config_path, "w") as config:
config.write("FORCE_TIMESTAMPS=" + str(self.force_timestamps))
def deploy_extra_files(self):
"""Deploy misc files"""
extra_files = ['helpers.sh', 'run.sh', 'run2.sh']
extra_files = ['run.sh']
for extra_file in extra_files:
shutil.copy2(os.path.join(self.sysa_dir, extra_file), self.after_dir)
shutil.copy2(os.path.join(self.sys_dir, extra_file), self.after_dir)
shutil.copy2(os.path.join(self.git_dir, 'SHA256SUMS.sources'), self.after_dir)
@ -367,100 +272,31 @@ class SysA:
self.get_file("https://mirrors.kernel.org/gnu/autoconf/autoconf-2.64.tar.bz2")
# gcc 4.0.4
self.get_file("https://mirrors.kernel.org/gnu/gcc/gcc-4.0.4/gcc-core-4.0.4.tar.bz2",
output="gcc-4.0.4.tar.bz2")
self.get_file(["https://mirrors.kernel.org/gnu/gcc/gcc-4.0.4/gcc-core-4.0.4.tar.bz2",
"https://mirrors.kernel.org/gnu/automake/automake-1.16.3.tar.gz"],
output=["gcc-4.0.4.tar.bz2", "automake-1.16.3.tar.gz"])
# linux api headers 5.10.41
self.get_file("https://mirrors.kernel.org/pub/linux/kernel/v5.x/linux-5.10.41.tar.gz",
output="linux-headers-5.10.41.tar.gz")
# musl 1.2.2
self.get_file("https://musl.libc.org/releases/musl-1.2.2.tar.gz")
# bash 5.1
self.get_file("https://mirrors.kernel.org/gnu/bash/bash-5.1.tar.gz")
# xz 5.0.5
self.get_file("https://tukaani.org/xz/xz-5.0.5.tar.bz2")
# automake 1.11.2
self.get_file("https://mirrors.kernel.org/gnu/automake/automake-1.11.2.tar.bz2")
# autoconf 2.69
self.get_file("https://mirrors.kernel.org/gnu/autoconf/autoconf-2.69.tar.xz")
# automake 1.15.1
self.get_file("https://mirrors.kernel.org/gnu/automake/automake-1.15.1.tar.xz")
# tar 1.34
self.get_file(["https://mirrors.kernel.org/gnu/tar/tar-1.34.tar.xz",
"https://git.savannah.gnu.org/cgit/gnulib.git/snapshot/gnulib-30820c.tar.gz"])
# coreutils 8.32
self.get_file(["https://git.savannah.gnu.org/cgit/coreutils.git/snapshot/coreutils-8.32.tar.gz",
"https://git.savannah.gnu.org/cgit/gnulib.git/snapshot/gnulib-d279bc.tar.gz"])
# pkg-config 0.29.2
self.get_file("https://pkgconfig.freedesktop.org/releases/pkg-config-0.29.2.tar.gz")
# make 4.2.1
self.get_file("https://ftp.gnu.org/gnu/make/make-4.2.1.tar.gz")
# gmp 6.2.1
self.get_file("https://mirrors.kernel.org/gnu/gmp/gmp-6.2.1.tar.xz")
# autoconf archive 2021.02.19
self.get_file("https://mirrors.kernel.org/gnu/autoconf-archive/autoconf-archive-2021.02.19.tar.xz")
# mpfr 4.1.0
self.get_file("https://mirrors.kernel.org/gnu/mpfr/mpfr-4.1.0.tar.xz")
# mpc 1.2.1
self.get_file("https://mirrors.kernel.org/gnu/mpc/mpc-1.2.1.tar.gz")
# flex 2.5.33
self.get_file("http://download.nust.na/pub2/openpkg1/sources/DST/flex/flex-2.5.33.tar.gz")
# bison 2.3
self.get_file(["https://mirrors.kernel.org/gnu/bison/bison-2.3.tar.bz2",
"https://git.savannah.gnu.org/cgit/gnulib.git/snapshot/gnulib-b28236b.tar.gz"])
# bison 3.4.2
self.get_file(["https://mirrors.kernel.org/gnu/bison/bison-3.4.2.tar.xz",
"https://git.savannah.gnu.org/cgit/gnulib.git/snapshot/gnulib-672663a.tar.gz"])
# perl 5.10.5
self.get_file("https://www.cpan.org/src/5.0/perl-5.10.1.tar.bz2")
# dist 3.5-236
# Debian's version is used because upstream is not to be found (dead?)
self.get_file("https://salsa.debian.org/perl-team/interpreter/dist/-/archive/d1de81f/dist-d1de81f.tar.gz",
output="dist-3.5-236.tar.gz")
# perl 5.32.1
self.get_file(["https://www.cpan.org/src/5.0/perl-5.32.1.tar.xz",
"https://salsa.debian.org/perl-team/interpreter/perl/-/archive/5f2dc80/perl-5f2dc80.tar.bz2"])
# automake 1.16.3
self.get_file("https://mirrors.kernel.org/gnu/automake/automake-1.16.3.tar.gz")
# patch 2.7.6
self.get_file(["https://mirrors.kernel.org/gnu/patch/patch-2.7.6.tar.xz",
"https://git.savannah.gnu.org/cgit/gnulib.git/snapshot/gnulib-e017871.tar.gz"])
# gettext 0.21
self.get_file(["https://mirrors.kernel.org/gnu/gettext/gettext-0.21.tar.xz",
"https://git.savannah.gnu.org/cgit/gnulib.git/snapshot/gnulib-7daa86f.tar.gz"])
# texinfo 6.7
self.get_file(["https://mirrors.kernel.org/gnu/texinfo/texinfo-6.7.tar.xz",
"https://git.savannah.gnu.org/cgit/gnulib.git/snapshot/gnulib-b81ec69.tar.gz"])
# util-linux 2.19.1
self.get_file("https://mirrors.kernel.org/pub/linux/utils/util-linux/v2.19/util-linux-2.19.1.tar.gz")
# zlib 1.2.11
self.get_file("https://www.zlib.net/zlib-1.2.11.tar.xz")
# kexec-tools 2.0.22
self.get_file("https://github.com/horms/kexec-tools/archive/refs/tags/v2.0.22.tar.gz",
output="kexec-tools-2.0.22.tar.gz")
# gcc 4.7.4
self.get_file("https://mirrors.kernel.org/gnu/gcc/gcc-4.7.4/gcc-4.7.4.tar.bz2")
# kbd 1.15
self.get_file("https://mirrors.edge.kernel.org/pub/linux/utils/kbd/kbd-1.15.tar.gz")
# gperf 3.1
self.get_file("https://mirrors.kernel.org/gnu/gperf/gperf-3.1.tar.gz")
# make 3.82
self.get_file("http://ftp.gnu.org/gnu/make/make-3.82.tar.gz")
# libunistring 0.9.10
self.get_file(["https://mirrors.kernel.org/gnu/libunistring/libunistring-0.9.10.tar.xz",
"https://git.savannah.gnu.org/cgit/gnulib.git/snapshot/gnulib-52a06cb3.tar.gz"])
# linux kernel 2.6.16.62
self.get_file(["https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.10.tar.gz",
"http://linux-libre.fsfla.org/pub/linux-libre/releases/4.9.10-gnu/deblob-4.9",
"http://linux-libre.fsfla.org/pub/linux-libre/releases/4.9.10-gnu/deblob-check"])

@ -12,7 +12,7 @@ PATH=/bin
# Set commonly used variables
sources=/after
prefix=/image
prefix=/usr
bindir=${prefix}/bin
libdir=${prefix}/lib
incdir=${prefix}/include
@ -23,8 +23,7 @@ NYACC_PKG=nyacc-1.00.2
MES_PKG=mes
MES_PREFIX=${sources}/${MES_PKG}/src/mes-m2-a7522f26ee020dc498219d0122ea1b7d345bcdd5
GUILE_LOAD_PATH=${MES_PREFIX}/mes/module:${MES_PREFIX}/module:${sources}/${MES_PKG}/src/${NYACC_PKG}/module
mkdir ${bindir} ${libdir} ${incdir} ${tmpdir}
mkdir ${prefix} ${bindir} ${libdir} ${incdir} ${tmpdir}
cd ${prefix}
# Remove remaining dependencies on /bin (stage0-posix directory)
@ -33,15 +32,14 @@ cp /bin/catm bin/catm
cp /bin/chmod bin/chmod
cp /bin/get_machine bin/get_machine
cp /bin/hex2 bin/hex2
cp /bin/kaem bin/kaem
cp /bin/kaem ${bindir}/kaem
cp /bin/M1 bin/M1
cp /bin/M2-Planet bin/M2-Planet
cp /bin/mkdir bin/mkdir
cp /bin/sha256sum bin/sha256sum
cp /bin/ungz bin/ungz
cp /bin/untar bin/untar
cp /bin/cp ${prefix}/bin/cp
cp /bin/cp bin/cp
chmod 755 bin/blood-elf
chmod 755 bin/catm
@ -57,7 +55,7 @@ chmod 755 bin/sha256sum
chmod 755 bin/ungz
chmod 755 bin/untar
PATH=${prefix}/bin
PATH=${bindir}
cd ${sources}

@ -1 +1 @@
af075793e3992c4da992814641e92f8dd5e7d0454f1ace58bcd6ed54fb86cfa9 /image/bin/bash
4605c6f97ea53889b5b7bbdebbd8209f29142f1c8ec25c759ef8500b0501ca5e /usr/bin/bash

@ -1 +0,0 @@
7b56621ecdc96fdde8863bea6e6ca903ab35619d0a453d906ed4dfc7d2c68e4d /image/bin/bash

@ -1,19 +1,19 @@
a64dd48319724c048a7523b030068b6d82d231c9e993e936b9dda784bc59287d /image/bin/ar
396a7acf5eb4c4a52acb61671979c3d7f3168e05498684a6a4e933e96776929d /image/bin/as
3898cc265c6818f65e1ce84eb555d2b67e5ea68c717f08e216f22fa7b53d1304 /image/bin/c++filt
a79a4a95e394e5521fe8ba426c1d9ffb7965f20767a7a25123072fc1056ffc4c /image/bin/gprof
8e8c53332d444c4810631a0a304118878eacb1fd730aa978ef24d81a72cfa723 /image/bin/ld
b1d0920558097413c45da60ac2e7210b8eaf97090d28211593b929a8e8ac56b7 /image/bin/nm
3816b868f47e1812b50c2a887ff8fbebcf51eb143f78e79427750b097d1c6360 /image/bin/objcopy
5ae33d450c5f9b993b979ff298ffd57b20cb316e21c16dfbca473dcc1a3dac24 /image/bin/objdump
e49bba1ea6a61fb90f754e8de4692ed0810e7c68429f0b22fbf37670607a7807 /image/bin/od
f909e690a1256861252c389a978e7561bba317415ae0805735a12ee1a92c16c2 /image/bin/ranlib
e8dbc4ff1642541d0789a3accbe52c7b71888cd85ec9a9e82f50dc0b6bf8346f /image/bin/readelf
c61846e74119fd105684cdcbc2f5e31aa47cf090dfe6bf4d1ba6101e75f5fe8c /image/bin/size
d26d4b1fc92dbd16da852598caee35981283b52a00c0a9df5dadf3f91c75d2de /image/bin/strings
015587bd00f9451a58e1fb26e38e52ab08e016da44e577276045742a1be76d71 /image/bin/strip
a5d224d76b8604550917b0c5e17473054b175a0dc9ecd7055a4522ab3a06f2a1 /image/lib/musl/libbfd.a
4e2bb9a8d3c4b377112f1299b1954764e5db63b83586a95d072ffd5e2efb45ae /image/lib/musl/libbfd.la
2d1dba5dd076ebf57c68e4a7ae759d4ba50ca34d4f2731c6cfec914cfa923a44 /image/lib/musl/libiberty.a
cf374d1cb063913333f586b1b51f865671e5527a9991db022739d2b9fe47a0f7 /image/lib/musl/libopcodes.a
8f1fd8389fe5e28d20d91c50fd10ae210afe5730a8ae39d0cec600aca1fe614a /image/lib/musl/libopcodes.la
85de1f0626450cf9002855c06be0e0da6bb55989f370e7ebd2054449bf53a0df /usr/bin/ar
e1949d4d9fad1330bd0db1185aed915c4261d81f59d825208b77cfc7ef53a5d9 /usr/bin/as
eb43f2a231a680bd8a41baaa766b23fdc98c33359b18271708b61dba12b39575 /usr/bin/c++filt
54136ec4a3e957639e26b443acdda6a1b41da511ac44e8126c429b5be8b3137c /usr/bin/gprof
a2f6c731542c5bbe554d369661be33f37d5017c2145d6848f33e43d80604ae93 /usr/bin/ld
00d840cd3b0d5a4ec5a577b0ccd796ba42e569117f9827bcdbc388dcd2c04169 /usr/bin/nm
893f9742bc2002c8175f33cdb9fb1e963faef74196bd68d9239f1de2b0211927 /usr/bin/objcopy
997747e8321155d96a090f56f85aea1ef456c5f58d0a5f38a6a7021bfaea2379 /usr/bin/objdump
e49bba1ea6a61fb90f754e8de4692ed0810e7c68429f0b22fbf37670607a7807 /usr/bin/od
06e5089e14fa1b5413892b0f4ecc6fb9734ba0f59f6ba9506877d31b1c4ac653 /usr/bin/ranlib
a24dd433dfad44c3045b512d8e4170e2fec309bbf66ddd6ac501709749d19920 /usr/bin/readelf
ca55356ddddd58ac146a5073f114019354eccbfb761fd800265717c986b57d87 /usr/bin/size
856a22fda1db00fb3ab785fd7255ba5e1d3389ae691327304ded03f19bb1af9e /usr/bin/strings
66a92ba55f92b3db2b1229ced0144192ac4f3b36ba3d4fd0a2011c2fbd8127a2 /usr/bin/strip
97ed2674127a3ff1201ee2b69bcd336a3e7f9396b58f0264d6cd6f08e3908e43 /usr/lib/musl/libbfd.a
e1636c430ebe933462df742d9eec18e0e8ba73dafde763429a6b63ff70612afc /usr/lib/musl/libbfd.la
8bfe163be82996810f105bcd158f9a207c61438db7a7c58306cfd80f2462c35a /usr/lib/musl/libiberty.a
d39bbca00ea43af8a80d0b3f7e2aaabee1e571dd976d17ded01c5972fb5b4ff8 /usr/lib/musl/libopcodes.a
3cb39a86c59f72affc6defe90d4e3c585ffedeb47a8f9bfc015be9b85a04ff7a /usr/lib/musl/libopcodes.la

@ -1 +0,0 @@
5f32418b2681b9c26a845689d9761f0c28bbaadce32c58d6b203f4ad8ebe0234 /image/bin/bison-2.3

@ -1 +1 @@
375c28f9c28072578cf423cb7e090a083beb142759ab5ea2e22a6f8c196e23c6 /image/bin/bison
bf1386d70d56dd169e97bdeaa6282592de830d0e262db59de0451adfd0f9125b /usr/bin/bison

@ -1 +1 @@
6045f624843821108ebaf808e7e6abebb17a7353562e41c2514422035b8bd7c7 /image/bin/bison
253ee303e001ee8faa25066e8259595e5dd85209aa1ec947c58a6880d7d86e1b /usr/bin/bison

@ -1 +1 @@
48f41785497a059ae4a565161f4b7226016055803a7c19bbe7600c67d3085550 /image/bin/bison
dd14d6c43beb638a389e91d967589b193d0faf80572db044464440835f1040c6 /usr/bin/bison

@ -1,4 +1,5 @@
// SPDX-FileCopyrightText: 2020 Andrius Štikonas <andrius@stikonas.eu>
// SPDX-FileCopyrightText: 2021 fosslinux <fosslinux@aussies.space>
// SPDX-License-Identifier: GPL-3.0-or-later
@ -9,7 +10,7 @@
#define HAVE_SNPRINTF 1
#define HAVE_STDINT_H 1
#define HAVE_UNISTD_H 1
#define M4 "/image/bin/m4"
#define M4 "/usr/bin/m4"
#define M4_GNU_OPTION ""
#define PACKAGE "bison"
#define PACKAGE_BUGREPORT "bug-bison@gnu.org"

@ -1,6 +1,7 @@
// SPDX-FileCopyrightText: 2020 Andrius Štikonas <andrius@stikonas.eu>
// SPDX-FileCopyrightText: 2021 fosslinux <fosslinux@aussies.space>
// SPDX-License-Identifier: GPL-3.0-or-later
#define LOCALEDIR "/image/share/locale"
#define PKGDATADIR "/image/share/bison"
#define LOCALEDIR "/usr/share/locale"
#define PKGDATADIR "/usr/share/bison"

@ -1 +0,0 @@
7659e6caa1c0f82722bc2d80b614a1fa500e531ce0f359c3a813b742738ad7c6 /image/bin/bison

@ -1 +1 @@
053a7c3080ab19303bc6610ee6d7af2acd69c19d7d74554cfa3d912fa7feb537 /image/bin/bzip2
6e93edb69a8089d5f0bd20ac29acf2ed1454c0bcb97e9aed085757b02f0f3756 /usr/bin/bzip2

@ -1 +1 @@
9bf6c960e7862cbe451e07fc80fc63b802962d981d39842c84ee133dc441bf08 /image/bin/bzip2
9275f8bbefcb9ac683663c9eeaf575f1fe8c2a354de69791a039164807c1a436 /usr/bin/bzip2

@ -1,54 +1,54 @@
113a08baeaaaafd87295806756a5b5eee73a55347e86b4930e01c15d7220f74b /image/bin/install
f6dd08d95b1ecdd32c7804afa226d734fb4efbe54e67532023deb3a95df2899d /image/bin/basename
8bf26dadc87990c5ec5fe6551145049d52ded48640ce7ac47b05b458ff870cfa /image/bin/cat
3cfdf2a0f1db912f1daa3015ceb99689f51970196c85a049a3e098bd96271b20 /image/bin/chmod
994197dd07610b44608b388242c70adb9ec49bb2a643dcfdfb1e105529c2e379 /image/bin/cksum
78c1187c2ce90fe24acc739eeb159363de70e06e239bac3ea096ee1cf3f9d273 /image/bin/cp
a09aeffc07c868076aa034fd1650f8faca703379aa31d5b5fd911adf98901c82 /image/bin/csplit
e3149e91b206a83b4e7341b5df6ddefddfe04be4b9859642b23e2ee684de0e2d /image/bin/cut
39713a15ea9b4a46d01f8d0a2ca99fe83acab34980442cf4e26d0c495e63acd3 /image/bin/echo
b9b229f0cfe7c2077c7f1ce30b91d07ae02794bb52520367053e4c5dae815617 /image/bin/expand
79f91e16249f8f595fb4dd68a05413c8f28bd3a15f25ed07d602b504f745b33f /image/bin/factor
a7071f0800ed49164535244ac82e6288ca7f4c9ef119ce722e809c965feba43e /image/bin/false
c7c581160a28eaea971e1333b19e07b81e98897a251f05f8fe5fd1fd2c89ad2a /image/bin/fmt
bfdeeba7192725dc6f5b4084f73e42d518a05900af05a062b4862fcb3b7a5a0d /image/bin/fold
b914fce359292bd4134af0d0086c4d5920a6482e784c60483c60daa86ba3e2ca /image/bin/head
142cd716a75921fc3d4f824c75515147f12b53e83f0a89a09f17aaaeaa9b1543 /image/bin/id
890bd5186317a1da5309881ad12426e45144b059436b7045a18ab670ac34585b /image/bin/join
c8d87edb84146d2c536be5cea326b5fe456eb9fb39511f535312e52577d1c229 /image/bin/kill
5c827dc96610836ec41ced32fdff18584dfa7380431cf5f99960effcec16b6da /image/bin/link
75da5a77d612a6c9ab2c63f52e0c53613917b46f243a6ca78a15edc1ab2322d2 /image/bin/ln
e74bc32191c7f53b659c7b1937d9799e7e56a71f0d68a00a085df99d900ac71a /image/bin/logname
fc1b745d7b10d84445fe6f4a42cb1893827f13029eb5ba93568c4668182ef0c3 /image/bin/mkfifo
2aaba60b28b63c8fe0199202a364327bb235fb628424c70d85ddf1b011a603b9 /image/bin/mkdir
541dfb8cddfc66fe7e2628012c6557d34eb071312af6ad9178c14ab374970ea0 /image/bin/mknod
95cf6269ae7608960bf1eb1062cd8f1f9981534b8e66449c3076c2b270f02970 /image/bin/nl
82109de6321e241128763333ba7e32db91d6fd07124dd3198fdd80f5c8679cf5 /image/bin/od
89537a3ff8d001059b2875e49b02e64f5cc9e70ee0053b1407c9e13a949097cf /image/bin/paste
876bf7b6743fb7a8b9967f9f8ae0ce7deabe9a109b5d8655e2042435c8dc9141 /image/bin/pathchk
249eb2c58d2e82bc38a008c3fa6da4ece2c56f198396901ffb4667cd55bd6d29 /image/bin/printf
0c7b355b1b81093b740efd5afdec417f1902edb3c4c7335320ad371aa67e66a5 /image/bin/ptx
a5a7d59c3daddcd12a5a1f69710f970fba40f319baa6e8a2d7ee6da55936d046 /image/bin/pwd
bb5be58fc44331fedc405f28d6bf9014105376db48ab6921de4468c26868b0cd /image/bin/readlink
cf83e7cf46b52440d593d08c03859bf2354affd3d184d4975fb4d1ba0a9b5260 /image/bin/rmdir
ed0e8f05df2f9a757a783a783d4d5efc4fc85d5f5ade8b61b6c32bd64047eaaf /image/bin/seq
3a839fe7e32dff6a2597390660beb10ee15eabd2d1fe4531a58eed035fa0db5f /image/bin/sleep
978bab078ddc398c8617697143265b5c0791d74730895243e11f30f208389095 /image/bin/split
ee8532ca989f75ec263121c20f13474ad73aafa503bb2ae2f785708b0244c329 /image/bin/sum
40d71b38897a5ceacd45a4c49a2d84dab4d175fff4e7fcf98785c31d2ec715f2 /image/bin/tail
cb8ff79e7566d6fbfe0c5d384163585306a9ef7e9e525fea0bf0c8a5c2af8238 /image/bin/tee
6ab10d4a009e2b134c7e854f2561da93d74b95701d538659284d5035bc88ff89 /image/bin/tr
062e387534cc7661b11346524f84e38f5e64a4326819377b9bc3aa675fb6a409 /image/bin/tsort
07103fb0d194c01576894c800eecc3be9588103e93c6e8b9c0e6063fb9dde5af /image/bin/unexpand
054c7b8ef262065dc965b885baa858602165609322196515a6e9415b0f9a21e5 /image/bin/unlink
545d17edd4994ab9d405b27b0ebd5d9ef1e3d4c1c172bc5c47112a740ce88e15 /image/bin/wc
9464990ed84759efab8bc3b5b67cf6f77c03ccf988bbe6e571a12ea3d6b01cd9 /image/bin/whoami
060e30b58112feba89aa3b90506d7c8f532837ab339b45f351ebe4a39aa36049 /image/bin/test
0d1e615de04e3d99b5cfd9b86eac332113227eb87707e025748ddde134720596 /image/bin/touch
af3a6577c63e79cd2bbabd3c966790ef006c2d5d2584573ba91667d45f80fec3 /image/bin/true
0321a3302b2883914612d9e3dad00e5f338e5c9541651ef293bb38503a9ae39c /image/bin/yes
84dd2d7cb8216eceaa3d53886832034c1b68f174239fe51adb68e2ec45901610 /image/bin/ls
acb87cf7d9c1be94dde273bf3f9ab21115ff86a1cc783963dd7571729c4a82e8 /image/bin/md5sum
039aa7005ce1280641e9828ea407e1e80994176a5c546d3bc6f88fd8d34f79c5 /image/bin/mv
ba5655e1ae7be5b5655513b19d03d385840c707528bd0baa907dc2b117d35d97 /image/bin/rm
330d475015d0d78af61789f44d636b14082d64a64dd7faf481677c014fb5a606 /image/bin/sha1sum
113a08baeaaaafd87295806756a5b5eee73a55347e86b4930e01c15d7220f74b /usr/bin/install
f6dd08d95b1ecdd32c7804afa226d734fb4efbe54e67532023deb3a95df2899d /usr/bin/basename
8bf26dadc87990c5ec5fe6551145049d52ded48640ce7ac47b05b458ff870cfa /usr/bin/cat
3cfdf2a0f1db912f1daa3015ceb99689f51970196c85a049a3e098bd96271b20 /usr/bin/chmod
994197dd07610b44608b388242c70adb9ec49bb2a643dcfdfb1e105529c2e379 /usr/bin/cksum
78c1187c2ce90fe24acc739eeb159363de70e06e239bac3ea096ee1cf3f9d273 /usr/bin/cp
a09aeffc07c868076aa034fd1650f8faca703379aa31d5b5fd911adf98901c82 /usr/bin/csplit
e3149e91b206a83b4e7341b5df6ddefddfe04be4b9859642b23e2ee684de0e2d /usr/bin/cut
39713a15ea9b4a46d01f8d0a2ca99fe83acab34980442cf4e26d0c495e63acd3 /usr/bin/echo
b9b229f0cfe7c2077c7f1ce30b91d07ae02794bb52520367053e4c5dae815617 /usr/bin/expand
79f91e16249f8f595fb4dd68a05413c8f28bd3a15f25ed07d602b504f745b33f /usr/bin/factor
a7071f0800ed49164535244ac82e6288ca7f4c9ef119ce722e809c965feba43e /usr/bin/false
c7c581160a28eaea971e1333b19e07b81e98897a251f05f8fe5fd1fd2c89ad2a /usr/bin/fmt
bfdeeba7192725dc6f5b4084f73e42d518a05900af05a062b4862fcb3b7a5a0d /usr/bin/fold
b914fce359292bd4134af0d0086c4d5920a6482e784c60483c60daa86ba3e2ca /usr/bin/head
142cd716a75921fc3d4f824c75515147f12b53e83f0a89a09f17aaaeaa9b1543 /usr/bin/id
890bd5186317a1da5309881ad12426e45144b059436b7045a18ab670ac34585b /usr/bin/join
c8d87edb84146d2c536be5cea326b5fe456eb9fb39511f535312e52577d1c229 /usr/bin/kill
5c827dc96610836ec41ced32fdff18584dfa7380431cf5f99960effcec16b6da /usr/bin/link
75da5a77d612a6c9ab2c63f52e0c53613917b46f243a6ca78a15edc1ab2322d2 /usr/bin/ln
e74bc32191c7f53b659c7b1937d9799e7e56a71f0d68a00a085df99d900ac71a /usr/bin/logname
fc1b745d7b10d84445fe6f4a42cb1893827f13029eb5ba93568c4668182ef0c3 /usr/bin/mkfifo
2aaba60b28b63c8fe0199202a364327bb235fb628424c70d85ddf1b011a603b9 /usr/bin/mkdir
541dfb8cddfc66fe7e2628012c6557d34eb071312af6ad9178c14ab374970ea0 /usr/bin/mknod
95cf6269ae7608960bf1eb1062cd8f1f9981534b8e66449c3076c2b270f02970 /usr/bin/nl
82109de6321e241128763333ba7e32db91d6fd07124dd3198fdd80f5c8679cf5 /usr/bin/od
89537a3ff8d001059b2875e49b02e64f5cc9e70ee0053b1407c9e13a949097cf /usr/bin/paste
876bf7b6743fb7a8b9967f9f8ae0ce7deabe9a109b5d8655e2042435c8dc9141 /usr/bin/pathchk
0eb7a6d22a2a1daccd547e4f61090bf7a19ed63a3aec64076d9b6b14ad5ac873 /usr/bin/printf
0c7b355b1b81093b740efd5afdec417f1902edb3c4c7335320ad371aa67e66a5 /usr/bin/ptx
a5a7d59c3daddcd12a5a1f69710f970fba40f319baa6e8a2d7ee6da55936d046 /usr/bin/pwd
bb5be58fc44331fedc405f28d6bf9014105376db48ab6921de4468c26868b0cd /usr/bin/readlink
cf83e7cf46b52440d593d08c03859bf2354affd3d184d4975fb4d1ba0a9b5260 /usr/bin/rmdir
ed0e8f05df2f9a757a783a783d4d5efc4fc85d5f5ade8b61b6c32bd64047eaaf /usr/bin/seq
3a839fe7e32dff6a2597390660beb10ee15eabd2d1fe4531a58eed035fa0db5f /usr/bin/sleep
978bab078ddc398c8617697143265b5c0791d74730895243e11f30f208389095 /usr/bin/split
ee8532ca989f75ec263121c20f13474ad73aafa503bb2ae2f785708b0244c329 /usr/bin/sum
40d71b38897a5ceacd45a4c49a2d84dab4d175fff4e7fcf98785c31d2ec715f2 /usr/bin/tail
cb8ff79e7566d6fbfe0c5d384163585306a9ef7e9e525fea0bf0c8a5c2af8238 /usr/bin/tee
6ab10d4a009e2b134c7e854f2561da93d74b95701d538659284d5035bc88ff89 /usr/bin/tr
062e387534cc7661b11346524f84e38f5e64a4326819377b9bc3aa675fb6a409 /usr/bin/tsort
07103fb0d194c01576894c800eecc3be9588103e93c6e8b9c0e6063fb9dde5af /usr/bin/unexpand
054c7b8ef262065dc965b885baa858602165609322196515a6e9415b0f9a21e5 /usr/bin/unlink
545d17edd4994ab9d405b27b0ebd5d9ef1e3d4c1c172bc5c47112a740ce88e15 /usr/bin/wc
9464990ed84759efab8bc3b5b67cf6f77c03ccf988bbe6e571a12ea3d6b01cd9 /usr/bin/whoami
060e30b58112feba89aa3b90506d7c8f532837ab339b45f351ebe4a39aa36049 /usr/bin/test
0d1e615de04e3d99b5cfd9b86eac332113227eb87707e025748ddde134720596 /usr/bin/touch
af3a6577c63e79cd2bbabd3c966790ef006c2d5d2584573ba91667d45f80fec3 /usr/bin/true
0321a3302b2883914612d9e3dad00e5f338e5c9541651ef293bb38503a9ae39c /usr/bin/yes
84dd2d7cb8216eceaa3d53886832034c1b68f174239fe51adb68e2ec45901610 /usr/bin/ls
acb87cf7d9c1be94dde273bf3f9ab21115ff86a1cc783963dd7571729c4a82e8 /usr/bin/md5sum
039aa7005ce1280641e9828ea407e1e80994176a5c546d3bc6f88fd8d34f79c5 /usr/bin/mv
ba5655e1ae7be5b5655513b19d03d385840c707528bd0baa907dc2b117d35d97 /usr/bin/rm
330d475015d0d78af61789f44d636b14082d64a64dd7faf481677c014fb5a606 /usr/bin/sha1sum

@ -1,60 +1,60 @@
fafa676fe85f662f753bb5257ba6575086c6d4d7b8b27a952624db08e136b1ac /image/bin/basename
8b4e2b1ea346298b6534894e85cfa3ac4ee9bd1900da1d044a45c366d143dbf0 /image/bin/cat
24b11f735c4dcbd28e0defcef6208f419ebb3a7f33a5f7addb41d7df9e021bc1 /image/bin/chmod
8dd096b3a2973c4e3652e6bfffc30d2d85e8cb9b7f6cbbb2079cdb00a465589f /image/bin/cksum
6e9c29ae39dc9cc13925fe4066ab1867d0623bc704b2b1be6e242dc27b6c8ea1 /image/bin/cp
220ee0e1e19ad52403794872fd879619c25e2bf6b22d9616799250f76f8b9960 /image/bin/csplit
15eea66971190c390da91bd8537c01b689e1cf24cc96cd256607ef437f07f41d /image/bin/cut
567d079e9c0122410284414c0f2db2248e78686b403dabd9c7abd12c20ad9f89 /image/bin/dd
c033f4ae4ca47c1ae267d9f983c35366f5bf803b53422a073fbdd60dd3c745a8 /image/bin/dirname
0884b23703671535b882cffe99720d18f0f915b9323184dc20c0b7ef1af9ec4b /image/bin/echo
4bb7dca4382da61d02331c6785f254e04789e9a26e034fd4bbc40b969bdc81a5 /image/bin/env
76932efb69bc33a101a0a72424fc9dd50036b5f3fa09101d2d776a2e8aad7f3d /image/bin/expand
aea616aaf5c8c63f564a77d4469cbc49088531920dc927db24c70e8c5872c97b /image/bin/expr
6e082caf5494d14d8e8eb0c8284942389198ac0fff8646c08b3136039a8a1579 /image/bin/factor
94132ca47c73ec70cc5f817a7d4c3de8ec37f7664564028c6daf27a1f2a75f37 /image/bin/false
ee5f43940b667026f2152ccde76f8d09cb99eb8adbea29be782876d236ce3797 /image/bin/fmt
5b4b347107c9eea9e984652ab9ebb8ed95a349a717fedc3e523195b69d7383ae /image/bin/fold
1b49cc4b6f706c6da74831223c57251298c494b09ebf0e513df9b6536cfa84ab /image/bin/head
c2af52d735a708ad30b7d493c19e2ef8a059bfc617af26a1e877077c7a25bf58 /image/bin/id
3e9b0e09d1da2ce9f6a2d0f212f6211e9ff53767a60f5fac040488da97da43b7 /image/bin/join
3aa7096a22e4056c7ae5329e71965a6e1f5eeb10c471cffd4b86f9de91684588 /image/bin/kill
f6d99b9010578b4e3112c70131083c27bfcf731862b021df2995fd5738c52b99 /image/bin/link
ae6e4cdad0a792a72674c487f3874f356a49a25d0d11ea0f9b2abdb466494a50 /image/bin/ln
576ddcdde28a5d21b953976134f4b89dc0380e5ccfd8c9c489faf44db6d0506f /image/bin/logname
cc82a9771ebfc62a744b3b5f8b05d7fe86944ff0e02d1a20ac959421238e19e4 /image/bin/mkfifo
20d933c6787e1edfe47c30601e713fd9e6199852c55bb7af608722516aaaf699 /image/bin/mkdir
e173f74b72fcfc6b17ae0653a5a88fc36f6ce42bf99e70de4245701bf2a45a50 /image/bin/mknod
f98ea6c094c9fda45204d228a58bc52ceba02a8bf6e778e855d434387a43e1cb /image/bin/nl
e49bba1ea6a61fb90f754e8de4692ed0810e7c68429f0b22fbf37670607a7807 /image/bin/od
9ed0744237c4025a83ee4cc1d4fdf1135e6435899284c6e070b1ceb9b74e0203 /image/bin/paste
8b03fcd11aba79282d571d1f8ac3ce8839051e3c059e1895cb05cf660901102b /image/bin/pathchk
fda53239b3172ffdcd7989a79dcde19ed27c393c4cc82ba85315ed1a872d2654 /image/bin/printf
293e7a730d7f746731deb9614b3afab805a097f9acf917d53e44acc3acd9cb4b /image/bin/ptx
fa7ff4f943ca592c623e41a303e697114a420c0a3e5d91c779dfd57ab39b7053 /image/bin/pwd
3550aefb0eee8a35b4aa46ac31322687e478cb0f03c833e6924e462963e2b0f5 /image/bin/readlink
1543d06fdbe7fe2a28d6f2aa0a4d8ef69d4c06f6fe8ba605933fed51eda8c7fa /image/bin/rmdir
291f7fdd7d43fc55da4a50d7c7ba9945568b31602e74fbb3ab94a8b25a039595 /image/bin/seq
4b7609bd5da6de314b418be80f1be1a525bb4756efb1e9925f0ae7814c6eedef /image/bin/sleep
c40dac27f90c5f793a1ed37e78bd1015e44688dc2179da209b1065d02ed0c6e3 /image/bin/sort
5087a0f86f238062a85f2f6ca3e6b33ba6b3c8dd9700e314c1ae3b2af3331409 /image/bin/split
533d8a75e4460e37714c50eed989a643dffe08e3ab4f7400b966f2241e28a60f /image/bin/sync
35f681f7cc31a895f5c5e0db8b6a3c203b2ed9ce1771503f198614302e42c600 /image/bin/sum
7272d4fb3313ad3e19c79393d8785d4b343a915e605332eebbc8f5ac5338e071 /image/bin/tail
c2c6fae2cad8e29a75ff3f793ca7d059cc50ea4ee7d55f659e8f2d371f7763d6 /image/bin/tee
643d2912f2055e70284ab036d6d154e4667120726486c3a3329fdb5115b452f2 /image/bin/tr
75d4e74c03ad027b1b7738e6049ec5c01cfdd7a665ec82e0ecdf921d440e71a0 /image/bin/tsort
c7d92d8291578de76afa58f1a1160f3373b5935b6b6f1dca63bd0d3d210ea161 /image/bin/uname
0a51c8f6dc3ea15fd439e11a14d7c13d7094457e17129e7f5de51d886ed8f54e /image/bin/unexpand
abda7abe33205cda90734216bd3f2cc1dcf859db166d2d6297665a4d178e6bac /image/bin/unlink
f033207cf5de1eac8f4726b1926a33759b294050090932a6f7de6a6d98a8f9e8 /image/bin/wc
46f35124f00bcee7ec557406228da3abd04239be7b0ef0c10403139f1e0f0dd7 /image/bin/whoami
b8942c4ecd012efd53b74a8c5fec424020a7099356c4db017115499016237876 /image/bin/test
8bc7be81630efacca243feb8ecdaa97bc1d0b5a4060e0decf96af49875a06b00 /image/bin/true
84109c279ed6445c896fe04a397bf66e1f73f74200f8e58477e828aad7e43c92 /image/bin/yes
6c2c4baa6e75c00896b01ceb4e2f0ef62b59a7f27184ac1c5bf85f6da2983ae5 /image/bin/install
0f5fe59d628457041d4cb66ba6dfa27dd25c959aa65298db914c2524c9927d52 /image/bin/ls
3f43cf65e4ea8b713096607ce7b28c835dacaa0d18bb27fd664156b43b02639a /image/bin/md5sum
7fbafb8ac8aded995076404ea8c35392c3287a4ae92f7683baf445e321ba1a0c /image/bin/mv
5bb0d9ac5acc086b1bbcbd9c2f77f124efcc93e5802194a6aabce05c368b86c4 /image/bin/rm
c086a3b03be0da5fb7ffc5d3d666b9b8a340bc74c9d7c208123c55887c371147 /image/bin/sha1sum
fafa676fe85f662f753bb5257ba6575086c6d4d7b8b27a952624db08e136b1ac /usr/bin/basename
8b4e2b1ea346298b6534894e85cfa3ac4ee9bd1900da1d044a45c366d143dbf0 /usr/bin/cat
24b11f735c4dcbd28e0defcef6208f419ebb3a7f33a5f7addb41d7df9e021bc1 /usr/bin/chmod
8dd096b3a2973c4e3652e6bfffc30d2d85e8cb9b7f6cbbb2079cdb00a465589f /usr/bin/cksum
6e9c29ae39dc9cc13925fe4066ab1867d0623bc704b2b1be6e242dc27b6c8ea1 /usr/bin/cp
220ee0e1e19ad52403794872fd879619c25e2bf6b22d9616799250f76f8b9960 /usr/bin/csplit
15eea66971190c390da91bd8537c01b689e1cf24cc96cd256607ef437f07f41d /usr/bin/cut
567d079e9c0122410284414c0f2db2248e78686b403dabd9c7abd12c20ad9f89 /usr/bin/dd
c033f4ae4ca47c1ae267d9f983c35366f5bf803b53422a073fbdd60dd3c745a8 /usr/bin/dirname
0884b23703671535b882cffe99720d18f0f915b9323184dc20c0b7ef1af9ec4b /usr/bin/echo
4bb7dca4382da61d02331c6785f254e04789e9a26e034fd4bbc40b969bdc81a5 /usr/bin/env
76932efb69bc33a101a0a72424fc9dd50036b5f3fa09101d2d776a2e8aad7f3d /usr/bin/expand
aea616aaf5c8c63f564a77d4469cbc49088531920dc927db24c70e8c5872c97b /usr/bin/expr
6e082caf5494d14d8e8eb0c8284942389198ac0fff8646c08b3136039a8a1579 /usr/bin/factor
94132ca47c73ec70cc5f817a7d4c3de8ec37f7664564028c6daf27a1f2a75f37 /usr/bin/false
ee5f43940b667026f2152ccde76f8d09cb99eb8adbea29be782876d236ce3797 /usr/bin/fmt
5b4b347107c9eea9e984652ab9ebb8ed95a349a717fedc3e523195b69d7383ae /usr/bin/fold