├── src ├── old-root │ └── .placeholder ├── etc │ ├── init.d │ │ ├── sshd │ │ ├── cirros-status │ │ ├── cirros-check-version │ │ ├── cirros-ds-net │ │ ├── cirros-ds-local │ │ ├── cirros-userdata │ │ ├── logo │ │ ├── cirros-apply-net │ │ ├── cirros-apply-local │ │ ├── acpid │ │ ├── load-modules │ │ ├── resizefs │ │ └── rc.sysinit │ ├── cirros │ │ └── version │ ├── rc3.d │ │ ├── S21-acpid │ │ ├── S60-nfs │ │ ├── S99-logo │ │ ├── S01-logging │ │ ├── S20-urandom │ │ ├── S40-network │ │ ├── S50-dropbear │ │ ├── S50-rpcbind │ │ ├── S55-resizefs │ │ ├── S10-load-modules │ │ ├── S35-cirros-ds-local │ │ ├── S45-cirros-net-ds │ │ ├── S95-cirros-userdata │ │ ├── S98-cirros-status │ │ ├── S46-cirros-apply-net │ │ ├── S36-cirros-apply-local │ │ └── S47-cirros-check-version │ ├── acpi │ │ └── PWRF │ │ │ └── 00000080 │ ├── issue │ ├── cirros-init │ │ ├── config │ │ ├── ds-ec2 │ │ ├── ds-nocloud │ │ └── ds-configdrive │ ├── sudoers.d │ │ └── 90-cirros-user │ ├── default │ │ └── resizefs │ ├── ssl │ │ └── certs │ │ │ └── ca-certificates.crt │ ├── network │ │ └── interfaces │ ├── modules │ ├── group │ ├── profile │ ├── shadow │ ├── fstab │ ├── passwd │ └── inittab ├── usr │ ├── bin │ │ ├── pkill │ │ ├── ssh-import-id │ │ ├── ssh-add-key │ │ ├── parse-interfaces │ │ ├── ec2metadata │ │ └── json2fstree │ ├── lib │ │ └── cloud-init │ │ │ └── uncloud-init │ └── share │ │ ├── cirros │ │ └── logo │ │ ├── udhcpc │ │ └── default.script │ │ └── cloud │ │ └── functions ├── home │ └── cirros │ │ ├── .profile │ │ └── .shrc ├── sbin │ ├── stop │ ├── resize-filesystem │ ├── cirros-userdata │ ├── cirros-status │ ├── cirros-ds │ ├── cirros-apply │ └── growpart ├── bin │ ├── lxc-is-container │ ├── cirros-query │ ├── growroot │ └── cirros-per ├── boot │ └── grub │ │ └── menu.lst ├── init └── lib │ └── cirros │ ├── shlib_cirros │ ├── ds │ ├── ec2 │ ├── nocloud │ └── configdrive │ └── shlib ├── .bzrignore ├── patches-buildroot ├── series ├── README ├── dropbear-fix-path.patch └── nfs-utils-enable-nfsv4.patch ├── .gitmodules ├── doc ├── create-release.txt ├── misc.txt ├── lxc-cli.txt ├── RELEASE.txt ├── cirros-init.txt └── TESTING ├── TODO ├── bin ├── build-arch ├── mkcabundle ├── prepare-grub ├── build-initramfs ├── xmakedevs ├── mirror-dump-sstream-data ├── build-release ├── part2disk ├── depdetect └── bundle ├── fixup-fs ├── makedevs.list ├── ChangeLog ├── Makefile ├── README └── conf └── buildroot-arm.config /src/old-root/.placeholder: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/etc/init.d/sshd: -------------------------------------------------------------------------------- 1 | S50dropbear -------------------------------------------------------------------------------- /src/etc/cirros/version: -------------------------------------------------------------------------------- 1 | 0.3.2~pre1 2 | -------------------------------------------------------------------------------- /src/etc/rc3.d/S21-acpid: -------------------------------------------------------------------------------- 1 | ../init.d/acpid -------------------------------------------------------------------------------- /src/etc/rc3.d/S60-nfs: -------------------------------------------------------------------------------- 1 | ../init.d/S60nfs -------------------------------------------------------------------------------- /src/etc/rc3.d/S99-logo: -------------------------------------------------------------------------------- 1 | ../init.d/logo -------------------------------------------------------------------------------- /.bzrignore: -------------------------------------------------------------------------------- 1 | src/var/lib/cloud/config.local.sh 2 | -------------------------------------------------------------------------------- /src/etc/rc3.d/S01-logging: -------------------------------------------------------------------------------- 1 | ../init.d/S01logging -------------------------------------------------------------------------------- /src/etc/rc3.d/S20-urandom: -------------------------------------------------------------------------------- 1 | ../init.d/S20urandom -------------------------------------------------------------------------------- /src/etc/rc3.d/S40-network: -------------------------------------------------------------------------------- 1 | ../init.d/S40network -------------------------------------------------------------------------------- /src/etc/rc3.d/S50-dropbear: -------------------------------------------------------------------------------- 1 | ../init.d/S50dropbear -------------------------------------------------------------------------------- /src/etc/rc3.d/S50-rpcbind: -------------------------------------------------------------------------------- 1 | ../init.d/S50rpcbind -------------------------------------------------------------------------------- /src/etc/rc3.d/S55-resizefs: -------------------------------------------------------------------------------- 1 | ../init.d/resizefs -------------------------------------------------------------------------------- /src/etc/rc3.d/S10-load-modules: -------------------------------------------------------------------------------- 1 | ../init.d/load-modules -------------------------------------------------------------------------------- /src/etc/rc3.d/S35-cirros-ds-local: -------------------------------------------------------------------------------- 1 | ../init.d/cirros-ds-local -------------------------------------------------------------------------------- /src/etc/rc3.d/S45-cirros-net-ds: -------------------------------------------------------------------------------- 1 | ../init.d/cirros-ds-net -------------------------------------------------------------------------------- /src/etc/rc3.d/S95-cirros-userdata: -------------------------------------------------------------------------------- 1 | ../init.d/cirros-userdata -------------------------------------------------------------------------------- /src/etc/rc3.d/S98-cirros-status: -------------------------------------------------------------------------------- 1 | ../init.d/cirros-status -------------------------------------------------------------------------------- /src/usr/bin/pkill: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | exec killall "$@" 4 | -------------------------------------------------------------------------------- /src/etc/rc3.d/S46-cirros-apply-net: -------------------------------------------------------------------------------- 1 | ../init.d/cirros-apply-net -------------------------------------------------------------------------------- /src/etc/rc3.d/S36-cirros-apply-local: -------------------------------------------------------------------------------- 1 | ../init.d/cirros-apply-local -------------------------------------------------------------------------------- /src/etc/rc3.d/S47-cirros-check-version: -------------------------------------------------------------------------------- 1 | ../init.d/cirros-check-version -------------------------------------------------------------------------------- /src/etc/acpi/PWRF/00000080: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | exec /sbin/poweroff 4 | -------------------------------------------------------------------------------- /src/home/cirros/.profile: -------------------------------------------------------------------------------- 1 | [ -d "$HOME/bin" ] && PATH=$HOME/bin:$PATH 2 | -------------------------------------------------------------------------------- /src/usr/lib/cloud-init/uncloud-init: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | exec /sbin/init "$@" 3 | -------------------------------------------------------------------------------- /patches-buildroot/series: -------------------------------------------------------------------------------- 1 | nfs-utils-enable-nfsv4.patch 2 | dropbear-fix-path.patch 3 | -------------------------------------------------------------------------------- /src/etc/issue: -------------------------------------------------------------------------------- 1 | login as 'cirros' user. default password: 'cubswin:)'. use 'sudo' for root. 2 | -------------------------------------------------------------------------------- /src/home/cirros/.shrc: -------------------------------------------------------------------------------- 1 | # this file is read on all shells as 'ENV' is set in /etc/profile 2 | -------------------------------------------------------------------------------- /src/etc/cirros-init/config: -------------------------------------------------------------------------------- 1 | # must set DATASOURCE_LIST 2 | DATASOURCE_LIST="nocloud configdrive ec2" 3 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "buildroot"] 2 | path = buildroot 3 | url = git://git.buildroot.net/buildroot 4 | -------------------------------------------------------------------------------- /src/etc/cirros-init/ds-ec2: -------------------------------------------------------------------------------- 1 | MAX_TRIES=20 2 | SLEEP_TIME=2 3 | BURL="http://169.254.169.254/2009-04-04" 4 | -------------------------------------------------------------------------------- /src/etc/sudoers.d/90-cirros-user: -------------------------------------------------------------------------------- 1 | # cirros user needs passwordless sudo 2 | cirros ALL=(ALL) NOPASSWD:ALL 3 | -------------------------------------------------------------------------------- /src/etc/default/resizefs: -------------------------------------------------------------------------------- 1 | # RESIZE_MODE can be one of 'disabled', 'foreground' or 'background' 2 | RESIZE_MODE='disabled' 3 | -------------------------------------------------------------------------------- /src/etc/ssl/certs/ca-certificates.crt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/csabahenk/cirros/HEAD/src/etc/ssl/certs/ca-certificates.crt -------------------------------------------------------------------------------- /src/etc/network/interfaces: -------------------------------------------------------------------------------- 1 | # Configure Loopback 2 | auto lo 3 | iface lo inet loopback 4 | 5 | auto eth0 6 | iface eth0 inet dhcp 7 | -------------------------------------------------------------------------------- /src/sbin/stop: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # ubuntu compat thingy 4 | 5 | if ! killall -q "$1"; then 6 | echo stop: Unknown instance: >&2 7 | exit 1 8 | fi 9 | -------------------------------------------------------------------------------- /src/usr/share/cirros/logo: -------------------------------------------------------------------------------- 1 | ____ ____ ____ 2 | / __/ __ ____ ____ / __ \/ __/ 3 | / /__ / // __// __// /_/ /\ \ 4 | \___//_//_/ /_/ \____/___/ 5 | http://cirros-cloud.net 6 | -------------------------------------------------------------------------------- /src/etc/init.d/cirros-status: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | case "$1" in 3 | start) 4 | cirros-status;; 5 | stop) :;; 6 | *) echo "unknown argument ${1}" 1>&2;; 7 | esac 8 | 9 | # vi: ts=4 noexpandtab 10 | -------------------------------------------------------------------------------- /src/bin/lxc-is-container: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # This program is written/overwritten /etc/rc.d/rc.sysinit. 3 | # It simply reports whether or not this system is in an lxc container 4 | # This is NOT an LXC container" 5 | exit 1 6 | -------------------------------------------------------------------------------- /src/etc/cirros-init/ds-nocloud: -------------------------------------------------------------------------------- 1 | # SEED_PRE_D, SEED_POST_D consider these directories 2 | # to have nocloud data before and after block devices 3 | SEED_PRE_D="/var/lib/cloud/seed/nocloud-pre" 4 | SEED_POST_D="/var/lib/cloud/seed/nocloud" 5 | -------------------------------------------------------------------------------- /src/etc/cirros-init/ds-configdrive: -------------------------------------------------------------------------------- 1 | # SEED_PRE_D, SEED_POST_D consider these directories 2 | # to have configdrive data before and after block devices 3 | SEED_PRE_D="/var/lib/cloud/seed/configdrive-pre" 4 | SEED_POST_D="/var/lib/cloud/seed/configdrive" 5 | -------------------------------------------------------------------------------- /src/etc/init.d/cirros-check-version: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | case "$1" in 4 | start) 5 | cirros-per instance check-version cirros_version_available 0 || :;; 6 | stop) :;; 7 | *) echo "unknown argument ${1}" 1>&2;; 8 | esac 9 | 10 | # vi: ts=4 noexpandtab 11 | -------------------------------------------------------------------------------- /src/etc/modules: -------------------------------------------------------------------------------- 1 | # modules here are loaded one per line 2 | acpiphp 3 | #e1000 4 | #ne2k-pci 5 | #8139cp 6 | #pcnet32 7 | ip_tables 8 | #isofs 9 | #vfat 10 | nls_cp437 11 | nls_iso8859-1 12 | nfs 13 | nfsv2 14 | nfsv3 15 | nfsv4 16 | nfsd 17 | cifs 18 | md4 19 | -------------------------------------------------------------------------------- /src/etc/init.d/cirros-ds-net: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | case "$1" in 4 | start) 5 | mode=$(cirros-query dsmode >/dev/null 2>&1) && exit 0 6 | cirros-ds net || :;; 7 | stop) :;; 8 | *) echo "unknown argument ${1}" 1>&2;; 9 | esac 10 | 11 | # vi: ts=4 noexpandtab 12 | -------------------------------------------------------------------------------- /src/etc/init.d/cirros-ds-local: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | case "$1" in 4 | start) 5 | mode=$(cirros-query dsmode >/dev/null 2>&1) && exit 0 6 | cirros-ds local || :;; 7 | stop) :;; 8 | *) echo "unknown argument ${1}" 1>&2;; 9 | esac 10 | 11 | # vi: ts=4 noexpandtab 12 | -------------------------------------------------------------------------------- /src/etc/init.d/cirros-userdata: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | case "$1" in 3 | start) 4 | cirros-query datasource >/dev/null 2>&1 || exit 0 5 | cirros-per instance userdata cirros-userdata;; 6 | stop) :;; 7 | *) echo "unknown argument ${1}" 1>&2;; 8 | esac 9 | 10 | # vi: ts=4 noexpandtab 11 | -------------------------------------------------------------------------------- /src/etc/init.d/logo: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # vi: ts=4 noexpandtab 3 | # load modules 4 | 5 | LOGO=/usr/share/cirros/logo 6 | 7 | case "$1" in 8 | start) 9 | [ ! -f "$LOGO" ] || cat "$LOGO" 10 | ;; 11 | stop|restart|reload) : ;; 12 | *) 13 | echo $"Usage: $0 {start}" 14 | exit 1 15 | esac 16 | 17 | exit $? 18 | -------------------------------------------------------------------------------- /src/etc/group: -------------------------------------------------------------------------------- 1 | root:x:0: 2 | daemon:x:1: 3 | bin:x:2: 4 | sys:x:3: 5 | adm:x:4: 6 | tty:x:5: 7 | disk:x:6: 8 | wheel:x:10:root 9 | audio:x:29: 10 | utmp:x:43: 11 | staff:x:50: 12 | haldaemon:x:68: 13 | dbus:x:81: 14 | netdev:x:82: 15 | ftp:x:83: 16 | nobody:x:99: 17 | nogroup:x:99: 18 | users:x:100: 19 | cirros:x:1000: 20 | -------------------------------------------------------------------------------- /src/etc/init.d/cirros-apply-net: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | case "$1" in 4 | start) 5 | mode=$(cirros-query dsmode 2>/dev/null) || exit 0 6 | [ "$mode" = "net" ] || exit 0 7 | cirros-per instance cirros-apply-net cirros-apply net;; 8 | stop) :;; 9 | *) echo "unknown argument ${1}" 1>&2;; 10 | esac 11 | 12 | # vi: ts=4 noexpandtab 13 | -------------------------------------------------------------------------------- /patches-buildroot/README: -------------------------------------------------------------------------------- 1 | This directory contains patches to be applied to buildroot. 2 | They're in quilt style format, but nothing automated will apply 3 | them. After downloading and extracting buildroot, linking it 4 | to ./buildroot , you will need to run: 5 | ( cd buildroot && QUILT_PATCHES=$PWD/../patches-buildroot quilt push -a ) 6 | 7 | -------------------------------------------------------------------------------- /src/etc/init.d/cirros-apply-local: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | case "$1" in 4 | start) 5 | mode=$(cirros-query dsmode 2>/dev/null) || exit 0 6 | [ "$mode" = "local" ] || exit 0 7 | cirros-per instance cirros-apply-local cirros-apply local;; 8 | stop) :;; 9 | *) echo "unknown argument ${1}" 1>&2;; 10 | esac 11 | 12 | # vi: ts=4 noexpandtab 13 | -------------------------------------------------------------------------------- /src/boot/grub/menu.lst: -------------------------------------------------------------------------------- 1 | default 0 2 | timeout 0 3 | hiddenmenu 4 | 5 | title Linux Kernel 6 | # Note, the root entry will be hd0,0 in disk image, but hd0 in partition 7 | # it is changed on disk image creation. 8 | root (hd0) 9 | # FS_LABEL 10 | kernel /vmlinuz LABEL=cirros-rootfs ro console=tty1 console=ttyS0 11 | initrd /initrd.img 12 | EOF 13 | -------------------------------------------------------------------------------- /src/etc/init.d/acpid: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # acpid 3 | 4 | case "$1" in 5 | start) 6 | echo -n "Starting acpid: " 7 | start-stop-daemon -S -q -p /var/run/acpid.pid --exec /sbin/acpid 8 | echo "OK" 9 | ;; 10 | stop|restart|reload) 11 | echo -n "Stopping acpid: " 12 | start-stop-daemon -K -q -p /var/run/acpid.pid 13 | echo "OK" 14 | ;; 15 | *) 16 | echo $"Usage: $0 {start}" 17 | exit 1 18 | esac 19 | 20 | exit $? 21 | 22 | # vi: ts=4 noexpandtab 23 | -------------------------------------------------------------------------------- /src/etc/profile: -------------------------------------------------------------------------------- 1 | # vi: ts=4 noexpandtab syntax=sh 2 | 3 | export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 4 | umask 022 5 | ENV=$HOME/.shrc; export ENV 6 | 7 | # If running interactively, then: 8 | if [ "$PS1" ]; then 9 | if [ "`id -u`" -eq 0 ]; then 10 | export PS1='# ' 11 | else 12 | export PS1='$ ' 13 | fi 14 | export USER=`id -un` 15 | export LOGNAME=$USER 16 | export HOSTNAME=`/bin/hostname` 17 | export EDITOR='/bin/vi' 18 | fi; 19 | -------------------------------------------------------------------------------- /src/etc/shadow: -------------------------------------------------------------------------------- 1 | root:!$1$LJwQnqlv$DK6oKqcTq9Rf2ClC.kMa3/:10933:0:99999:7::: 2 | bin:*:10933:0:99999:7::: 3 | daemon:*:10933:0:99999:7::: 4 | adm:*:10933:0:99999:7::: 5 | lp:*:10933:0:99999:7::: 6 | sync:*:10933:0:99999:7::: 7 | shutdown:*:10933:0:99999:7::: 8 | halt:*:10933:0:99999:7::: 9 | uucp:*:10933:0:99999:7::: 10 | operator:*:10933:0:99999:7::: 11 | ftp:*:10933:0:99999:7::: 12 | nobody:*:10933:0:99999:7::: 13 | cirros:$1$LJwQnqlv$DK6oKqcTq9Rf2ClC.kMa3/:10933:0:99999:7::: 14 | -------------------------------------------------------------------------------- /src/etc/init.d/load-modules: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # vi: ts=4 noexpandtab 3 | # load modules 4 | 5 | case "$1" in 6 | start) 7 | lxc-is-container && exit 0 8 | if [ -f /etc/modules ]; then 9 | [ -d "/lib/modules/$(uname -r)" ] || exit 0 10 | while read line; do 11 | line="${line%%#*}" 12 | [ -n "$line" ] || continue 13 | modprobe $line 14 | done < /etc/modules 15 | fi 16 | ;; 17 | stop|restart|reload) : ;; 18 | *) 19 | echo $"Usage: $0 {start}" 20 | exit 1 21 | esac 22 | 23 | exit $? 24 | -------------------------------------------------------------------------------- /src/etc/fstab: -------------------------------------------------------------------------------- 1 | # /etc/fstab: static file system information. 2 | # 3 | # 4 | /dev/root / auto rw,noauto 0 1 5 | proc /proc proc defaults 0 0 6 | devpts /dev/pts devpts defaults,gid=5,mode=620 0 0 7 | tmpfs /dev/shm tmpfs mode=0777 0 0 8 | sysfs /sys sysfs defaults 0 0 9 | tmpfs /run tmpfs rw,nosuid,relatime,size=200k,mode=755 0 0 10 | -------------------------------------------------------------------------------- /doc/create-release.txt: -------------------------------------------------------------------------------- 1 | # set version to build 2 | VER=0.3.2~pre2 3 | 4 | # get some build dependencies: 5 | sudo apt-get update 6 | sudo apt-get -qy install bison flex texinfo build-essential gettext ncurses-dev unzip bzr qemu-kvm cvs quilt 7 | 8 | bzr init-repo cirros 9 | cd cirros 10 | bzr branch lp:cirros trunk 11 | 12 | bzr branch -r $VER trunk cirros-$VER 13 | cd cirros-$VER 14 | 15 | ./bin/build-release $VER 2>&1 | tee build-$VER.log 16 | 17 | # then to sign things 18 | for x in "$out/release/"*; do 19 | [ "${x%.asc}" = "$x" ] || continue 20 | [ -e "$x.asc" ] && continue 21 | gpg --armor --sign --detach-sig "$x" 22 | done 23 | -------------------------------------------------------------------------------- /doc/misc.txt: -------------------------------------------------------------------------------- 1 | For many things, you can quickly iterate without root by doing something like: 2 | * setup: 3 | * uec_tgz="cirros-0.3.1~pre2-x86_64-uec.tar.gz" 4 | * tar -xvzf $uec_tgz 5 | * initrd=$(echo *-initrd) 6 | * cp $initrd $initrd.dist 7 | * frev=$(bzr revno) # set to whatever your last image was 8 | * Then changes things 9 | * cp $initrd.dist $initrd 10 | (cd ../cirros/src && bzr status --versioned --short -r $frev | 11 | awk '$2 ~ "^src/" {sub("^src/","",$2); print $2}' | cpio -H newc -o ) | 12 | gzip -c >> "$initrd" 13 | * kvm -kernel *-vmlinuz -initrd "$initrd" -append "console=ttyS0" -nographic 14 | -------------------------------------------------------------------------------- /src/etc/passwd: -------------------------------------------------------------------------------- 1 | root:x:0:0:root:/root:/bin/sh 2 | daemon:x:1:1:daemon:/usr/sbin:/bin/sh 3 | bin:x:2:2:bin:/bin:/bin/sh 4 | sys:x:3:3:sys:/dev:/bin/sh 5 | sync:x:4:100:sync:/bin:/bin/sync 6 | mail:x:8:8:mail:/var/spool/mail:/bin/sh 7 | proxy:x:13:13:proxy:/bin:/bin/sh 8 | www-data:x:33:33:www-data:/var/www:/bin/sh 9 | backup:x:34:34:backup:/var/backups:/bin/sh 10 | operator:x:37:37:Operator:/var:/bin/sh 11 | haldaemon:x:68:68:hald:/:/bin/sh 12 | dbus:x:81:81:dbus:/var/run/dbus:/bin/sh 13 | ftp:x:83:83:ftp:/home/ftp:/bin/sh 14 | nobody:x:99:99:nobody:/home:/bin/sh 15 | sshd:x:103:99:Operator:/var:/bin/sh 16 | cirros:x:1000:1000:non-root user:/home/cirros:/bin/sh 17 | -------------------------------------------------------------------------------- /patches-buildroot/dropbear-fix-path.patch: -------------------------------------------------------------------------------- 1 | diff --git a/package/dropbear/dropbear.mk b/package/dropbear/dropbear.mk 2 | index 3ef6c8d..91df23c 100644 3 | --- a/package/dropbear/dropbear.mk 4 | +++ b/package/dropbear/dropbear.mk 5 | @@ -22,7 +22,12 @@ define DROPBEAR_FIX_XAUTH 6 | $(SED) 's,^#define XAUTH_COMMAND.*/xauth,#define XAUTH_COMMAND "/usr/bin/xauth,g' $(@D)/options.h 7 | endef 8 | 9 | +define DROPBEAR_FIX_PATH 10 | + $(SED) 's,^#define DEFAULT_PATH .*,#define DEFAULT_PATH "/usr/bin:/bin:/usr/sbin:/sbin",' $(@D)/options.h 11 | +endef 12 | + 13 | DROPBEAR_POST_EXTRACT_HOOKS += DROPBEAR_FIX_XAUTH 14 | +DROPBEAR_POST_EXTRACT_HOOKS += DROPBEAR_FIX_PATH 15 | 16 | define DROPBEAR_ENABLE_REVERSE_DNS 17 | $(SED) 's:.*\(#define DO_HOST_LOOKUP\).*:\1:' $(@D)/options.h 18 | -------------------------------------------------------------------------------- /TODO: -------------------------------------------------------------------------------- 1 | - consider moving to yocto or micro-core linux 2 | - micro-core: 3 | - eglibc based, yet tiny size 4 | - packages made by others easily downloaded and used 5 | - no arm arch, and no public build system, so how would you build arm? 6 | - yocto: 7 | - eglibc based 8 | - could potentially use ubuntu debs or easily re-use binary packages 9 | - some sort of "build-release" 10 | - that would do all the release build cleanly 11 | - download files, build, create release output 12 | - get-deps with config 13 | - get-deps conf/foo.conf (default 'dev') 14 | get-deps conf/0.3.conf 15 | - downloads kernels and buildroot and checksums 16 | - automated testing on kvm and lxc 17 | - configdrive support (openstack) and support for reading data from ISO 18 | - add script for 'get-extra-modules' 19 | that would download modules from launchpad 20 | -------------------------------------------------------------------------------- /doc/lxc-cli.txt: -------------------------------------------------------------------------------- 1 | To run with lxc-cli do the following. 2 | 3 | $ lxcdir=/var/lib/lxc 4 | $ name="cirros" 5 | $ arch="amd64" 6 | $ tarball="cirros-0.3.0-$arch-lxc.tar.gz" 7 | $ dir="$lxcdir/$name" 8 | $ sudo mkdir -p "$dir" 9 | $ cat <'$dir/config'" 10 | lxc.network.type=veth 11 | lxc.network.link=virbr0 12 | lxc.network.flags=up 13 | lxc.utsname=$name 14 | lxc.tty = 4 15 | lxc.pts = 1024 16 | lxc.rootfs = $dir/rootfs 17 | lxc.mount = $dir/fstab 18 | lxc.arch = $arch 19 | EOF 20 | 21 | $ cat < '$dir/fstab'" 22 | proc $dir/rootfs/proc proc nodev,noexec,nosuid 0 0 23 | sysfs $dir/rootfs/sys sysfs defaults 0 0 24 | EOF 25 | 26 | $ sudo rm -Rf "$dir/rootfs" && sudo mkdir $dir/rootfs && \ 27 | ( cd $dir && sudo tar -Sxvzf - ) < $tarball 28 | 29 | $ echo "IS_NOCLOUD=1" | sudo tee "$dir/rootfs/var/lib/cloud/config.local.sh" 30 | $ lxc -n "$name" start 31 | -------------------------------------------------------------------------------- /doc/RELEASE.txt: -------------------------------------------------------------------------------- 1 | For a release, the following files should be made available: 2 | - cirros-VERSION-source.tar.gz 3 | source tarball. 4 | - cirros-VERSION-ARCH-uec.tar.gz 5 | uec style tarball, compatible with uec-publish-tarball 6 | The blank.img is a mkfs'd disk image only, no contents. 7 | It will demonstrate initramfs copies itself to root 8 | cirros-VERSION-ARCH-vmlinuz 9 | cirros-VERSION-ARCH-initrd 10 | cirros-VERSION-ARCH-blank.img 11 | - cirros-VERSION-ARCH-disk.img 12 | full disk image, suitable for upload to openstack 13 | - cirros-VERSION-ARCH-rootfs.img.gz 14 | compressed partition image. 15 | Suitable for uploading to EC2 or other cloud given a loader 16 | such as pv-grub or kexec-loader at 17 | http://people.canonical.com/~smoser/lucid-loaders/ 18 | - filesys-lxc.tar.gz 19 | optimized for lxc tarball. This contains no kernel, ramdisk or modules 20 | -------------------------------------------------------------------------------- /src/usr/bin/ssh-import-id: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | burl="https://launchpad.net/~%s/+sshkeys" 4 | 5 | Usage() { 6 | cat <&2; exit 1; } 12 | [ "$1" = "-h" -o "$1" == "--help" ] && { Usage; exit 0; } 13 | cd 14 | umask 066 15 | fail() { echo "$@" 1>&2; exit 1; } 16 | mkdir -m 755 -p .ssh || { fail "failed to make .ssh dir" 1>&2; exit 1; } 17 | 18 | for u in "$@"; do 19 | url=$(printf "$burl" "$u") && 20 | out=$(curl --silent - "$url") || 21 | fail "failed to get key for $u [$url]" 1>&2 22 | # some keys come back with dos line end 23 | out=$(echo "$out" | sed -e '/^$/d' -e '/^\r/d' \ 24 | -e ':join /=[ ]/!{ N; s/[\n\r]//g ; b join }' \ 25 | -e 's/[^a-zA-Z0-9@: .\/=+-]//g') 26 | printf "%s\n" "$out" >> ".ssh/authorized_keys" || 27 | fail "failed to write to .ssh/authorized_keys" 28 | echo "Successfully authorized [$u]" 29 | done 30 | 31 | # vi: ts=4 noexpandtab 32 | -------------------------------------------------------------------------------- /src/etc/init.d/resizefs: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # vi: ts=4 noexpandtab 3 | 4 | RESIZE_MODE="disabled" 5 | if [ -f /etc/default/resizefs ]; then 6 | . /etc/default/resizefs 7 | fi 8 | 9 | case "$1" in 10 | start) 11 | lxc-is-container && exit 0 12 | [ -e /dev/root ] || exit 0 13 | # here we have to use start-stop-daemon or the resize 14 | # process gets killed when rc.sysinit ends (LP: #1261710) 15 | case "$RESIZE_MODE" in 16 | background) 17 | cirros-per once resize-rootfs -- \ 18 | start-stop-daemon --start --background \ 19 | --exec=/sbin/resize-filesystem -- \ 20 | /dev/root /run/resize.rootfs /dev/console 21 | ;; 22 | foreground) 23 | cirros-per once resize-rootfs -- \ 24 | /sbin/resize-filesystem -- \ 25 | /dev/root /run/resize.rootfs /dev/console 26 | ;; 27 | disabled) : ;; 28 | *) 29 | echo "resizefs: unknown RESIZE_MODE='$RESIZE_MODE'." \ 30 | "Doing nothing." 1>&2 31 | ;; 32 | esac 33 | ;; 34 | stop|restart|reload) : ;; 35 | *) 36 | echo $"Usage: $0 {start}" 37 | exit 1 38 | ;; 39 | esac 40 | 41 | exit $? 42 | -------------------------------------------------------------------------------- /bin/build-arch: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | Usage() { 4 | cat <&2; } 13 | fail() { [ $# -eq 0 ] || error "$@"; exit 1; } 14 | 15 | [ $# -eq 3 -o $# -eq 4 ] || 16 | { Usage 1>&2; exit 1; } 17 | [ "$1" = "-h" -o "$1" = "--help" ] && { Usage; exit 0; } 18 | 19 | 20 | bdir=${1} 21 | arch=${2} 22 | out=${3} 23 | shift 3 24 | confd="" 25 | [ $# -eq 0 ] && set -- make 26 | 27 | [ -n "$confd" ] || confd=$( cd "${0%/*}/../conf" && pwd) || 28 | fail "failed to find conf dir" 29 | 30 | mkdir -p "$out" || fail "failed to make outdir $out" 31 | out=$(cd "${out}" && pwd) 32 | [ -e "$confd/.config" ] || 33 | cp "$confd/buildroot-$arch.config" "$confd/.config" || 34 | fail "failed to copy buildroot config" 35 | [ -e "$confd/busybox.config" ] || 36 | cp "$confd/busybox.config" "$out/busybox.config" || 37 | fail "failed to copy busybox config" 38 | 39 | cd "$bdir" 40 | make "O=$BR_OUT" "BUSYBOX_CONFIG_FILE=$out/busybox.config" "$@" 41 | -------------------------------------------------------------------------------- /src/etc/inittab: -------------------------------------------------------------------------------- 1 | # /etc/inittab 2 | # 3 | # Copyright (C) 2001 Erik Andersen 4 | # 5 | # Note: BusyBox init doesn't support runlevels. The runlevels field is 6 | # completely ignored by BusyBox init. If you want runlevels, use 7 | # sysvinit. 8 | # 9 | # Format for each entry: ::: 10 | # 11 | # id == tty to run on, or empty for /dev/console 12 | # runlevels == ignored 13 | # action == one of sysinit, respawn, askfirst, wait, and once 14 | # process == program to run 15 | 16 | # Startup the system 17 | ::sysinit:/etc/init.d/rc.sysinit 18 | 19 | # Put a getty on the serial port 20 | #ttyS0::respawn:/sbin/getty -L 115200 ttyS0 vt100 # GENERIC_SERIAL 21 | #tty1::respawn:/sbin/getty 115200 tty1 22 | #hvc0::respawn:/sbin/getty 115200 hvc0 # xen virtual console 23 | #console::respawn:/sbin/getty 115200 console 24 | 25 | # Stuff to do for the 3-finger salute 26 | ::ctrlaltdel:/sbin/reboot 27 | 28 | # Stuff to do before rebooting 29 | null::shutdown:/usr/bin/killall klogd 30 | null::shutdown:/usr/bin/killall syslogd 31 | null::shutdown:/bin/umount -a -r 32 | null::shutdown:/sbin/swapoff -a 33 | 34 | -------------------------------------------------------------------------------- /src/sbin/resize-filesystem: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . ${CIRROS_LIB:=/lib/cirros/shlib_cirros} || 3 | { echo "failed to read ${CIRROS_LIB}" 1>&2; exit 1; } 4 | 5 | Usage() { 6 | cat <&2; exit 1; } 21 | [ "$1" = "-h" -o "$1" = "--help" ] && { Usage; exit 0; } 22 | 23 | if [ -n "$log" -o "$log" = "-" ]; then 24 | time_call resize2fs "$dev" >"$log" 2>&1 25 | else 26 | time_call resize2fs "$dev" 27 | fi 28 | ret=$? 29 | delta=$_RET_TIME 30 | [ $ret -eq 0 ] && 31 | summary="$dev resized successfully [took ${delta}s]" || 32 | summary="$dev resize failed ($ret) [took ${delta}s]" 33 | 34 | if [ "$log" = "-" ]; then 35 | echo "$summary" 36 | elif [ -n "$log" ]; then 37 | echo "$summary" >> "$log" 38 | fi 39 | if [ -n "$sumfile" ]; then 40 | [ "$sumfile" = "-" ] && echo "$summary" || echo "$summary" >> "$sumfile" 41 | fi 42 | 43 | exit $ret 44 | 45 | # vi: ts=4 noexpandtab 46 | -------------------------------------------------------------------------------- /fixup-fs: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | error() { echo "$@" 1>&2; } 3 | fail() { [ $# -eq 0 ] || error "$@"; exit 1; } 4 | 5 | rootd=${1} 6 | [ -n "${rootd}" -a -d "${rootd}" ] || exit 1 7 | 8 | rm -Rf "$rootd/home/default" 9 | 10 | # no need for visudo 11 | rm -f "$rootd/usr/sbin/visudo" 12 | 13 | # buildroot symlinks stuff in /var to /tmp 14 | links="lib/pcmcia pcmcia lock cache log spool pcmcia" 15 | for f in $links; do 16 | p="/var/$f" 17 | if [ -L "$rootd/$p" ]; then 18 | rm "$rootd/$p" || 19 | fail "failed to remove file $p" 20 | elif [ -d "$rootd/$p" ]; then 21 | rmdir "$rootd/$p" || 22 | fail "rmdir $p failed" 23 | else 24 | [ -e "$rootd/$p" ] && 25 | fail "don't know what to do with $p. not dir or link" 26 | fi 27 | done 28 | mkdir -p $rootd/var 29 | ( cd "$rootd/var" && mkdir -p $links ) || 30 | fail "failed to create directories in /var" 31 | 32 | ( cd "$rootd/var" && rm -Rf tmp run && 33 | ln -s ../run run && ln -s ../run/var.tmp tmp ) || 34 | fail "failed to make var/run and var/tmp" 35 | 36 | rm -f $rootd/etc/resolv.conf && 37 | ln -sf ../run/resolv.conf "$rootd/etc/resolv.conf" || 38 | fail "failed to create resolv.conf symlink" 39 | 40 | if [ -L "$rootd/sbin/blkid" -a -x "$rootd/usr/sbin/blkid" ]; then 41 | rm -f "$rootd/sbin/blkid" 42 | fi 43 | -------------------------------------------------------------------------------- /bin/mkcabundle: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl -w 2 | # 3 | # Used to regenerate ca-bundle.crt from the Mozilla certdata.txt. 4 | # Run as ./mkcabundle.pl > ca-bundle.crt 5 | # 6 | 7 | my $cvsroot = ':pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot'; 8 | my $certdata = 'mozilla/security/nss/lib/ckfw/builtins/certdata.txt'; 9 | 10 | open(IN, "cvs -d $cvsroot co -p $certdata|") 11 | || die "could not check out certdata.txt"; 12 | 13 | my $incert = 0; 14 | 15 | print<) { 24 | if (/^CKA_VALUE MULTILINE_OCTAL/) { 25 | $incert = 1; 26 | open(OUT, "|openssl x509 -text -inform DER -fingerprint") 27 | || die "could not pipe to openssl x509"; 28 | } elsif (/^END/ && $incert) { 29 | close(OUT); 30 | $incert = 0; 31 | print "\n\n"; 32 | } elsif ($incert) { 33 | my @bs = split(/\\/); 34 | foreach my $b (@bs) { 35 | chomp $b; 36 | printf(OUT "%c", oct($b)) unless $b eq ''; 37 | } 38 | } elsif (/^CVS_ID.*Revision: ([^ ]*).*/) { 39 | print "# Generated from certdata.txt RCS revision $1\n#\n"; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /makedevs.list: -------------------------------------------------------------------------------- 1 | # 2 | # chown arg, chmod arg, file list (shell expanded) 3 | /etc/init.d/cirros-* f 0755 0 0 - - - - - 4 | /etc/sudoers.d d 0755 0 0 - - - - - 5 | /etc/sudoers.d/* f 0440 0 0 - - - - - 6 | /usr/lib/cloud-init/uncloud-init f 0755 0 0 - - - - - 7 | /var/lib/cloud d 0755 0 0 - - - - - 8 | /etc/init.d/rc.sysinit f 0755 0 0 - - - - - 9 | /etc/shadow f 0600 0 0 - - - - - 10 | /init f 0755 0 0 - - - - - 11 | /dev/console c 0600 0 0 5 1 - - - 12 | /dev/tty1 c 0600 0 0 4 1 - - - 13 | /dev/tty2 c 0600 0 0 4 2 - - - 14 | /dev/null c 0666 0 0 1 3 - - - 15 | /dev/ttyS0 c 0664 0 0 4 64 - - - 16 | /dev/random c 0666 0 0 1 8 - - - 17 | /dev/urandom c 0666 0 0 1 9 - - - 18 | /home/cirros d 0755 1000 1000 - - - - - 19 | /home/cirros/.[a-z]* f 0755 1000 1000 - - - - - 20 | /root d 0700 0 0 - - - - - 21 | /tmp d 1777 0 0 - - - - - 22 | /run d 0755 0 0 - - - - - 23 | -------------------------------------------------------------------------------- /ChangeLog: -------------------------------------------------------------------------------- 1 | 0.3.2 2 | - Recognize failure when getting entries from ec2 metadata service, 3 | especially annoying on 'ec2metadata --public-keys' (LP: #1148165) 4 | - fix bug on ec2 metadata service if no public keys available. 5 | Problem was that 404 was not being recognized (LP: #1148165) 6 | - do not mount / as rw if already mounted rw. in lxc this generated 7 | additional and irrelevant noise on console. 8 | - fix 'is_lxc' to work correctly. 9 | - support 'seed' data from /var/lib/cloud/seed for nocloud and 10 | configdrive sources. 11 | - fix random and urandom device entries to be character rather 12 | than block devices. 13 | - if running in lxc (not libvirt-lxc), start getty on /dev/console 14 | - add usr/share/udhcpc/default.script which helps better control 15 | what happens on dhcp ifup. 16 | - support executing /etc/rc.local 17 | - set hostname from datasource (LP: #1132686) 18 | - fix bad entry for 'ftp' user in /etc/group (LP: #1222951) 19 | - support static routes provided in dhcp data (LP: #1190372) 20 | - support resizing root filesystem (LP: #1261710) but disable 21 | by default. resizing can be enabled via file injection. 22 | 0.3.1 23 | - move to buildroot 2012.05 (busybox 1.20.1) 24 | - build on Ubuntu 12.04 25 | - support https client via curl/openssl (LP: #918702) 26 | - support mounting of vfat filesystems (LP: #929841) 27 | - support acpi shutdown (LP: #944151) 28 | - ec2metadata: remove double '/' in --public-keys requests (LP: #992492) 29 | - upgrade kernel to Ubuntu 12.04 LTS kernel (3.2.0-25.40) 30 | -------------------------------------------------------------------------------- /bin/prepare-grub: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # vi: ts=4 noexpandtab 3 | 4 | # these urls are for saucy release version of grub -- sorry, no nice URL I know of! 5 | i386_url="http://launchpadlibrarian.net/97045042/grub_0.97-29ubuntu66_i386.deb" 6 | x86_64_url="http://launchpadlibrarian.net/97044932/grub_0.97-29ubuntu66_amd64.deb" 7 | TEMP_D="" 8 | 9 | Usage() { 10 | cat <&2; } 20 | fail() { [ $# -eq 0 ] || error "$@"; exit 1; } 21 | 22 | [ "$1" = "-h" -o "$1" = "--help" ] && { Usage; exit 0; } 23 | [ $# -eq 1 ] || { Usage 1>&2; error "must give out_d"; exit 1; } 24 | out_d_in=$1 25 | 26 | mkdir -p "$out_d_in" || fail "failed to make $out_d" 27 | out_d=$(cd "$out_d_in" && pwd) 28 | mkdir -p "$out_d/dl" 29 | 30 | case "$(uname -m)" in 31 | x86_64) url="${x86_64_url}";; 32 | i?86) url="${i386_url}";; 33 | esac 34 | 35 | TEMP_D=$(mktemp -d "${TMPDIR:-/tmp}/.${0##*/}.XXXXXX") || 36 | fail "failed to make tempd" 37 | trap cleanup EXIT 38 | 39 | deb="${out_d}/dl/${url##*/}" 40 | if [ ! -e "${deb}" ]; then 41 | wget "${url}" -O "${TEMP_D}/deb" && 42 | mv "${TEMP_D}/deb" "$deb" || fail "failed download of ${url}" 43 | fi 44 | 45 | cd "${TEMP_D}" 46 | dpkg -x "$deb" . && 47 | cp usr/sbin/grub "$out_d/grub" && 48 | mkdir -p boot/grub && 49 | cp usr/lib/grub/*/{stage1,stage2,e2fs_stage1_5} boot/grub && 50 | tar cf "${out_d}/bootgrub.tar" boot/ || 51 | fail "failed to create $out_d" 52 | exit 0 53 | -------------------------------------------------------------------------------- /doc/cirros-init.txt: -------------------------------------------------------------------------------- 1 | cirros-ds 2 | cirros-query 3 | cirros-apply 4 | cirros-per 5 | 6 | cirros-ds calls each of the datasources configured. They're expected 7 | to be in the path or in /lib/cirros/ds/. 8 | datasources are called with: 9 | mode: 'local' or 'net' 10 | out_d: directory to copy data to 11 | datasource should exit 0 on success. 12 | non-zero means failure. 13 | expect to populate out_d/result with '0' on success. 14 | exit of 0 without that means "no source found" 15 | 16 | cirros-query 17 | datasource: list the datasource 18 | available: list available fields for datasource 19 | get field: dump field 20 | 21 | cirros-apply 22 | take a mode of local or net 23 | for 'local' could do things like copy network interfaces 24 | basically this is something like cloud-init's boothooks 25 | 26 | cirros-per 27 | run a command at given frequency 28 | this handles checking if the command name has already been 29 | run and running if not. 30 | 31 | datasources: 32 | called in 1 of 4 modes: 33 | * local 34 | * apply-local 35 | * net 36 | * apply-net 37 | 38 | Each receives the second argument of a directory. 39 | 40 | for 'local' and 'net' this is the output directory that should be populated. 41 | The ds should created a data/ directory underneith this 42 | 43 | for 'apply' and 'apply-net' this is the directory previously provided to 44 | 'local' or 'net' respectively. 45 | 46 | jobs in /etc/init.d 47 | - S35 cirros-ds-local 48 | - S36 cirros-apply-local 49 | - S40 network 50 | - S45 cirros-net-ds 51 | - S46 cirros-apply-net 52 | - S95 cirros-userdata : run #! 53 | - S98 cirros-final : print status info 54 | - S99 cirros-logo : logo 55 | 56 | kernel cmdline: 57 | - dslist=nocloud,nocloud-net,configdrive,configdrive-net,ec2 58 | 59 | datasources: 60 | - nocloud 61 | - configdrive 62 | - ec2 63 | 64 | config: 65 | - /etc/cirros/ds.conf 66 | DATA_PATH=/run/cirros/ds 67 | SOURCES= 68 | -------------------------------------------------------------------------------- /doc/TESTING: -------------------------------------------------------------------------------- 1 | Before a release, the following tests should be done. 2 | 3 | Notes: 4 | * Until a way to disable ec2 metadata search exists, we have to fake a 5 | metadata server. 6 | 7 | - Prereqs for local boot EC2 Metadata test: 8 | - download 'mdserv' at https://gist.github.com/1278651 9 | - bring up interface for 169.254.169.254 10 | sudo ifconfig eth0:0 up 169.254.169.254 netmask 255.255.255.255 11 | - ./mdserv 169.254.169.254:80 12 | 13 | - qemu system boot 14 | - test boot to from partition 15 | qemu-system-$ARCH -kernel kernel -initrd initramfs -hda part.img -curses 16 | - test boot to blank partition 17 | qemu-system-$ARCH -kernel kernel -initrd initramfs -hda blank.img -curses 18 | - test boot to initramfs partition 19 | qemu-system-$ARCH -kernel kernel -initrd initramfs -hda part.img -append "root=noroot" -curses 20 | - test boot from full disk image (not arm yet) 21 | qemu-system-$ARCH -drive if=virtio,file=disk.img -curses 22 | 23 | - lxc system boot 24 | - download lxc-libvirt-run from http://smoser.brickies.net/git/?p=tildabin.git;a=blob;f=lxc-libvirt-root 25 | - sudo mkdir -p lxc/cirros-$ARCH 26 | - zcat initramfs | ( cd lxc/cirros-$ARCH && sudo cpio -uid ) 27 | - if [ "$ARCH" == "arm" ]; then 28 | sudo apt-get install -y 29 | sudo cp /usr/bin/qemu-arm-static $ARCH/usr/bin 30 | fi 31 | - ./lxc-libvirt-root lxc/cirros-$ARCH 32 | 33 | - Openstack boot 34 | - cloud-publish-tarball cirros-VERSION-ARCH-partimg.tar.gz 35 | - cloud-publish-image --type image disk.img 36 | 37 | - Ec2 boot 38 | - cloud-publish-tarball cirros-VERSION-ARCH-partimg.tar.gz 39 | # us-east-1 aki-805ea7e9 amazon pv-grub-hd0_1.02-i386.gz 40 | # us-east-1 aki-825ea7eb amazon pv-grub-hd0_1.02-x86_64.gz 41 | aki=aki-805ea7e9 42 | [ "$ARCH" = "x86_64" ] && aki=aki-825ea7eb 43 | cloud-publish-tarball cirros-$VERSION-$ARCH-partimg.tar.gz \ 44 | --kernel $aki --ramdisk none $USER-bucket $ARCH 45 | 46 | - TBD: EBS boot and register 47 | -------------------------------------------------------------------------------- /src/usr/share/udhcpc/default.script: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # udhcpc script edited by Tim Riker 4 | 5 | set -f 6 | 7 | [ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1 8 | 9 | RESOLV_CONF="/etc/resolv.conf" 10 | [ -n "$broadcast" ] && BROADCAST="broadcast $broadcast" 11 | [ -n "$subnet" ] && NETMASK="netmask $subnet" 12 | 13 | apply_static_routes() { 14 | # routes are pairs of network and gateway 15 | # 169.254.169.254/32 10.65.0.128 16 | local net="" router="" err=0 17 | while [ $# -ne 0 ]; do 18 | net="$1" 19 | router="$2" 20 | [ -n "$net" ] || continue 21 | echo "adding net $net with router $router" 1>&2 22 | route add -net "$net" gw "$router" || { 23 | echo "WARN: failed: route add -net \"$net\" gw \"$router\"" 1>&2; 24 | err=$(($err+1)); 25 | } 26 | shift 2 || { 27 | echo "apply_static_routes: failed shift 2. odd number of args?" 1>&2; 28 | return 1; 29 | } 30 | done 31 | return $err 32 | } 33 | 34 | case "$1" in 35 | deconfig) 36 | /sbin/ifconfig $interface 0.0.0.0 37 | ;; 38 | 39 | renew|bound) 40 | /sbin/ifconfig $interface $ip $BROADCAST $NETMASK 41 | 42 | if [ -n "$router" ] ; then 43 | echo "deleting routers" 44 | # cirros: this loop is cirros modification to remove a message 45 | # like the following going to the console: 46 | # route: SIOCDELRT: No such process 47 | while :; do 48 | out=$(route del default gw 0.0.0.0 dev $interface 2>&1) 49 | ret=$? 50 | [ $ret -eq 0 ] && break 51 | case "$out" in 52 | *SIOCDELRT*[Nn]o\ such\ process*) break;; 53 | esac 54 | echo "deleting routes failed: $out" 1>&2 55 | done 56 | # end cirros modification 57 | 58 | for i in $router ; do 59 | route add default gw $i dev $interface 60 | done 61 | fi 62 | 63 | echo -n > $RESOLV_CONF 64 | [ -n "$domain" ] && echo search $domain >> $RESOLV_CONF 65 | for i in $dns ; do 66 | echo adding dns $i 67 | echo nameserver $i >> $RESOLV_CONF 68 | done 69 | 70 | apply_static_routes $staticroutes 71 | ;; 72 | esac 73 | 74 | exit 0 75 | -------------------------------------------------------------------------------- /src/usr/bin/ssh-add-key: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | error() { echo "$@" 1>&2; } 4 | fail() { [ $# -eq 0 ] || error "$@"; exit 1; } 5 | 6 | Usage() { 7 | cat <&2; [ $# -eq 0 ] || error "$@"; exit 1; } 27 | 28 | short_opts="hpru" 29 | long_opts="help,prefix:,replace,user:" 30 | getopt_out=$(getopt --name "${0##*/}" \ 31 | --options "${short_opts}" --long "${long_opts}" -- "$@") && 32 | eval set -- "${getopt_out}" || 33 | bad_Usage 34 | 35 | user="" 36 | prefix="" 37 | key="" 38 | replace=false 39 | 40 | while [ $# -ne 0 ]; do 41 | cur=${1}; next=${2}; 42 | case "$cur" in 43 | -h|--help) Usage ; exit 0;; 44 | -p|--prefix) prefix="$next"; shift;; 45 | -r|--replace) replace=true;; 46 | --) shift; break;; 47 | esac 48 | shift; 49 | done 50 | 51 | [ $# -ge 1 ] || bad_Usage "must provide keys" 52 | 53 | cd ~/ || fail "failed to cd ~" 54 | mkdir -p -m 0755 .ssh || fail "failed to make .ssh" 55 | umask 066 56 | : >> .ssh/authorized_keys || 57 | fail "can't write to ~/.ssh/authorized_keys" 58 | 59 | if [ "$1" = "-" ]; then 60 | keys="" 61 | key="" 62 | # we check for success or non empty string. 63 | # on final line with no EOF, it returns 1, but sets key 64 | while read key || [ -n "$key" ]; do 65 | keys="${keys}|${key}" 66 | done 67 | keys=${keys#|}; 68 | oifs="$IFS" 69 | IFS="|" 70 | set -- $keys 71 | IFS="$oifs" 72 | fi 73 | 74 | if $replace; then 75 | for key in "$@"; do 76 | removekey ".ssh/authorized_keys" "$key" || fail "failed to remove: $key" 77 | done 78 | fi 79 | 80 | { 81 | for key in "$@"; do 82 | echo "${prefix:+${prefix} }$key" 83 | done 84 | } >> .ssh/authorized_keys 85 | chmod 600 .ssh/authorized_keys 86 | 87 | # vi: ts=4 noexpandtab 88 | -------------------------------------------------------------------------------- /src/bin/cirros-query: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | . ${CIRROS_LIB:=/lib/cirros/shlib_cirros} || 4 | { echo "failed to read ${CIRROS_LIB}" 1>&2; exit 1; } 5 | 6 | Usage() { 7 | cat </dev/null 2>&1 && exit 0 68 | i=$(($i+1)) 69 | sleep .2 70 | done 71 | [ $i -eq 50 ] && fail "unable to remount, that is bad" 72 | fi 73 | 74 | # write to /etc/grownroot-grown. most likely this wont work (readonly) 75 | { date --utc > "${rootmnt}/etc/growroot-grown" ; } >/dev/null 2>&1 || : 76 | 77 | # vi: ts=4 noexpandtab 78 | -------------------------------------------------------------------------------- /src/sbin/cirros-userdata: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | . ${CIRROS_LIB:=/lib/cirros/shlib_cirros} || 4 | { echo "failed to read ${CIRROS_LIB}" 1>&2; exit 1; } 5 | 6 | Usage() { 7 | cat < "$tempf" && chmod 700 "$cur" || { 65 | error "failed to copy $cur to make executable"; 66 | rm -f "$tempf"; 67 | return 1; 68 | } 69 | "$cur" 70 | ret=$? 71 | debug 2 "$cur returned $ret" 72 | else 73 | ret=0 74 | debug 1 "$cur was not '#!' or executable" 75 | fi 76 | [ $ret -eq 0 ] || failures=$(($failures+1)) 77 | done 78 | rm -f "$tempf" 79 | 80 | return $failures 81 | } 82 | 83 | cirros_userdata "$@" 84 | 85 | # vi: ts=4 noexpandtab 86 | -------------------------------------------------------------------------------- /src/sbin/cirros-status: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | . ${CIRROS_LIB:=/lib/cirros/shlib_cirros} || 4 | { echo "failed to read ${CIRROS_LIB}" 1>&2; exit 1; } 5 | 6 | Usage() { 7 | cat < "$TEMP_D/ip-addr-show" 53 | ipinfo < "$TEMP_D/ip-addr-show" 54 | IFS="|"; set -- $_RET; IFS="$oifs" 55 | for x in "$@"; do 56 | echo "if-info: $x" 57 | done 58 | ip route | sed 's,^,ip-route:,' 59 | 60 | if assert_datasource; then 61 | echo "=== datasource: $_DATASOURCE_NAME $_DATASOURCE_MODE ===" 62 | for x in instance-id name availability-zone local-hostname \ 63 | launch-index; do 64 | ds_get_item "$x" && val="$_RET" || val="N/A" 65 | echo "$x: ${val}" 66 | done 67 | else 68 | echo "=== datasource: None None ===" 69 | fi 70 | 71 | local cur="" avail="" msg="" 72 | cirros_version_available && avail="$_RET" 73 | cirros_version && cur="$_RET" 74 | msg="current=$cur" 75 | [ "$avail" != "0.0" ] && msg="$msg latest=$avail" 76 | 77 | read_uptime && [ -n "$_RET" ] && msg="$msg uptime=$_RET" 78 | echo "=== cirros: $msg ===" 79 | 80 | if ! check_ping_gateway; then 81 | echo "=== pinging gateway failed, debugging connection ===" 82 | debug_connection 83 | fi 84 | 85 | return 0 86 | } 87 | 88 | cirros_status "$@" 89 | 90 | # vi: ts=4 noexpandtab 91 | -------------------------------------------------------------------------------- /bin/build-initramfs: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # vi: ts=4 noexpandtab 3 | 4 | TEMP_D="" 5 | 6 | error() { echo "$@" 1>&2; } 7 | debug() { 8 | [ "${DEBUG}" -ge "${1}" ] || return 0; 9 | shift; 10 | error "$@" 11 | } 12 | fail() { [ $# -eq 0 ] || error "$@"; exit 1; } 13 | Usage() { 14 | cat < my.initramfs.img 20 | EOF 21 | } 22 | bad_Usage() { Usage 1>&2; fail "$@"; } 23 | cleanup() { 24 | [ -z "${TEMP_D}" -o ! -d "${TEMP_D}" ] || rm -Rf "${TEMP_D}" 25 | } 26 | 27 | short_opts="hv" 28 | long_opts="help,verbose" 29 | getopt_out=$(getopt --name "${0##*/}" \ 30 | --options "${short_opts}" --long "${long_opts}" -- "$@") && 31 | eval set -- "${getopt_out}" || 32 | bad_Usage 33 | 34 | while [ $# -ne 0 ]; do 35 | cur=${1}; next=${2}; 36 | case "$cur" in 37 | -h|--help) Usage; exit 0;; 38 | -v|--verbose) DEBUG=$((${DEBUG}+1));; 39 | --) shift; break;; 40 | esac 41 | shift; 42 | done 43 | 44 | [ $# -eq 2 ] || bad_Usage "must give initramfs_dir and root_dir" 45 | initramfs_d=${1} 46 | root_d=${2} 47 | 48 | [ -d "$initramfs_d" ] || fail "$initramfs_d is not a dir" 49 | [ -d "$root_d" ] || fail "$root_d is not a dir" 50 | 51 | TEMP_D=$(mktemp -d "${TMPDIR:-/tmp}/.${0##*/}.XXXXXX") || 52 | fail "failed to make tempd" 53 | trap cleanup EXIT 54 | 55 | work_d="${TEMP_D}/workd" 56 | src_d="$initramfs_d/src" 57 | needs="$initramfs_d/needs" 58 | 59 | [ -f "$needs" ] || fail "$needs is not a file" 60 | [ -d "$src_d" ] || fail "$src_d is not a dir" 61 | 62 | mkdir -p "${work_d}/"{bin,sbin,usr/bin,usr/sbin} 63 | 64 | while read need; do 65 | need=${need%%#*}; need=${need% }; 66 | [ -n "$need" ] || continue 67 | [ "${need#*..}" = "${need}" ] || fail "paths cannot have ..: $need" 68 | if [ -e "$root_d/$need" ]; then 69 | mkdir -p "$work_d/${need%/*}" && 70 | cp -a "$root_d/$need" "$work_d/$need" || 71 | fail "failed to copy $need to working dir" 72 | else 73 | fail "$need not found in $root_d" 74 | fi 75 | done < $needs 76 | 77 | loaders=$(cd "$root_d" && 78 | echo lib/ld-uClibc.so.0 lib/ld-uClibc-*.so \ 79 | lib/ld64-uClibc.so.0 lib/ld64-uClibc-*.so) 80 | 81 | for f in $loaders; do 82 | [ -f "$root_d/$f" ] || continue 83 | mkdir -p "${work_d}/${f%/*}" && 84 | cp -a "$root_d/$f" "$work_d/$f" || 85 | fail "failed to copy $f" 86 | done 87 | 88 | rsync -a "$src_d/" "$work_d" || 89 | fail "failed to sync $src_d to working dir" 90 | 91 | ( cd "${work_d}" && find . | cpio --quiet --dereference -o -H newc | gzip -9 ) 92 | 93 | exit 0 94 | -------------------------------------------------------------------------------- /src/etc/init.d/rc.sysinit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # vi: ts=4 noexpandtab 3 | 4 | . /lib/cirros/shlib 5 | 6 | write_lxc_is_container() { 7 | cat <<"EOF" 8 | #!/bin/sh 9 | # This program is written by /etc/rc.d/rc.sysinit. 10 | # It simply reports whether or not this system is in an lxc container 11 | 12 | EOF 13 | if is_lxc; then 14 | echo "# This is an LXC container" 15 | echo "exit 0" 16 | else 17 | echo "# This is NOT an LXC container" 18 | echo "exit 1" 19 | fi 20 | } 21 | 22 | fail() { echo "FAIL:" "$@"; } 23 | warn() { echo "WARN:" "$@"; } 24 | 25 | ### begin init ### 26 | 27 | if [ ! -d /proc/1 ]; then 28 | mount -n -t proc /proc /proc || fail "failed mount /proc" 29 | fi 30 | 31 | read uptime cputime < /proc/uptime 32 | iinfo "$0: up at $uptime" 33 | 34 | if (: >/.testrw; ) >/dev/null 2>&1; then 35 | rm -f /.testrw 36 | else 37 | mount -o remount,rw / || fail "failed mount / rw" 38 | fi 39 | 40 | is_mounted sysfs "" /sys || 41 | mount -t sysfs sysfs /sys || fail "failed mount /sys!" 42 | 43 | if ! is_lxc; then 44 | mount_once devtmpfs /dev /dev || fail "failed mount /dev" 45 | fi 46 | iinfo "container: $_LXC_CONTAINER" 47 | 48 | mkdir -p /dev/pts /dev/shm /run 49 | 50 | mount -a 51 | 52 | mkdir /run/var.tmp 53 | 54 | hostname -F /etc/hostname 55 | 56 | f="/bin/lxc-is-container" && write_lxc_is_container > "$f" && chmod 755 "$f" 57 | 58 | if ! is_lxc; then 59 | for d in $(awk '$2 == "/" { print $1 }' /proc/mounts); do 60 | [ -e "/dev/${d#/dev}" ] && ln -sf "${d#/dev/}" /dev/root && break 61 | done 62 | fi 63 | 64 | ## pretend you're runlevel 3 65 | set +f 66 | for s in /etc/rc3.d/S*; do 67 | [ -x "$s" ] || continue 68 | "$s" "start" > /etc/securetty 74 | if ! [ /dev/tty1 -ef /dev/console ]; then 75 | # on libvirt lxc, /dev/console is a symlink to /dev/pts0 76 | # and /dev/tty1 is also a symlink to /dev/pts/0. So using 77 | # the tty1 gets us a getty on "console" 78 | # 79 | # on upstream lxc, /dev/console is a character device 80 | # so we run a getty there if so. 81 | lxc_console="console" 82 | fi 83 | fi 84 | 85 | s_args="" 86 | for tty in $lxc_console tty1 ttyS0 hvc0; do 87 | if [ -e /dev/$tty ] && { echo "" >> "/dev/$tty" ; } 2>/dev/null ; then 88 | s_args="${s_args:+${s_args} }s/^#$tty:\(.*\)/$tty:\1/;" 89 | else 90 | s_args="${s_args:+${s_args} }s/^$tty:\(.*\)/#$tty:\1/;" 91 | fi 92 | done 93 | [ -z "$s_args" ] || 94 | { sed -i "$s_args" /etc/inittab && kill -HUP 1; } 95 | 96 | if [ -f /etc/rc.local -a -x /etc/rc.local ]; then 97 | /etc/rc.local 98 | fi 99 | -------------------------------------------------------------------------------- /bin/xmakedevs: -------------------------------------------------------------------------------- 1 | #!/bin/sh -e 2 | # vi: ts=4 noexpandtab 3 | # 4 | # this mimics function of buildroot's makedev 5 | # read a file like: 6 | # 7 | # and make files 8 | DEBUG=${XMAKEDEV_DEBUG} 9 | Usage() { 10 | cat < 16 | where name is the file name, type can be one of: 17 | f A regular file 18 | d Directory 19 | c Character special device file 20 | b Block special device file 21 | p Fifo (named pipe) 22 | EOF 23 | } 24 | 25 | error() { echo "$@" 1>&2; exit 1; } 26 | fail() { [ $# -eq 0 ] || error "$@" ; exit 1; } 27 | 28 | [ "$1" = "-h" -o "$1" = "--help" ] && { Usage; exit 0; } 29 | [ $# -eq 2 ] || { Usage 1>&2; exit 1; } 30 | 31 | root="$2" 32 | 33 | if [ "$1" != "-" ]; then 34 | exec < "$1" || fail "failed to redirect input from $1" 35 | fi 36 | 37 | chmodchown() { 38 | local mode=$1 uid=$2 gid=$3 39 | shift 3; 40 | [ "$mode" = "-" ] || chmod "$mode" "$@" || return 41 | [ "$uid" = "-" ] || chown "$uid" "$@" || return 42 | [ "$gid" = "-" ] || chgrp "$gid" "$@" || return 43 | } 44 | iswild() { 45 | local star="\\*" 46 | case "$1" in 47 | *$star*) return 0;; 48 | esac 49 | return 1 50 | } 51 | 52 | cd "$root" || fail "failed cd $root" 53 | 54 | while read line; do 55 | line=${line%#*} 56 | [ -n "$line" ] || continue 57 | set -f 58 | set -- $line 59 | name=$1; type=$2; mode=$3; uid=$4; gid=$5; major=$6; minor=$7; start=$8; inc=$9; count="${10}" 60 | set +f 61 | files="./${name#/}" 62 | if iswild "$name"; then 63 | files=$(echo ./$name) 64 | iswild "$files" && fail "wildcards in wildcards: $files" 65 | fi 66 | case "$type" in 67 | f) 68 | for f in $files; do 69 | mkdir -p "${f%/*}" || fail "failed to make ${f%/*}"; 70 | done 71 | $DEBUG touch $files && 72 | $DEBUG chmodchown "$mode" "$uid" "$gid" $files || 73 | fail "failed create file $files" 74 | ;; 75 | d) 76 | $DEBUG mkdir -p $files && 77 | $DEBUG chmodchown "$mode" "$uid" "$gid" $files || 78 | fail "failed create dir $files" 79 | ;; 80 | c|b) 81 | for f in $files; do 82 | mkdir -p "${f%/*}" || fail "failed to make ${f%/*}"; 83 | done 84 | if [ "$count" = "-" ]; then 85 | $DEBUG mknod $files $type $major $minor 86 | else 87 | [ "$count" = "-" ] && count=1; 88 | i=0 89 | while [ $i -lt $count ]; do 90 | fname="./$name" 91 | $DEBUG mknod "$fname" "$type" "$major" "$(($minor+($i*$inc)))" 92 | $DEBUG chmodchown "$fname" "$mode" "$uid" "$gid" 93 | i=$(($i+1)) 94 | done 95 | fi 96 | ;; 97 | esac 98 | done 99 | -------------------------------------------------------------------------------- /src/usr/share/cloud/functions: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # vi: ts=4 noexpandtab 3 | 4 | BURL="http://169.254.169.254/2009-04-04" 5 | MDURL="${BURL}/meta-data" 6 | UDURL="${BURL}/user-data" 7 | STATE_D=/var/lib/cloud 8 | SEM_D=$STATE_D/sem 9 | CLOUD_CONFIG=${STATE_D}/config.sh 10 | MD_DEBUG_COUNT=30 11 | MD_MAX_TRIES=30 12 | IS_NOCLOUD=0 13 | 14 | [ -d "${STATE_D}" ] || mkdir -p "${STATE_D}" 15 | 16 | [ -f "${CLOUD_CONFIG}" ] && . "${CLOUD_CONFIG}" 17 | # CLOUD_CONFIG may set 18 | # MD_TRIES 19 | # MD_DEBUG_COUNT 20 | 21 | TMPF=/tmp/${0##*/}.tmp 22 | trap "rm -f ${TMPF}" EXIT 23 | msg() { echo "${XN}: $1"; } 24 | mdget() { 25 | if [ "${2}" = "-" ]; then 26 | wget -q -O - "${MDURL}/${1}" 27 | else 28 | local out=${2:-${TMPF}} 29 | wget -q -O - "${MDURL}/${1}" > "${out}" && 30 | { read _RET < "${TMPF}" ; :; } 31 | fi 32 | } 33 | marked() { 34 | local name=${2:-${XN}} iid=${1} 35 | [ -f "${SEM_D}/${name}.${iid}" ] 36 | } 37 | mark() { 38 | local name=${2:-${XN}} iid=${1} 39 | { [ -d "${SEM_D}" ] || mkdir "${SEM_D}"; } || 40 | msg "failed to make ${SEM_D}" 41 | date > "${SEM_D}/${name}.${iid}" 42 | } 43 | 44 | mddebug() { 45 | local dbf="${STATE_D}/mddebug" 46 | if [ -f "${dbf}" ]; then 47 | chmod 755 "${dbf}" 48 | msg "running ${dbf} (${MD_DEBUG_COUNT} tries reached)" 49 | echo "############ debug start ##############" 50 | "${STATE_D}/debug" 51 | echo "############ debug end ##############" 52 | return 53 | fi 54 | msg "running debug (${MD_DEBUG_COUNT} tries reached)" 55 | echo "############ debug start ##############" 56 | echo "### /etc/rc.d/init.d/sshd start" 57 | /etc/rc.d/init.d/sshd start 58 | local gw="" 59 | gw=$(route -n | awk '$1 == "0.0.0.0" && $2 != "0.0.0.0" { print $2 }') 60 | echo "### ifconfig -a" 61 | ifconfig -a 62 | echo "### route -n" 63 | route -n 64 | echo "### cat /etc/resolv.conf" 65 | cat /etc/resolv.conf 66 | if [ -n "${gw}" ]; then 67 | echo "### ping -c 5 ${gw}" 68 | ping -c 5 ${gw} 69 | else 70 | echo "### gateway not found" 71 | fi 72 | local t1 t2 t3 nslist="" ns="" 73 | while read t1 t2 t3; do 74 | case "$t1" in 75 | nameserver) nslist="${nslist} ${t2}";; 76 | esac 77 | done < /etc/resolv.conf 78 | echo "### pinging nameservers" 79 | for ns in ${nslist}; do 80 | echo "#### ping -c 5 ${ns}" 81 | ping -c 5 ${ns} 82 | done 83 | echo "### uname -a" 84 | uname -a 85 | lxc-is-container || { echo "### lsmod"; lsmod; } 86 | echo "### dmesg | tail" 87 | dmesg | tail 88 | echo "### tail -n 25 /var/log/messages" 89 | tail -n 25 /var/log/messages 90 | echo "############ debug end ##############" 91 | } 92 | 93 | is_nocloud() { 94 | [ "${IS_NOCLOUD:-0}" != "0" ] && return 0 95 | lxc-is-container || 96 | { grep -q "ds=nocloud" /proc/cmdline && return 0; } 97 | [ -f /root/nocloud ] && return 0 98 | return 1 99 | } 100 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ARCH = i386 2 | TOP_D = $(shell pwd) 3 | BR_D = $(TOP_D)/buildroot 4 | OUT_D = $(TOP_D)/output/$(ARCH) 5 | BR_OUT_D = $(OUT_D)/buildroot 6 | CONF_D = $(TOP_D)/conf 7 | DL_D = $(TOP_D)/download 8 | SKEL_D = $(OUT_D)/skeleton 9 | 10 | TMPDIR ?= $(OUT_D)/tmp 11 | export TMPDIR 12 | 13 | DISK_IMG = $(OUT_D)/disk.img 14 | PART_IMG = $(OUT_D)/part.img 15 | TAR_IMG = $(OUT_D)/rootfs.tar 16 | BR_TAR_IMG = $(BR_OUT_D)/images/rootfs.tar 17 | BR2_CCACHE_DIR = $(OUT_D)/ccache 18 | 19 | BR_MAKE = cd $(BR_D) && mkdir -p "$(TMPDIR)" && \ 20 | make O=$(BR_OUT_D) BR2_DL_DIR=$(DL_D) \ 21 | BUSYBOX_CONFIG_FILE=$(BR_OUT_D)/busybox.config \ 22 | BR2_CCACHE_DIR=$(BR2_CCACHE_DIR) 23 | 24 | BR_DEPS = $(BR_D) $(BR_OUT_D)/busybox.config $(BR_OUT_D)/.config $(SKEL_D)/.dir 25 | 26 | BR_CONFIG = $(CONF_D)/buildroot-$(ARCH).config 27 | 28 | BUSYBOX_VERSION := $(shell sed -n -e s/BR2_BUSYBOX_VERSION="\(.*\)"/\\1/p < $(BR_CONFIG)) 29 | BUSYBOX_BUILD_DIR = $(BR_OUT_D)/build/busybox-$(BUSYBOX_VERSION) 30 | BUSYBOX_BUILD_CONFIG = $(BUSYBOX_BUILD_DIR)/.config 31 | 32 | unexport SED # causes random issues (LP: #920620) 33 | 34 | all: $(TAR_IMG) 35 | 36 | debug: 37 | @echo "BR_DEPS: $(BR_DEPS)" 38 | @echo "BR_MAKE: $(BR_MAKE)" 39 | @echo "BR_OUT_D: $(BR_OUT_D)" 40 | @echo "BUSYBOX_BUILD_CONFIG: $(BUSYBOX_BUILD_CONFIG)" 41 | 42 | source: br_source minicloud_source 43 | 44 | br_source: $(BR_DEPS) $(OUT_D)/.source.$(ARCH) 45 | minicloud_source: $(DL_D)/.dir 46 | @echo hi world 47 | # here we would download the Ubuntu kernel 48 | 49 | $(BR_D): 50 | @[ -d "$(BR_D)" ] || { echo "You Must download BUILDROOT, extract it, and symlink to $(BR_D)"; exit 1; } 51 | 52 | $(OUT_D)/.source.$(ARCH): 53 | $(BR_MAKE) source 54 | 55 | $(BR_OUT_D)/busybox.config: $(CONF_D)/busybox.config $(BR_OUT_D)/.dir 56 | cp $(CONF_D)/busybox.config $@ 57 | for s in configured built target_installed; do rm -f $(BR_OUT_D)/build/busybox-1.18.5/.stamp_$$s; done 58 | 59 | $(BR_OUT_D)/.config: $(BR_CONFIG) $(BR_OUT_D)/.dir 60 | cp $(BR_CONFIG) $@ 61 | 62 | $(TAR_IMG): $(BR_TAR_IMG) 63 | cp $(BR_TAR_IMG) $(TAR_IMG) 64 | 65 | $(BR_TAR_IMG): $(BR_DEPS) 66 | $(BR_MAKE) 67 | 68 | $(SKEL_D)/.dir: 69 | # copy BR_D/fs/skeleton, then sync src/ over the 70 | # top of that. 71 | # depends on $(BR_D)/fs/skeleton (somehow) 72 | [ -d $(SKEL_D) ] || mkdir -p $(SKEL_D) 73 | rsync -a $(BR_D)/system/skeleton/ $(SKEL_D)/ --delete 74 | rsync -a $(TOP_D)/src/ $(SKEL_D)/ 75 | touch $(SKEL_D)/.dir 76 | 77 | br-menuconfig: $(BR_OUT_D)/.config 78 | $(BR_MAKE) $* menuconfig 79 | cp $(BR_OUT_D)/.config $(CONF_D)/buildroot-$(ARCH).config 80 | 81 | $(BUSYBOX_BUILD_CONFIG): $(CONF_D)/busybox.config 82 | cp $(CONF_D)/busybox.config $(BUSYBOX_BUILD_CONFIG) 83 | 84 | br-busybox-menuconfig: $(BUSYBOX_BUILD_CONFIG) 85 | $(BR_MAKE) $* busybox-menuconfig 86 | cp $(BUSYBOX_BUILD_CONFIG) $(CONF_D)/busybox.config 87 | 88 | br-%: $(BR_OUT_D)/.config $(BR_OUT_D)/busybox.config 89 | $(BR_MAKE) $* 90 | 91 | %/.dir: 92 | mkdir -p $* && touch $@ 93 | -------------------------------------------------------------------------------- /src/init: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # vi: ts=4 noexpandtab 3 | # 4 | # This is the initramfs init script 5 | ROOTFS_LABEL="cirros-rootfs" 6 | 7 | . /lib/cirros/shlib 8 | 9 | mkdir -p /proc /newroot /dev /tmp 10 | 11 | mount -t devtmpfs /dev /dev 12 | mount -t proc /proc /proc 13 | 14 | echo "6 4 1 7" >/proc/sys/kernel/printk 15 | 16 | parse_cmdline 17 | 18 | for x in $KC_CONSOLES; do 19 | [ "$x" = "$KC_CONSOLE" ] || 20 | echo "further output written to $KC_CONSOLE" > "$x"; 21 | done 22 | if [ -n "$KC_PREF_CONSOLE" ]; then 23 | exec >"$KC_PREF_CONSOLE" 2>&1 <"$KC_PREF_CONSOLE" 24 | fi 25 | 26 | read uptime cputime < /proc/uptime 27 | iinfo "initramfs: up at $uptime" 28 | 29 | idebug "loading modules" 30 | /etc/init.d/load-modules start 31 | 32 | ROOT="" 33 | MOUNTED="" 34 | 35 | if [ "$KC_RAMDISK_ROOT" != "1" ]; then 36 | while read maj min blk name other; do 37 | [ -n "${maj}" -a "${maj}" != "major" ] || continue 38 | umount=0 39 | mount -o ro "/dev/${name}" "/newroot" >/dev/null 2>&1 && 40 | MOUNTED="$MOUNTED ${name}" && umount=1 && 41 | [ -x /newroot/sbin/init ] && ROOT="/dev/$name" && break 42 | [ ${umount} -eq 0 ] || umount /newroot 43 | done < /proc/partitions 44 | fi 45 | 46 | if [ "$KC_DEBUG" = "1" ]; then 47 | echo "dropping into initramfs debug shell" 48 | /bin/sh 49 | fi 50 | 51 | if [ -z "$ROOT" -a "$KC_RAMDISK_ROOT" != "1" ] && 52 | blank=$(blkid -l -o device -t LABEL=$ROOTFS_LABEL) && 53 | [ -e "$blank" ]; then 54 | iinfo "copying initramfs to $blank" 55 | items="" 56 | set +f 57 | for x in /*; do 58 | case "$x" in 59 | /dev|/proc|/newroot) : ;; 60 | *) items="$items $x";; 61 | esac 62 | done 63 | set -f 64 | mount "$blank" /newroot 65 | mkdir -p /newroot/dev /newroot/proc 66 | cp -a $items /newroot/ 67 | cp -a /dev/console /newroot/dev 68 | mount -o remount,ro /newroot 69 | ROOT="$blank" 70 | fi 71 | 72 | if [ -n "$ROOT" ]; then 73 | if [ "${ROOT%[0-9]}" != "${ROOT}" -a -e "${ROOT%[0-9]}" ]; then 74 | # only bother with growroot if root is a partition (sda1, not sda) 75 | # and there exists a /dev/sda (xen will give xvda1 without xvda) 76 | idebug "Growing root partition $ROOT" 77 | umount /newroot 78 | growroot "$ROOT" 79 | mount -o ro "$ROOT" "/newroot" || 80 | failure "uh-oh, $ROOT was there, but not after growroot" 1>&2 81 | fi 82 | cd /newroot 83 | mount -o move /dev ./dev 84 | umount /proc 85 | iinfo "initramfs loading root from $ROOT" 86 | exec switch_root /newroot /sbin/init "$@" 87 | else 88 | while read maj min blk name other; do 89 | [ -n "${maj}" -a "${maj}" != "major" ] || continue 90 | umount=0 91 | mount -o ro "/dev/${name}" "/newroot" >/dev/null 2>&1 && 92 | umount=1 && 93 | [ -x /newroot/sbin/init ] && ROOT="/dev/$name" && break 94 | [ ${umount} -eq 0 ] || umount /newroot 95 | done < /proc/partitions 96 | umount /proc 97 | [ "$KC_RAMDISK_ROOT" = "0" ] && 98 | iinfo "initramfs did not find root, running as ramdisk" || 99 | iinfo "running in ramdisk mode as requested" 100 | exec /sbin/init "$@" 101 | fi 102 | failure "badness occurred in ramdisk" 103 | -------------------------------------------------------------------------------- /src/bin/cirros-per: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | . ${CIRROS_LIB:=/lib/cirros/shlib_cirros} || 4 | { echo "failed to read ${CIRROS_LIB}" 1>&2; exit 1; } 5 | 6 | Usage() { 7 | cat < "${state_d}/${marker}" 107 | 108 | return "$ret" 109 | } 110 | 111 | cirros_per "$@" 112 | 113 | # vi: ts=4 noexpandtab 114 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | This is a project to build a small cloud image that has useful tools and 2 | function for debugging or developing cloud infrastructure. 3 | 4 | The following works on Ubuntu 10.04 or 12.04 LTS. 5 | 6 | To use it, you would do something like: 7 | * get some build dependencies: 8 | $ sudo apt-get -y install bison flex texinfo build-essential gettext ncurses-dev unzip bzr qemu-kvm cvs quilt ruby1.9.1 9 | 10 | * get Cirros 11 | $ git clone -b manila-service-generic https://github.com/csabahenk/cirros 12 | $ cd cirros 13 | 14 | * download buildroot and setup environment 15 | $ git submodule init 16 | $ git submodule update 17 | 18 | * update ./bin/mkcabundle > src/etc/ssl/certs/ca-certificates.crt 19 | $ ./bin/mkcabundle > src/etc/ssl/certs/ca-certificates.crt 20 | 21 | * apply any local cirros patches to buildroot (note nfsv4 support is 22 | available in a patch) 23 | ( cd buildroot && QUILT_PATCHES=$PWD/../patches-buildroot quilt push -a ) 24 | 25 | * download the buildroot sources 26 | $ make ARCH=x86_64 br-source 27 | 28 | * Build buildroot for a given arch 29 | # ARCH should be set to 'i386', 'x86_64' or 'arm' 30 | $ make ARCH=x86_64 OUT_D=$PWD/output/x86_64 31 | 32 | This will do a full buildroot build, which will take a while. The output 33 | that CirrOS is interested in is output/i386/rootfs.tar. 34 | That file is the full buildroot filesystem, and is used as input for 35 | subsequent steps here. 36 | 37 | * Download a kernel to use. 38 | The kernel input to bundle must be in deb format. The ubuntu '-virtual' 39 | kernel is used as a starting point. 40 | 41 | For example, to get the Ubuntu Saucy kernel for x86_64: 42 | 43 | # Following links to find deb archive from 44 | # https://launchpad.net/ubuntu/saucy/+package/linux-image 45 | $ (cd download && 46 | wget http://launchpadlibrarian.net/164735055/linux-image-3.11.0-17-generic_3.11.0-17.31_amd64.deb) 47 | 48 | * build disk images using bin/bundle 49 | $ sudo ./bin/bundle -v output/$ARCH/rootfs.tar download/kernel-$ARCH.deb output/$ARCH/images 50 | 51 | * Then, test using the images 52 | $ kvm -drive file=disk.img,if=virtio -curses 53 | $ kvm file=blank.img,if=virtio -curses \ 54 | -kernel kernel -initrd initrd -drive -append "debug-initrd" 55 | 56 | To make changes in buildroot configuration: 57 | 58 | * Have an up-to-date buildroot checkout 59 | 60 | * Copy the conf file corresponding to your architecture 61 | to buildroot tree 62 | $ cp conf/buildroot-x86_64.config buildroot/.config 63 | 64 | * Perform config changes 65 | $ make -C buildroot menuconfig 66 | 67 | * Copy back the config file to Cirros project space 68 | to preserve it for further builds 69 | $ cp buildroot/.config conf/buildroot-x86_64.config 70 | 71 | * Commit to git 72 | $ git commit -a 73 | 74 | To update buildroot or switch to another version: 75 | 76 | * Do the update and let git know of it 77 | 78 | $ cd buildroot 79 | $ git pull 80 | or 81 | $ git checkout 82 | $ cd .. 83 | $ git add buildroot 84 | 85 | * Update config 86 | $ cp conf/buildroot-x86_64.config buildroot/.config && 87 | make -C buildroot olddefconfig && 88 | cp buildroot/.config conf/buildroot-x86_64.config 89 | 90 | * Commit to git 91 | $ git commit -a 92 | -------------------------------------------------------------------------------- /bin/mirror-dump-sstream-data: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -f 3 | # 4 | # 5 | # 6 | Usage() { 7 | cat < mdata.txt 18 | ./simplestreams/tools/tenv tab2streams mdata.txt cirros-streams.d 19 | 20 | ./simplestreams/tools/tenv env -u GNUPGHOME \ 21 | SS_GPG_BATCH=1 SS_GPG_DEFAULT_KEY=A5DDB840 \ 22 | js2signed cirros-streams.d 23 | EOF 24 | } 25 | 26 | error() { echo "$@" 1>&2; } 27 | fail() { [ $# -eq 0 ] || error "$@"; exit 1; } 28 | 29 | [ "$1" = "-h" -o "$1" = "--help" ] && { Usage; exit 0; } 30 | [ "$#" -eq 1 ] || { Usage 1>&2; fail "must give mirror dir"; } 31 | 32 | OIFS="$IFS" 33 | declare -A VERSION2SERIAL 34 | VERSION2SERIAL=( [0.3.0]="20111020" [0.3.1]="20130207" 35 | [0.3.1~pre1]="20120611" [0.3.1~pre3]="20120827" 36 | [0.3.1~pre4]="20130111" [0.3.2~pre1]="20130513" 37 | ) 38 | 39 | #content-id product_name version_name img_name [key=value [key=value]] 40 | content_id_base="net.cirros-cloud:%(stream)s:download" 41 | 42 | tab="$(printf '\t')" 43 | 44 | top_d="${1:-.}" 45 | cd "$top_d" 46 | IFS=$'\n'; files=( $(find . -type f -printf "%p|%s\n") ); IFS="$OIFS" 47 | 48 | for ent in "${files[@]}"; do 49 | IFS="|"; set -- $ent; IFS="$OIFS" 50 | path=${1#./} 51 | size=${2} 52 | 53 | case "$path" in 54 | *-uec.tar.gz|*-disk.img|*-rootfs.img|*-lxc.tar.gz) :;; 55 | *) continue;; 56 | esac 57 | IFS="/"; set -- $path; IFS=$OIFS 58 | version="$1"; fname="$2"; 59 | serial="${VERSION2SERIAL[$version]}" 60 | [ -n "$serial" ] || 61 | fail "serial not found for $version!" 62 | 63 | # tokenize cirros-0.3.1~pre4-x86_64-lxc.tar.gz, baseproduct gets 'cirros' 64 | IFS="-"; set -- $fname; IFS="$OIFS" 65 | baseproduct="$1"; _version="$2"; arch="$3"; ftype="$4" 66 | 67 | # tokenize 0.3.1~pre1 or 0.3.0 68 | extra=${version#*~}; [ "$extra" = "$version" ] && extra="" 69 | tmp=${version%$extra} 70 | IFS="."; set -- ${version%$extra}; IFS="$IOFS" 71 | vmaj="$1"; vmin="$2"; vmic="$3" 72 | 73 | [ -z "$extra" ] && stream="released" || stream="devel" 74 | 75 | # productname is "net.cirros-cloud[.devel]:standard:0.3:arch" 76 | rdns="net.cirros-cloud" 77 | [ "$stream" = "released" ] || rdns="${rdns}.${stream}" 78 | product_name="$rdns:standard:$vmaj.$vmin:$arch" 79 | content_id="${content_id_base//%(stream)s/${stream}}" 80 | 81 | req_out="" 82 | for item in "$content_id" "$product_name" "$serial" "$ftype"; do 83 | req_out="${req_out}${tab}${item}" 84 | done 85 | req_out=${req_out#${tab}} 86 | 87 | md5=$(md5sum "${path}") && md5="${md5%% ${path}}" 88 | sha256=$(sha256sum "${path}") && sha256="${sha256%% ${path}}" 89 | pubname="${baseproduct}-${version}-${arch}" 90 | 91 | out="" 92 | for i in ftype path arch version size sha256 md5 pubname stream; do 93 | out="${out}${tab}${i}=${!i}" 94 | done 95 | out=${out#${tab}} 96 | printf "%s\n" "${req_out}${tab}${out}" 97 | #printf " 98 | #echo "$content_id 99 | #echo "version=$version fname=$fname stream=$stream product_name=$product_name" 100 | done 101 | -------------------------------------------------------------------------------- /src/lib/cirros/shlib_cirros: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | assert_datasource() { 4 | [ -n "${_DATASOURCE_NAME}" ] && return 5 | [ -d "${RESULTS_D}" ] && [ -r "${RESULTS_D}/dsname" ] || 6 | { debug 2 "no datasource found"; return 1; } 7 | 8 | local dsname="" dsmode="" 9 | { read dsname < "${RESULTS_D}/dsname"; } >/dev/null 2>&1 || 10 | { debug 1 "failed to read dsname"; return 1; } 11 | 12 | [ -n "$dsname" ] || 13 | { debug 1 "empty datasource name"; return 1; } 14 | 15 | { read dsmode < "${RESULTS_D}/dsmode"; } >/dev/null 2>&1 || 16 | { debug 1 "failed to read dsmode"; return 1; } 17 | 18 | _DATASOURCE_NAME="$dsname" 19 | _DATASOURCE_MODE="$dsmode" 20 | _RET="${dsname}" 21 | } 22 | 23 | ds_list_items() { 24 | set +f; 25 | local found=0 start="$PWD" items="" 26 | cd "${RESULTS_D}/data" || return 1 27 | for item in *; do 28 | [ -f "$item" ] || continue 29 | items="${items}${CR}${item}" 30 | found=$(($found+1)) 31 | done 32 | items=${items#${CR}} 33 | [ -n "$items" ] || debug 2 "empty items in $RESULTS_D/data" 34 | set -f 35 | cd "$start" || { debug 2 "failed to cd back to $start"; return 1; } 36 | [ -n "$items" ] && _RET="$items" 37 | } 38 | 39 | ds_get_item_path() { 40 | assert_datasource || return 41 | local field="$1" 42 | local fpath="${RESULTS_D}/data/$field" 43 | if [ ! -f "$fpath" ]; then 44 | debug 2 "field $field not available for ds '$_DATASOURCE_NAME'"; 45 | return 2; 46 | fi 47 | [ -r "$fpath" ] || { debug 2 "cannot read $field. need root?"; return 1; } 48 | _RET="$fpath" 49 | return 50 | } 51 | 52 | ds_has_item() { 53 | [ -f "${RESULTS_D}/data/$1" ] 54 | } 55 | 56 | ds_get_item() { 57 | ds_get_item_path "$1" || return 58 | local fpath="$_RET" 59 | # file exists and is readable due to above, if read fails, it is due to EOF. 60 | read _RET < "$fpath" || : 61 | } 62 | 63 | ds_cat_item() { 64 | ds_get_item_path "$1" && cat "$_RET" 65 | } 66 | 67 | cirros_version() { 68 | { read _RET < /etc/cirros/version; } >/dev/null 2>&1 69 | } 70 | 71 | cirros_version_available() { 72 | local na="0.0" af="$DATA_D/cirros_available" 73 | local url="http://download.cirros-cloud.net/version/released" 74 | [ -d "$DATA_D" ] || mkdir -p "$DATA_D" 75 | 76 | [ "$1" = "-f" ] && { rm -f "$af"; shift; } 77 | local block="${1:-0}" 78 | 79 | if [ ! -f "$af" ]; then 80 | local max=$block 81 | [ "$max" = "0" ] && max=20 82 | 83 | local agent="cirros/$CIRROS_VERSION ($(uname -m))" 84 | local curlcmd="curl --location --silent --fail --max-time $max" 85 | 86 | echo "$na" > "$af" 87 | if [ "${block}" != "0" ]; then 88 | local out="" 89 | out=$($curlcmd --user-agent "$agent" "$url") && echo "$out" > "$af" 90 | else 91 | sh -c "out=\$($curlcmd --user-agent '$agent' '$url') && 92 | echo \"\${out}\" > '$af'" & 93 | fi 94 | fi 95 | { read _RET < "$af"; } >/dev/null 2>&1 96 | [ -n "$_RET" ] || _RET="$na" 97 | return 98 | } 99 | 100 | . ${CIRROS_SHLIB:=/lib/cirros/shlib} || 101 | { error "failed to read ${CIRROS_SHLIB}" 1>&2; exit 1; } 102 | 103 | INTERNAL=false 104 | VERBOSITY=1 105 | CONFIG=/etc/cirros-init/config 106 | DATA_D=/var/lib/cirros/data 107 | STATE_D=/var/lib/cirros/sem 108 | BOOT_STATE_D=/run/cirros/sem 109 | DS_D=/lib/cirros/ds 110 | RESULTS_D=/run/cirros/datasource 111 | 112 | cirros_version 113 | CIRROS_VERSION="$_RET" 114 | 115 | [ ! -r "$CONFIG" ] || . "$CONFIG" || 116 | fail "failed to read $CONFIG" 117 | 118 | # remove any trailing / 119 | STATE_D=${STATE_D%/} 120 | BOOT_STATE_D=${BOOT_STATE_D%/} 121 | DS_D=${DS_D%/} 122 | RESULTS_D=${RESULTS_D%/} 123 | 124 | # vi: ts=4 noexpandtab syntax=sh 125 | -------------------------------------------------------------------------------- /src/lib/cirros/ds/ec2: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | VERBOSITY=1 4 | TEMP_D="" 5 | CONFIG=/etc/cirros-init/ds-ec2 6 | MDURL="http://169.254.169.254/2009-04-04" 7 | NAME="${0##*/}" 8 | 9 | . ${CIRROS_SHLIB:=/lib/cirros/shlib} || 10 | { echo "failed to read ${CIRROS_SHLIB}" 1>&2; exit 1; } 11 | 12 | error() { echo "$@" 1>&2; } 13 | fail() { [ $# -eq 0 ] || error "$@"; exit 1; } 14 | 15 | Usage() { 16 | cat </dev/null); then 50 | [ "${iid#i-}" != "${iid}" ] && break 51 | debug 1 "failed $i/${max}: up ${uptime}. iid had '${iid}'" 52 | else 53 | debug 1 "failed $i/${max}: up ${uptime}. request failed" 54 | fi 55 | sleep $SLEEP_TIME 56 | done 57 | 58 | if [ -n "${iid}" ]; then 59 | debug 1 "successful after ${i}/${max} tries: up ${uptime}. iid=${iid}" 60 | else 61 | error "failed to read iid from metadata. tried ${max}"; 62 | return 0 63 | fi 64 | 65 | local keys="" key="" 66 | keys="public-keys instance-id ami-launch-index instance-type local-ipv4 67 | public-ipv4 hostname local-hostname user-data 68 | block-device-mappings public-hostname availability-zone" 69 | mkdir -p "${out_d}/data" 70 | for key in $keys; do 71 | mdget "--${key}" > "${out_d}/data/${key}" || 72 | debug 1 "warning: no ec2 metadata for $key" 73 | done 74 | 75 | local fix="" t="" f="" 76 | for fix in ami-launch-index:launch-index; do 77 | f="${fix%:*}" 78 | t="${fix#*:}" 79 | [ -f "${out_d}/data/$f" -a ! -f "${out_d}/data/$t" ] || continue 80 | ln -sf "$f" "${out_d}/data/$t" || 81 | fail "failed to link $f to ${out_d}/data/t" 82 | done 83 | 84 | echo 0 > "$out_d/result" 85 | return 86 | } 87 | 88 | apply() { 89 | # ec2 datasource does nothing for apply 90 | local mode="$1" data_d="$2" 91 | return 0 92 | } 93 | 94 | short_opts="hv" 95 | long_opts="help,verbose" 96 | getopt_out=$(getopt --name "${0##*/}" \ 97 | --options "${short_opts}" --long "${long_opts}" -- "$@") && 98 | eval set -- "${getopt_out}" || 99 | bad_Usage 100 | 101 | output="" 102 | 103 | while [ $# -ne 0 ]; do 104 | cur=${1}; next=${2}; 105 | case "$cur" in 106 | -h|--help) Usage ; exit 0;; 107 | -v|--verbose) VERBOSITY=$((${VERBOSITY}+1));; 108 | --) shift; break;; 109 | esac 110 | shift; 111 | done 112 | 113 | [ $# -eq 2 ] || bad_Usage "must provide mode and data dir" 114 | mode="$1" 115 | out_d="$2" 116 | 117 | [ "$mode" = "net" -o "$mode" = "apply-net" ] || { 118 | debug 2 "only supported in mode 'net' or 'apply-net'"; 119 | exit 0; 120 | } 121 | 122 | [ ! -e "$CONFIG" ] || . "$CONFIG" || 123 | fail "failed to read $CONFIG" 124 | 125 | if [ "$mode" = "net" ]; then 126 | search_local "$out_d" 127 | elif [ "$mode" = "apply-net" ]; then 128 | apply "$mode" "$out_d" 129 | else 130 | fail "error, unexpected input" 131 | fi 132 | 133 | exit 134 | # vi: ts=4 noexpandtab 135 | -------------------------------------------------------------------------------- /src/sbin/cirros-ds: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | . ${CIRROS_LIB:=/lib/cirros/shlib_cirros} || 4 | { echo "failed to read ${CIRROS_LIB}" 1>&2; exit 1; } 5 | 6 | Usage() { 7 | cat </dev/null 2>&1 63 | for tok in $cmdline; do 64 | case "$tok" in 65 | dslist=) cmdline_list=none;; 66 | dslist=*) cmdline_list=${tok#dslist=};; 67 | esac 68 | done 69 | if [ -n "${cmdline_list}" -a "${cmdline_list}" != "none" ]; then 70 | IFS=","; set -- ${cmdline_list}; IFS="$oifs" 71 | debug 2 "found datasource list on cmdline:" "$@" 72 | else 73 | set -- ${DATASOURCE_LIST} 74 | debug 2 "found datasource list in config:" "$@" 75 | fi 76 | [ $# -ne 0 ] || { error "no datasource list configured?"; return 1; } 77 | fi 78 | 79 | TEMP_D=$(mktemp -d "${TMPDIR:-/tmp}/${0##*/}.XXXXXX") || 80 | { error "failed to make tempdir"; return 1; } 81 | trap cleanup EXIT 82 | 83 | local ds result="" ret="" 84 | 85 | PATH="${DS_D}:$PATH" 86 | for ds in "$@"; do 87 | result="${TEMP_D}/${ds}/result" 88 | read_uptime 89 | debug 2 "running: $ds $ptv $mode $TEMP_D/${ds} [up ${_RET}]" 90 | "$ds" $ptv "$mode" "${TEMP_D}/${ds}" > "${TEMP_D}/output" 91 | ret=$? 92 | if [ $ret -eq 0 ] && [ -r "$result" ]; then 93 | rm -f "$result" 94 | if $dryrun; then 95 | error "$ds-$mode: datasource found" 96 | else 97 | rm -Rf "$RESULTS_D" && mkdir -p "${RESULTS_D%/*}" && 98 | cp -a "${TEMP_D}/$ds/" "${RESULTS_D}" || { 99 | error "failed to copy results from $ds to $RESULTS_D"; 100 | return 1; 101 | } 102 | echo "$ds" > "$RESULTS_D/dsname" 103 | echo "$mode" > "$RESULTS_D/dsmode" 104 | fi 105 | debug 1 "found datasource ($ds, $mode)" 106 | return 0 107 | elif [ $ret -eq 0 ]; then 108 | debug 2 "$ds-$mode: no datasource found" 109 | else 110 | error "$ds-$mode: returned error" 111 | fi 112 | done 113 | 114 | read_uptime 115 | debug 1 "no results found for mode=$mode. up $_RET. searched:" "$@" 116 | return 1 117 | } 118 | 119 | cirros_ds "$@" 120 | 121 | # vi: ts=4 noexpandtab 122 | -------------------------------------------------------------------------------- /src/usr/bin/ec2metadata: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | MD_URL="http://169.254.169.254/latest" 4 | OIFS="$IFS" 5 | TIMEOUT=10 6 | CR=" 7 | " 8 | 9 | Usage() { 10 | cat < dump 'item' from the metadata service 17 | 18 | Special items: 19 | --block-device-mappings dump the block device mappings, space delimited 20 | --public-keys dump the public keys 21 | 22 | with no options given, metadata service will be crawled and 23 | dumped. This will not include user-data. 24 | EOF 25 | } 26 | 27 | error() { echo "$@" 1>&2; } 28 | fail() { [ $# -eq 0 ] || error "$@"; exit 1; } 29 | 30 | get_field_list() { 31 | local under="$1" x="" out="" found="" 32 | mdget "$under" 33 | out="$_RET" 34 | for x in $out; do 35 | case "$x" in 36 | */) get_field_list "${under:+${under}/}${x%/}" 37 | found="${found} $_RET";; 38 | *) found="${found} ${under:+$under/}$x";; 39 | esac 40 | done 41 | _RET="${found# }" 42 | } 43 | 44 | caturl() { 45 | curl --fail --silent --max-time "${TIMEOUT}" "$1" 46 | } 47 | 48 | mdget() { 49 | local u="$1" t1="" t2="" out="" 50 | case "$u" in 51 | user-data) :;; 52 | public-keys|public-keys/) 53 | out=$(caturl "$MD_URL/meta-data/$u") || 54 | fail "failed to get $MD_URL/meta-data/$u"; 55 | # output of public-keys is lines of 'X=keyname' 56 | # so we return a carriage return list of the tokens before = 57 | _RET="" 58 | IFS="$CR" 59 | for t1 in $out; do 60 | t1="${t1%%=*}" 61 | _RET="${_RET:+${_RET}${CR}}${t1%/}" 62 | done 63 | IFS="$OIFS" 64 | return 65 | ;; 66 | public-keys/*) 67 | t1=${u#public-keys/[0-9]} 68 | # t2 will now have 'public-keys/[0-9]' 69 | t2=${u%${t1}} 70 | # if t1 has a / (ie, u=public-keys/0=brickies/openssh-keys) 71 | # then set t1 to just "/openssh-keys". if not, set it to "" 72 | [ "${t1#*/}" = "${t1}" ] && t1="" || t1="/${t1#*/}" 73 | u="meta-data/${t2}${t1}" 74 | ;; 75 | *) u="meta-data/$u";; 76 | esac 77 | _RET=$(caturl "$MD_URL/$u") || 78 | fail "failed to get ${MD_URL}/$u" 79 | } 80 | special() { 81 | local out="" x="" t="" ret="" 82 | case "$1" in 83 | availability-zone) 84 | mdget "placement/availability-zone";; 85 | public-keys) 86 | mdget public-keys 87 | out="$_RET" 88 | IFS="$CR" 89 | for x in ${out}; do 90 | IFS="$OIFS" mdget \ 91 | "public-keys/${x}/openssh-key" && 92 | ret="${ret:+${ret}${CR}}${_RET}" 93 | done 94 | IFS="$OIFS" 95 | _RET="$ret" 96 | ;; 97 | block-device-mappings) 98 | mdget block-device-mapping 99 | out="$_RET" 100 | for x in ${out}; do 101 | mdget "block-device-mapping/$x" 102 | ret="${ret:+${ret} }${x}=$_RET"; 103 | done 104 | _RET="$ret" 105 | esac 106 | } 107 | 108 | fields="" 109 | while [ $# -ne 0 ]; do 110 | cur=${1}; next=${2}; 111 | case "$cur" in 112 | -h|--help) Usage ; exit 0;; 113 | --url=*) MD_URL=${cur#*=}; MD_URL=${MD_URL%/};; 114 | --url|-u) MD_URL="${next%/}"; shift;; 115 | --availability-zone|--public-keys|--block-device-mappings) 116 | fields="$fields special_${cur#--}";; 117 | --*) fields="$fields ${cur#--}";; 118 | esac 119 | shift; 120 | done 121 | 122 | fields="${fields# }" 123 | if [ -z "$fields" ]; then 124 | get_field_list "" 125 | fields="${_RET}" 126 | prefix=true 127 | else 128 | prefix=false 129 | fi 130 | 131 | for f in $fields; do 132 | case "$f" in 133 | special_*) special "${f#special_}";; 134 | *) mdget "$f";; 135 | esac 136 | ret=$? 137 | [ $ret -eq 0 ] || fail "failed to get $f" 138 | if $prefix; then 139 | if [ "${_RET#*${CR}}" != "${_RET}" ]; then 140 | _RET=$(echo "$_RET" | sed 's,^,|,g') 141 | _RET="${_RET#|}" 142 | fi 143 | echo "${f#special_}: $_RET" 144 | else 145 | echo "$_RET" 146 | fi 147 | done 148 | 149 | exit 0 150 | 151 | # vi: ts=4 noexpandtab 152 | -------------------------------------------------------------------------------- /src/sbin/cirros-apply: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | . ${CIRROS_LIB:=/lib/cirros/shlib_cirros} || 4 | { echo "failed to read ${CIRROS_LIB}" 1>&2; exit 1; } 5 | 6 | SSH_ROOT_PREFIX="command=\"echo Please login as \\'cirros\\' user, not as root; echo; sleep 10\"" 7 | 8 | Usage() { 9 | cat <' stage, 13 | and then apply generic 'apply-' hooks. 14 | 15 | If there is no data source, or datasource configured is 16 | not of type 'mode', then it will exit silently with success. 17 | 18 | mode is one of 'net' or 'local' 19 | 20 | options: 21 | -v | --verbose : be more verbose 22 | EOF 23 | } 24 | 25 | cirros_apply() { 26 | local short_opts="hv" 27 | local long_opts="help,verbose" 28 | local getopt_out="" 29 | getopt_out=$(getopt --name "${0##*/}" \ 30 | --options "${short_opts}" --long "${long_opts}" -- "$@") && 31 | eval set -- "${getopt_out}" || 32 | { bad_Usage; return; } 33 | 34 | local cur="" next="" mode="" VERBOSITY 35 | 36 | while [ $# -ne 0 ]; do 37 | cur=${1}; next=${2}; 38 | case "$cur" in 39 | -h|--help) Usage ; exit 0;; 40 | -v|--verbose) VERBOSITY=$((${VERBOSITY}+1));; 41 | --) shift; break;; 42 | esac 43 | shift; 44 | done 45 | 46 | [ $# -ne 0 ] || { bad_Usage "must provide mode"; return; } 47 | mode="$1" 48 | shift 49 | 50 | [ "$mode" = "net" -o "$mode" = "local" ] || 51 | { bad_Usage "mode must be 'net' or 'local'"; return; } 52 | 53 | local dsname dsmode root 54 | 55 | assert_datasource || 56 | { debug 1 "no datasource present"; return 0; } 57 | 58 | dsname="${_DATASOURCE_NAME}" 59 | dsmode="${_DATASOURCE_MODE}" 60 | 61 | [ "${dsmode}" = "$mode" ] || { 62 | debug 1 "datasource found is mode '${dsmode}', skipping"; 63 | return 0; 64 | } 65 | 66 | PATH="${DS_D}:$PATH" 67 | local root="${TARGET_ROOT}" 68 | if [ -n "$root" ]; then 69 | local sd="$PWD" 70 | cd "$root" && root="$PWD" && cd "$sd" || 71 | return 1; 72 | else 73 | root="/" 74 | fi 75 | TARGET_ROOT=$root "$dsname" "apply-${dsmode}" "$RESULTS_D" || 76 | { error "$dsname failed in apply-$dsmode"; return 1; } 77 | 78 | # 79 | # here do any common things for $mode 80 | # 81 | local hostname="" 82 | if ds_get_item hostname || ds_get_item local-hostname; then 83 | hostname="${_RET%%.*}" 84 | echo "$hostname" > /etc/hostname 85 | hostname -F /etc/hostname 86 | fi 87 | 88 | 89 | ## if there is a 'ephemeral0' block device, mount it 90 | if find_devs_with LABEL=ephemeral0 && [ -n "${_RET}" ]; then 91 | # get the first one only 92 | local dev="${_RET% *}" 93 | echo "${dev} /mnt auto rw,defaults 0 0" >> /etc/fstab 94 | mount /mnt || 95 | error "failed to mount ${dev}" 96 | fi 97 | 98 | # if we were provided with a network/interfaces file copy it 99 | if [ -f "$RESULTS_D/network-interfaces" ]; then 100 | local nif="$TARGET_ROOT/etc/network/interfaces" 101 | [ -d "$TARGET_ROOT/etc/network" ] || 102 | mkdir -p "$TARGET_ROOT/etc/network" 103 | [ ! -f "$nif" ] || cp "$nif" "$nif.dist" || 104 | error "failed to copy network interfaces" 105 | debug 1 "copied network/interfaces" 106 | fi 107 | 108 | # if we have public-keys, put them in cirros user 109 | if ds_get_item_path public-keys; then 110 | local keyfile="$_RET" 111 | ds_get_item public-keys || 112 | error "failed to get public-keys" 113 | mkdir -p "${TARGET_ROOT}/home/cirros" "${TARGET_ROOT}/root" 114 | HOME=$TARGET_ROOT/home/cirros su -c "ssh-add-key --replace -" cirros < "$keyfile" 115 | HOME=$TARGET_ROOT/root ssh-add-key --replace \ 116 | --prefix "$SSH_ROOT_PREFIX" - < "$keyfile" 117 | fi 118 | 119 | local name="" 120 | if [ -c /dev/urandom ]; then 121 | for name in random_seed random-seed; do 122 | if ds_has_item "$name"; then 123 | ds_cat_item "$name" > /dev/urandom && break 124 | fi 125 | done 126 | fi 127 | 128 | return 0 129 | } 130 | 131 | cirros_apply "$@" 132 | 133 | # vi: ts=4 noexpandtab 134 | -------------------------------------------------------------------------------- /bin/build-release: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | [ $# -eq 1 ] || { echo "must give version"; exit 1; } 4 | 5 | VER=$1 6 | pre=cirros-$VER 7 | BR_VER="2012.05" 8 | ARCHES="${ARCHES:-i386 x86_64 arm}" 9 | KVER="3.2.0-57.87"; 10 | 11 | set -e 12 | set -o pipefail 13 | 14 | out="$PWD/../build-$VER" 15 | export TMPDIR="$out/tmp" 16 | mkdir -p "$out" "$TMPDIR" 17 | 18 | echo "$(date): begin" >> "$out/date.txt"; 19 | echo "$(date): start download" >> "$out/date.txt"; 20 | 21 | rm -f download 22 | mkdir -p ../download 23 | ln -snf ../download download 24 | [ -f "download/buildroot-${BR_VER}.tar.gz" ] || 25 | wget "http://buildroot.uclibc.org/downloads/buildroot-${BR_VER}.tar.gz" \ 26 | -O "download/buildroot-${BR_VER}.tar.gz" 27 | 28 | rm -Rf "buildroot-${BR_VER}" 29 | rm -f buildroot 30 | tar -xvf download/buildroot-${BR_VER}.tar.gz 31 | ln -snf buildroot-${BR_VER} buildroot 32 | 33 | ./bin/mkcabundle > src/etc/ssl/certs/ca-certificates.crt 34 | 35 | ( cd buildroot && QUILT_PATCHES="$PWD/../patches-buildroot" quilt push -a ) 36 | 37 | echo "$(date): end download" >> "$out/date.txt"; 38 | echo "$(date): start br-source" >> "$out/date.txt"; 39 | make ARCH=i386 br-source 40 | echo "$(date): end br-source" >> "$out/date.txt"; 41 | 42 | echo "$(date): start kernel download" >> "$out/date.txt"; 43 | burl="https://launchpad.net/ubuntu/+archive/primary/+files/linux-image" 44 | for arch in ${ARCHES}; do 45 | xarch=$arch; flav="virtual" 46 | [ "$arch" = "x86_64" ] && xarch="amd64"; 47 | [ "$arch" = "arm" ] && xarch="armel" && flav="omap" 48 | url="$burl-${KVER%.*}-${flav}_${KVER}_${xarch}.deb" 49 | wget "$url" -O download/${url##*/} 50 | ln -sf ${url##*/} download/kernel-${arch}.deb 51 | done 52 | echo "$(date): end kernel download" >> "$out/date.txt"; 53 | 54 | for arch in ${ARCHES}; do 55 | echo "$(date): start $arch" >> "$out/date.txt"; 56 | time make ARCH=$arch "OUT_D=$out/build/$arch" 2>&1 | 57 | tee "$out/build-$arch.log"; 58 | done; 59 | echo "$(date): finish" >> "$out/date.txt" 60 | 61 | for arch in ${ARCHES}; do 62 | mkdir -p "$out/stage/$arch" 63 | done 64 | 65 | for arch in ${ARCHES}; do 66 | sudo ./bin/bundle -v "$out/build/$arch/rootfs.tar" \ 67 | ./download/kernel-$arch.deb "$out/stage/$arch"; 68 | done 69 | 70 | sudo chown -R $USER:$USER "$out/stage" 71 | 72 | mkdir -p "$out/release" 73 | 74 | srctgz="$out/release/cirros-$VER-source.tar.gz" 75 | bzr export -r "tag:$VER" --format=tgz --root="cirros=$VER" "$srctgz" 76 | echo "wrote source tgz: $srctgz" 77 | 78 | ( srcd="$PWD" && tmpd=$(mktemp -d) && cd "$tmpd" && 79 | bzr branch "$srcd" -r tag:$VER cirros-$VER && 80 | rm -Rf cirros-$VER/.bzr && 81 | tar cvzf - cirros-$VER ) > "$out/release/cirros-$VER-source.tar.gz" 82 | 83 | rm -f "$out/stage"/*/"$pre"* 84 | for arch in ${ARCHES}; do 85 | p=$pre-$arch 86 | ( cd "$out/stage/$arch" && 87 | ln kernel $p-vmlinuz && ln kernel $p-kernel && 88 | ln initramfs $p-initrd && ln initramfs $p-initramfs && 89 | ln part.img $p-rootfs.img && 90 | ln blank.img $p-blank.img && 91 | ln disk.img $p-disk.img && 92 | ln filesys.tar.gz $p-lxc.tar.gz && 93 | true 94 | ); done 95 | 96 | for arch in ${ARCHES}; do 97 | p=$pre-$arch 98 | ( cd "$out/stage/$arch" && 99 | cp $p-kernel $p-initramfs $p-lxc.tar.gz "$out/release/" && 100 | gzip -9 -c $p-rootfs.img > $out/release/$p-rootfs.img.gz ) && 101 | ( cd "$out/stage/$arch" && 102 | tar cvzf - $p-blank.img $p-vmlinuz $p-initrd ) > \ 103 | "$out/release/$p-uec.tar.gz" 104 | [ "$arch" = "arm" ] || 105 | cp "$out/stage/$arch/$p-disk.img" "$out/release/$p-disk.img" 106 | done 107 | 108 | mkdir "$out/release/buildroot_rootfs" 109 | for arch in ${ARCHES}; do 110 | t="$out/release/buildroot_rootfs/buildroot-$VER-$arch.tar" 111 | cp "$out/build/$arch/rootfs.tar" "$t" && gzip -9 "$t" 112 | done 113 | 114 | chmod u+rwX,go+rX -R "$out/release/"* 115 | 116 | sumfiles=$(cd "$out/release" && for f in *; do 117 | [ -f "$f" -a "$f" != MD5SUMS ] && echo "$f"; done) 118 | ( cd "$out/release" && md5sum $sumfiles > MD5SUMS ) 119 | 120 | echo "output in $out/release" 121 | echo "entire process took $SECONDS seconds" 122 | echo "$(date): finished [$SECONDS]" >> "$out/date.txt"; 123 | -------------------------------------------------------------------------------- /src/lib/cirros/ds/nocloud: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | VERBOSITY=1 4 | CONFIG="/etc/cirros-init/ds-nocloud" 5 | SEED_PRE_D="/var/lib/cloud/seed/nocloud-pre" 6 | SEED_POST_D="/var/lib/cloud/seed/nocloud" 7 | NAME="${0##*/}" 8 | LABEL="cidata" 9 | 10 | . ${CIRROS_SHLIB:=/lib/cirros/shlib} || 11 | { echo "failed to read ${CIRROS_SHLIB}" 1>&2; exit 1; } 12 | 13 | Usage() { 14 | cat < "${data_d}/instance-id" 85 | fi 86 | if [ -d "${data_d}/public-keys" ]; then 87 | # turn public-keys list into 88 | mv "${data_d}/public-keys" "${out_d}/public-keys-d"; 89 | set +f 90 | for f in "${out_d}/public-keys-d/"*; do 91 | [ -f "${f}" -a "${f##*/}" != "0" ] && cat "$f" 92 | done > "${data_d}/public-keys" 93 | set -f 94 | fi 95 | 96 | echo 0 > "$out_d/result" 97 | } 98 | 99 | apply() { 100 | local mode="$1" data_d="$2" 101 | # support copying 'files' if it happened to be on that disk 102 | if [ -d "$data_d/files" ]; then 103 | local omask="" f="" path="" tpath="" 104 | omask=$(umask) 105 | umask 0226 106 | for f in $(find "$data_d/files/" -type f); do 107 | path="${f#${data_d}/files/}" 108 | tpath="${TARGET_ROOT}/${path}" 109 | mkdir -p "${tpath%/*}" && cp "${f}" "${tpath}" || 110 | { error "failed to create ${tpath}"; return 1; } 111 | done 112 | umask "$omask" 113 | fi 114 | } 115 | 116 | short_opts="hv" 117 | long_opts="help,verbose" 118 | getopt_out=$(getopt --name "${0##*/}" \ 119 | --options "${short_opts}" --long "${long_opts}" -- "$@") && 120 | eval set -- "${getopt_out}" || 121 | bad_Usage 122 | 123 | while [ $# -ne 0 ]; do 124 | cur=${1}; next=${2}; 125 | case "$cur" in 126 | -h|--help) Usage ; exit 0;; 127 | -v|--verbose) VERBOSITY=$((${VERBOSITY}+1));; 128 | --) shift; break;; 129 | esac 130 | shift; 131 | done 132 | 133 | [ $# -eq 2 ] || bad_Usage "must provide mode and output dir" 134 | mode="$1" 135 | out_d="$2" 136 | 137 | [ "$mode" = "local" -o "$mode" = "apply-local" ] || 138 | { debug 2 "only supported in mode 'local'"; exit 0; } 139 | 140 | [ ! -e "$CONFIG" ] || . "$CONFIG" || 141 | fail "failed to read $CONFIG" 142 | 143 | if [ "$mode" = "local" ]; then 144 | search_local "$out_d" 145 | elif [ "$mode" = "apply-local" ]; then 146 | apply "$mode" "$out_d" 147 | else 148 | fail "error, unexpected input" 149 | fi 150 | 151 | exit 152 | # vi: ts=4 noexpandtab 153 | -------------------------------------------------------------------------------- /src/lib/cirros/ds/configdrive: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | VERBOSITY=0 4 | CONFIG=/etc/cirros-init/configdrive 5 | NAME="${0##*/}" 6 | LABEL="config-2" 7 | SEED_PRE_D="/var/lib/cloud/seed/configdrive-pre" 8 | SEED_POST_D="/var/lib/cloud/seed/configdrive" 9 | 10 | . ${CIRROS_SHLIB:=/lib/cirros/shlib} || 11 | { echo "failed to read ${CIRROS_SHLIB}" 1>&2; exit 1; } 12 | 13 | Usage() { 14 | cat < public-keys || rm public-keys 93 | set -f 94 | fi 95 | 96 | for fix in uuid:instance-id hostname:local-hostname user_data:user-data \ 97 | availability_zone:availability-zone launch_index:launch-index; do 98 | f="${fix%:*}" 99 | t="${fix#*:}" 100 | [ -f "$f" -a ! -f "$t" ] || continue 101 | ln -sf "$f" "$t" || fail "failed to link $f to $t" 102 | done 103 | 104 | # now create files/ tree 105 | cd "${start_d}" 106 | cd "${out_d}" 107 | local d path content_path omask 108 | omask=$(umask) 109 | umask 0226 110 | if [ -f processed/files/0 ]; then 111 | # processed/files/0 is the length 112 | set +f 113 | for d in processed/files/*; do 114 | [ "${d##*/}" = "0" ] && continue 115 | set -f 116 | [ -f "$d/path" -a -f "$d/content_path" ] || 117 | { debug 1 "$d unexpected file dir"; continue; } 118 | { read path < "$d/path" || [ -n "$path" ] ; } && 119 | { read content_path < "$d/content_path" || 120 | [ -n "$content_path" ]; } || 121 | { debug 1 "skipping $d, failed reads"; continue; } 122 | mkdir -p "files/${path%/*}" && 123 | cp "raw/openstack/${content_path}" "files/${path}" || 124 | { fail "failed to create ${path} in files"; return 1; } 125 | done 126 | set -f 127 | fi 128 | 129 | umask $omask 130 | 131 | cd "$start_d" 132 | echo 0 > "$out_d/result" 133 | } 134 | 135 | apply() { 136 | local mode="$1" data_d="$2" 137 | if [ -d "$data_d/files" ]; then 138 | local omask="" f="" path="" tpath="" 139 | omask=$(umask) 140 | umask 0226 141 | for f in $(find "$data_d/files/" -type f); do 142 | path="${f#${data_d}/files/}" 143 | tpath="${TARGET_ROOT}/${path}" 144 | mkdir -p "${tpath%/*}" && cp "${f}" "${tpath}" || 145 | { error "failed to create ${tpath}"; return 1; } 146 | done 147 | umask "$omask" 148 | fi 149 | } 150 | 151 | short_opts="hv" 152 | long_opts="help,verbose" 153 | getopt_out=$(getopt --name "${0##*/}" \ 154 | --options "${short_opts}" --long "${long_opts}" -- "$@") && 155 | eval set -- "${getopt_out}" || 156 | bad_Usage 157 | 158 | while [ $# -ne 0 ]; do 159 | cur=${1}; next=${2}; 160 | case "$cur" in 161 | -h|--help) Usage ; exit 0;; 162 | -v|--verbose) VERBOSITY=$((${VERBOSITY}+1));; 163 | --) shift; break;; 164 | esac 165 | shift; 166 | done 167 | 168 | [ $# -eq 2 ] || bad_Usage "must provide mode and output dir" 169 | mode="$1" 170 | out_d="$2" 171 | 172 | [ "$mode" = "local" -o "$mode" = "apply-local" ] || 173 | { debug 2 "only supported in mode 'local'"; exit 0; } 174 | 175 | [ ! -e "$CONFIG" ] || . "$CONFIG" || 176 | fail "failed to read $CONFIG" 177 | 178 | if [ "$mode" = "local" ]; then 179 | search_local "$out_d" 180 | elif [ "$mode" = "apply-local" ]; then 181 | apply "$mode" "$out_d" 182 | else 183 | fail "error, unexpected input" 184 | fi 185 | 186 | exit 187 | # vi: ts=4 noexpandtab 188 | -------------------------------------------------------------------------------- /bin/part2disk: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # part2disk - wrap a partition image in a disk image 3 | # 4 | # Copyright (C) 2010 Canonical Ltd. 5 | # 6 | # Authors: Scott Moser 7 | # 8 | # This program is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, version 3 of the License. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | 20 | DEF_CYLINDER_SIZE=16065 21 | DEF_SECTOR_SIZE=512 22 | DEBUG=0 23 | base_d=$(dirname $(readlink -f "${0}")) 24 | PATH="${PATH}:${base_d}" 25 | error() { echo "$@" 1>&2; } 26 | debug() { 27 | [ "${DEBUG}" -ge "${1:-0}" ] && shift || return 0; 28 | error "$@"; 29 | } 30 | fail() { [ $# -eq 0 ] || error "$@"; exit 1; } 31 | Usage() { 32 | cat <&2; fail "$@"; } 52 | human2bytes() { 53 | # converts size suitable for input to resize2fs to bytes 54 | # s:512 byte sectors, K:kilobytes, M:megabytes, G:gigabytes 55 | # none: block size of the image 56 | local input=${1} defunit=${2:-1024} 57 | local unit count; 58 | case "$input" in 59 | *s) count=${input%s}; unit=512;; 60 | *K) count=${input%K}; unit=1024;; 61 | *M) count=${input%M}; unit=$((1024*1024));; 62 | *G) count=${input%G}; unit=$((1024*1024*1024));; 63 | *) count=${input} ; unit=${2:-1024};; 64 | esac 65 | _RET=$((${count}*${unit})) 66 | } 67 | 68 | short_opts="b:c:Ghs:v" 69 | long_opts="bootcode:,grub1,grub,help,cylinder-size:,size:,verbose" 70 | getopt_out=$(getopt --name "${0##*/}" \ 71 | --options "${short_opts}" --long "${long_opts}" -- "$@") && 72 | eval set -- "${getopt_out}" || 73 | bad_Usage 74 | 75 | csize=${DEF_CYLINDER_SIZE} 76 | ssize=${DEF_SECTOR_SIZE} 77 | size_in="" 78 | bootcode="" 79 | grub_ptnum=1 80 | grub=0 81 | grub1=0 82 | while [ $# -ne 0 ]; do 83 | cur=${1}; next=${2}; 84 | case "$cur" in 85 | -b|--boot-code) bootcode="$2"; shift;; 86 | -c|--cylinder-size) csize=$2; shift;; 87 | -G|--grub) grub=1;; 88 | -G|--grub1) grub1=1;; 89 | -h|--help) Usage; exit 0;; 90 | -s|--size) size_in=$2; shift;; 91 | -v|--verbose) DEBUG=$((${DEBUG}+1));; 92 | --) shift; break;; 93 | esac 94 | shift; 95 | done 96 | 97 | [ $# -eq 2 ] || bad_Usage "must supply partition image and output file" 98 | 99 | pimg=${1} 100 | dimg=${2} 101 | 102 | { [ ${grub} -eq 0 ] || phelper=$(command -v part2disk-grubhelper); } || 103 | fail "no part2disk-grubhelper in PATH" 104 | [ $grub1 -eq 0 ] || command -v grub >/dev/null || fail "no 'grub' in path"; 105 | 106 | [ -f "${pimg}" -o -b "${pimg}" ] || fail "${pimg}: not a file or block device" 107 | 108 | if [ -b "${pimg}" ]; then 109 | kname=$(readlink -f "${pimg}") && 110 | pimg_s=$(awk '$4 == kn { print $3 * 1024 }' \ 111 | "kn=${kname##*/}" /proc/partitions) && 112 | [ -n "${pimg_s}" ] || 113 | fail "failed to read size of ${pimg} from /proc/partitions" 114 | else 115 | pimg_s=$(stat --format "%s" "${pimg}") || 116 | fail "failed to get size of ${pimg}" 117 | fi 118 | 119 | if [ -n "${size_in}" ]; then 120 | human2bytes "${size_in}" 1 || fail "failed to convert ${size_in} to bytes" 121 | size=${_RET} 122 | cylinders=$((${size}/(${csize}*${ssize}))) 123 | else 124 | # no size specified, get enough cylinders to fit part_img 125 | # get 1 full cylinder + any remainder 126 | cylinders=$((${pimg_s}/(${csize}*${ssize}) + 1)) 127 | [ "${pimg_s}" = "$((${csize}*${ssize}))" ] || cylinders=$((${cylinders}+1)) 128 | size=$((${cylinders}*${ssize}*${csize})) 129 | fi 130 | 131 | debug 1 "using ${cylinders} cylinders of ${csize} * ${ssize} = $((${cylinders}*${ssize}*${csize})) bytes" 132 | 133 | if [ -n "${bootcode}" ]; then 134 | [ -f "${bootcode}" ] || fail "${bootcode}: not a file" 135 | debug 1 "writing bootcode from ${bootcode}" 136 | zcat --force "${bootcode}" | dd of="${dimg}" 2>/dev/null || 137 | fail "failed to write from ${bootcode}" 138 | fi 139 | 140 | if [ ! -b "${dimg}" ]; then 141 | # truncate 1 cylinder of zeros 142 | debug 2 "truncating ${dimg} to 1 cylinder" 143 | dd if=/dev/zero of="${dimg}" \ 144 | seek="$((${csize}))" bs="${ssize}" count=0 2>/dev/null || 145 | fail "failed to write to ${dimg}" 146 | fi 147 | 148 | # copy partition image 149 | debug 1 "copying ${pimg} to partition in ${dimg}" 150 | dd if="${pimg}" conv=notrunc oflag=append of="${dimg}" 2>/dev/null || 151 | fail "failed to write ${pimg} into ${dimg}" 152 | 153 | # pad the output to round cylinder size. 154 | # we do this as a separate step from the copy so that the copy 155 | # can use whatever ibs or obs that dd thinks is appropriate 156 | if [ ! -b "${dimg}" ]; then 157 | debug 2 "padding size of ${pimg} to round cylinders" 158 | dd if="${pimg}" seek="$((${cylinders}*${csize}))" bs="${ssize}" \ 159 | count=0 of="${dimg}" 2>/dev/null || 160 | fail "failed to size ${dimg} to even cylinders" 161 | if [ $size -ne $((${cylinders}*${ssize}*${csize})) ]; then 162 | truncate --size "${size}" "${dimg}" || 163 | fail "failed to truncate ${dimg} to ${size}" 164 | fi 165 | fi 166 | 167 | debug 1 "writing partition table to ${dimg}" 168 | sfdisk_out=$(sfdisk -C "${cylinders}" "${dimg}" 2>&1 < 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, version 3 of the License. 9 | # 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with this program. If not, see . 17 | 18 | # the fudge factor. if its within this many 512 byte sectors, dont bother 19 | FUDGE=${GROWPART_FUDGE:-$((20*1024))} 20 | TEMP_D="" 21 | RESTORE_FROM="" 22 | VERBOSITY=0 23 | DISK="" 24 | 25 | error() { echo "$@" 1>&2; } 26 | fail() { [ $# -eq 0 ] || echo "FAILED:" "$@"; exit 1; } 27 | nochange() { echo "NOCHANGE:" "$@"; exit 0; } 28 | changed() { echo "CHANGED:" "$@"; exit 0; } 29 | cleanup() { 30 | if [ -n "${RESTORE_FROM}" ]; then 31 | error "***** WARNING: Resize failed, attempting to revert ******" 32 | if sfdisk "${DISK}" ${CHS} -I "${RESTORE_FROM}"; then 33 | error "***** Appears to have gone OK ****" 34 | else 35 | error "***** FAILED! or original partition table looked like: ****" 36 | cat "${RESTORE_HUMAN}" 1>&2 37 | fi 38 | fi 39 | [ -z "${TEMP_D}" -o ! -d "${TEMP_D}" ] || rm -Rf "${TEMP_D}" 40 | } 41 | debug() { 42 | local level=${1}; shift; 43 | [ "${level}" -gt "${VERBOSITY}" ] && return 44 | error "${@}" 45 | } 46 | mktemp_d() { 47 | # just a mktemp -d that doens't need mktemp if its not there. 48 | _RET=$(mktemp -d "${TMPDIR:-/tmp}/${0##*/}.XXXXXX" 2>/dev/null) && return 49 | _RET=$(umask 077 && t="${TMPDIR:-/tmp}/${0##*/}.$$" && mkdir "${t}" && 50 | echo "${t}") 51 | return 52 | } 53 | 54 | Usage() { 55 | cat <&2; error "$@"; exit 1; } 67 | 68 | #short_opts="hNv" 69 | #long_opts="help,dry-run,fudge:,verbose" 70 | #getopt_out=$(getopt --name "${0##*/}" \ 71 | # --options "${short_opts}" --long "${long_opts}" -- "$@") && 72 | # eval set -- "${getopt_out}" || 73 | # bad_Usage 74 | 75 | dry_run=0 76 | fudge=${FUDGE} 77 | disk="" 78 | part="" 79 | while [ $# -ne 0 ]; do 80 | cur=${1}; next=${2}; 81 | case "$cur" in 82 | -h|--help) Usage; exit 0;; 83 | --fudge) fudge=${next}; shift;; 84 | --dry-run) dry_run=1;; 85 | -v|--verbose) VERBOSITY=$(($VERBOSITY+1));; 86 | --) shift; break;; 87 | -*) fail "unknown option ${cur}";; 88 | *) 89 | if [ -z "${disk}" ]; then 90 | disk=${cur}; 91 | else 92 | [ -z "${part}" ] || fail "confused by arg ${cur}" 93 | part=${cur}; 94 | fi 95 | ;; 96 | esac 97 | shift; 98 | done 99 | 100 | [ -n "${disk}" ] || bad_Usage "must supply disk and partition-number" 101 | [ -n "${part}" ] || bad_Usage "must supply partition-number" 102 | 103 | [ -e "${disk}" ] || { fail "${disk}: does not exist"; } 104 | 105 | [ "${part#*[!0-9]}" = "${part}" ] || fail "partition-number must be a number" 106 | 107 | mktemp_d && TEMP_D="${_RET}" || fail "failed to make temp dir" 108 | trap cleanup EXIT 109 | 110 | change_out=${TEMP_D}/change.out 111 | change_err=${TEMP_D}/change.err 112 | dump_out=${TEMP_D}/dump.out 113 | new_out=${TEMP_D}/new.out 114 | dump_mod=${TEMP_D}/dump.mod 115 | tmp="${TEMP_D}/tmp.out" 116 | err="${TEMP_D}/err.out" 117 | orig_bin="${TEMP_D}/orig.save" 118 | RESTORE_HUMAN="${TEMP_D}/recovery" 119 | 120 | # --show-pt-geometry outputs something like 121 | # /dev/sda: 164352 cylinders, 4 heads, 32 sectors/track 122 | sfdisk "${disk}" --show-pt-geometry > "${tmp}" 2>"${err}" && 123 | read _devc cyl _word1 heads _word2 sectors _word3 < "${tmp}" && 124 | CHS="-C $cyl -H $heads -S $sectors" || 125 | fail "failed to get CHS from ${disk}" 126 | 127 | tot=$((${cyl}*${heads}*${sectors})) 128 | 129 | debug 1 "geometry is $CHS. total size=${tot}" 130 | sfdisk ${CHS} -uS -d "${disk}" > "${dump_out}" 2>"${err}" || 131 | fail "failed to dump sfdisk info for ${disk}" 132 | 133 | { 134 | echo "## sfdisk ${CHS} -uS -d ${disk}"; 135 | cat "${dump_out}" 136 | } > "${RESTORE_HUMAN}" 137 | [ $? -eq 0 ] || fail "failed to save sfdisk -d output" 138 | 139 | sed -e 's/,//g; s/start=/start /; s/size=/size /' "${dump_out}" > "${dump_mod}" 140 | 141 | dpart="${disk}${part}" # disk and partition number 142 | pt_start=$(awk '$1 == pt { print $4 }' "pt=${dpart}" < "${dump_mod}") && 143 | pt_size=$(awk '$1 == pt { print $6 }' "pt=${dpart}" < "${dump_mod}") && 144 | [ -n "${pt_start}" -a -n "${pt_size}" ] && 145 | pt_end=$((${pt_size}+${pt_start})) || 146 | fail "failed to get start and end for ${dpart} in ${disk}" 147 | 148 | # find the minimal starting location that is >= pt_end 149 | max_end=$(awk ' 150 | $3 == "start" { if($4 >= pt_end && $4 < min) { min = $4 } } 151 | END { printf("%s\n",min); }' \ 152 | min=${tot} pt_end=${pt_end} "${dump_mod}") && 153 | [ -n "${max_end}" ] || 154 | fail "failed to get max_end for partition ${part}" 155 | 156 | debug 1 "max_end=${max_end} tot=${tot} pt_end=${pt_end} pt_start=${pt_start} pt_size=${pt_size}" 157 | [ $((${pt_end})) -eq ${max_end} ] && 158 | nochange "partition ${part} is size ${pt_size}. it cannot be grown" 159 | [ $((${pt_end}+${fudge})) -gt ${max_end} ] && 160 | nochange "partition ${part} could only be grown by $((${max_end}-${pt_end})) [fudge=${fudge}]" 161 | 162 | # now, change the size for this partition in ${dump_out} to be the 163 | # new size 164 | new_size=$((${max_end}-${pt_start})) 165 | sed "\|^${dpart} |s/${pt_size},/${new_size},/" "${dump_out}" > "${new_out}" || 166 | fail "failed to change size in output" 167 | 168 | change_info="partition=${part} start=${pt_start} old: size=${pt_size} end=${pt_end} new: size=${new_size},end=${max_end}" 169 | if [ $dry_run -ne 0 ]; then 170 | echo "CHANGE: ${change_info}" 171 | { 172 | echo "# === old sfdisk -d ===" 173 | cat "${dump_out}" 174 | echo "# === new sfdisk -d ===" 175 | cat "${new_out}" 176 | } 1>&2 177 | exit 0 178 | fi 179 | 180 | sfdisk "${disk}" ${CHS} --force -O "${orig_bin}" \ 181 | < "${new_out}" > "${change_out}" 2> "${change_err}" || { 182 | DISK=${disk}; RESTORE_FROM="${orig_bin}"; 183 | fail "failed to resize" 184 | } 185 | changed "${change_info}" 186 | 187 | # dump_out looks something like: 188 | ## partition table of /tmp/out.img 189 | #unit: sectors 190 | # 191 | #/tmp/out.img1 : start= 1, size= 48194, Id=83 192 | #/tmp/out.img2 : start= 48195, size= 963900, Id=83 193 | #/tmp/out.img3 : start= 1012095, size= 305235, Id=82 194 | #/tmp/out.img4 : start= 1317330, size= 771120, Id= 5 195 | #/tmp/out.img5 : start= 1317331, size= 642599, Id=83 196 | #/tmp/out.img6 : start= 1959931, size= 48194, Id=83 197 | #/tmp/out.img7 : start= 2008126, size= 80324, Id=83 198 | 199 | # vi: ts=4 noexpandtab 200 | -------------------------------------------------------------------------------- /patches-buildroot/nfs-utils-enable-nfsv4.patch: -------------------------------------------------------------------------------- 1 | package/Config.in | 1 + 2 | package/libnfsidmap/Config.in | 6 ++++++ 3 | package/libnfsidmap/libnfsidmap.mk | 14 ++++++++++++++ 4 | package/nfs-utils/S60nfs | 20 +++++++++++++++----- 5 | package/nfs-utils/etc-idmapd.conf | 11 +++++++++++ 6 | package/nfs-utils/nfs-utils.mk | 11 +++++++++-- 7 | package/rpcbind/S50rpcbind | 34 ++++++++++++++++++++++++++++++++++ 8 | package/rpcbind/rpcbind.mk | 7 +++++++ 9 | 8 files changed, 97 insertions(+), 7 deletions(-) 10 | create mode 100644 package/libnfsidmap/Config.in 11 | create mode 100644 package/libnfsidmap/libnfsidmap.mk 12 | create mode 100644 package/nfs-utils/etc-idmapd.conf 13 | create mode 100755 package/rpcbind/S50rpcbind 14 | 15 | diff --git a/package/Config.in b/package/Config.in 16 | index fca61d6..44c22c0 100644 17 | --- a/package/Config.in 18 | +++ b/package/Config.in 19 | @@ -675,6 +675,7 @@ source "package/libnetfilter_cttimeout/Config.in" 20 | source "package/libnetfilter_log/Config.in" 21 | source "package/libnetfilter_queue/Config.in" 22 | source "package/libnfnetlink/Config.in" 23 | +source "package/libnfsidmap/Config.in" 24 | source "package/libnftnl/Config.in" 25 | source "package/libnl/Config.in" 26 | source "package/liboauth/Config.in" 27 | diff --git a/package/libnfsidmap/Config.in b/package/libnfsidmap/Config.in 28 | new file mode 100644 29 | index 0000000..2957a40 30 | --- /dev/null 31 | +++ b/package/libnfsidmap/Config.in 32 | @@ -0,0 +1,6 @@ 33 | +config BR2_PACKAGE_LIBNFSIDMAP 34 | + bool "libnfsidmap" 35 | + help 36 | + libnfsidmap is a helper lib for NFSv4 to map IDs 37 | + 38 | + http://www.citi.umich.edu/projects/nfsv4/linux/libnfsidmap 39 | diff --git a/package/libnfsidmap/libnfsidmap.mk b/package/libnfsidmap/libnfsidmap.mk 40 | new file mode 100644 41 | index 0000000..58fa426 42 | --- /dev/null 43 | +++ b/package/libnfsidmap/libnfsidmap.mk 44 | @@ -0,0 +1,14 @@ 45 | +################################################################################ 46 | +# 47 | +# libnfsidmap 48 | +# 49 | +################################################################################ 50 | + 51 | +LIBNFSIDMAP_VERSION = 0.25 52 | +LIBNFSIDMAP_SITE = http://www.citi.umich.edu/projects/nfsv4/linux/libnfsidmap 53 | +LIBNFSIDMAP_SOURCE = libnfsidmap-$(LIBNFSIDMAP_VERSION).tar.gz 54 | +LIBNFSIDMAP_INSTALL_STAGING = YES 55 | +LIBNFSIDMAP_LICENSE = BSD-like 56 | +LIBNFSIDMAP_LICENSE_FILES = COPYING 57 | + 58 | +$(eval $(autotools-package)) 59 | diff --git a/package/nfs-utils/S60nfs b/package/nfs-utils/S60nfs 60 | index 49dab70..3297de9 100755 61 | --- a/package/nfs-utils/S60nfs 62 | +++ b/package/nfs-utils/S60nfs 63 | @@ -23,9 +23,18 @@ touch /var/lib/nfs/xtab 64 | 65 | start() { 66 | # Start daemons. 67 | + echo -n "Starting NFS idmapd: " 68 | + pipefs_dir="`sed -n 's/^ *Pipefs-Directory *= *//p' /etc/idmapd.conf`" 69 | + mount | grep -q "on $pipefs_dir type rpc_pipefs" 70 | + if ! [ $? -eq 0 ]; then 71 | + mkdir -p "$pipefs_dir" 72 | + mount -t rpc_pipefs sunrpc "$pipefs_dir" 73 | + fi 74 | + rpc.idmapd 75 | + echo "done" 76 | + 77 | echo -n "Starting NFS statd: " 78 | rpc.statd 79 | - touch /var/lock/subsys/nfslock 80 | echo "done" 81 | 82 | echo -n "Starting NFS services: " 83 | @@ -40,11 +48,16 @@ start() { 84 | echo -n "Starting NFS mountd: " 85 | rpc.mountd 86 | echo "done" 87 | - touch /var/lock/subsys/nfs 88 | } 89 | 90 | stop() { 91 | # Stop daemons. 92 | + echo -n "Shutting down NFS idmapd: " 93 | + pipefs_dir="`sed -n 's/^ *Pipefs-Directory *= *//p' /etc/idmapd.conf`" 94 | + umount "$pipefs_dir" 95 | + killall -q rpc.idmapd 96 | + echo "done" 97 | + 98 | echo -n "Shutting down NFS mountd: " 99 | killall -q rpc.mountd 100 | echo "done" 101 | @@ -55,14 +68,12 @@ stop() { 102 | 103 | echo -n "Shutting down NFS services: " 104 | /usr/sbin/exportfs -au 105 | - rm -f /var/lock/subsys/nfs 106 | killall -q rpc.statd 107 | echo "done" 108 | 109 | echo -n "Stopping NFS statd: " 110 | killall -q rpc.statd 111 | echo "done" 112 | - rm -f /var/lock/subsys/nfslock 113 | } 114 | 115 | # See how we were called. 116 | @@ -79,7 +90,6 @@ case "$1" in 117 | ;; 118 | reload) 119 | /usr/sbin/exportfs -r 120 | - touch /var/lock/subsys/nfs 121 | ;; 122 | *) 123 | echo "Usage: nfs {start|stop|reload}" 124 | diff --git a/package/nfs-utils/etc-idmapd.conf b/package/nfs-utils/etc-idmapd.conf 125 | new file mode 100644 126 | index 0000000..af5c233 127 | --- /dev/null 128 | +++ b/package/nfs-utils/etc-idmapd.conf 129 | @@ -0,0 +1,11 @@ 130 | +[General] 131 | + 132 | +Verbosity = 0 133 | +Pipefs-Directory = /run/rpc_pipefs 134 | +# set your own domain here, if id differs from FQDN minus hostname 135 | +# Domain = localdomain 136 | + 137 | +[Mapping] 138 | + 139 | +Nobody-User = nobody 140 | +Nobody-Group = nogroup 141 | diff --git a/package/nfs-utils/nfs-utils.mk b/package/nfs-utils/nfs-utils.mk 142 | index 76face5..ed9eb1a 100644 143 | --- a/package/nfs-utils/nfs-utils.mk 144 | +++ b/package/nfs-utils/nfs-utils.mk 145 | @@ -13,14 +13,19 @@ NFS_UTILS_DEPENDENCIES = host-pkgconf 146 | NFS_UTILS_CONF_ENV = knfsd_cv_bsd_signals=no 147 | 148 | NFS_UTILS_CONF_OPT = \ 149 | - --disable-nfsv4 \ 150 | - --disable-nfsv41 \ 151 | --disable-gss \ 152 | --disable-uuid \ 153 | --disable-ipv6 \ 154 | --without-tcp-wrappers \ 155 | --with-rpcgen=internal 156 | 157 | +ifeq ($(BR2_PACKAGE_LIBNFSIDMAP),y) 158 | +NFS_UTILS_DEPENDENCIES += libnfsidmap lvm2 159 | +NFS_UTILS_CONF_OPT += --enable-nfsv4 --enable-nfsv41 160 | +else 161 | +NFS_UTILS_CONF_OPT += --disable-nfsv4 --disable-nfsv41 162 | +endif 163 | + 164 | NFS_UTILS_TARGETS_$(BR2_PACKAGE_NFS_UTILS_RPCDEBUG) += usr/sbin/rpcdebug 165 | NFS_UTILS_TARGETS_$(BR2_PACKAGE_NFS_UTILS_RPC_LOCKD) += usr/sbin/rpc.lockd 166 | NFS_UTILS_TARGETS_$(BR2_PACKAGE_NFS_UTILS_RPC_RQUOTAD) += usr/sbin/rpc.rquotad 167 | @@ -35,6 +40,8 @@ endif 168 | define NFS_UTILS_INSTALL_FIXUP 169 | $(INSTALL) -m 0755 package/nfs-utils/S60nfs \ 170 | $(TARGET_DIR)/etc/init.d/S60nfs 171 | + $(INSTALL) -m 0644 package/nfs-utils/etc-idmapd.conf \ 172 | + $(TARGET_DIR)/etc/idmapd.conf 173 | rm -f $(NFS_UTILS_TARGETS_) 174 | endef 175 | 176 | diff --git a/package/rpcbind/S50rpcbind b/package/rpcbind/S50rpcbind 177 | new file mode 100755 178 | index 0000000..73f87f4 179 | --- /dev/null 180 | +++ b/package/rpcbind/S50rpcbind 181 | @@ -0,0 +1,34 @@ 182 | +#!/bin/sh 183 | + 184 | +start() { 185 | + # Start daemons. 186 | + echo -n "Starting rpcbind: " 187 | + rpcbind 188 | + echo "done" 189 | +} 190 | + 191 | +stop() { 192 | + # Stop daemons. 193 | + echo -n "Stopping rpcbind: " 194 | + killall -q rpc.mountd 195 | + echo "done" 196 | +} 197 | + 198 | +# See how we were called. 199 | +case "$1" in 200 | + start) 201 | + start 202 | + ;; 203 | + stop) 204 | + stop 205 | + ;; 206 | + restart) 207 | + stop 208 | + start 209 | + ;; 210 | + *) 211 | + echo "Usage: rpcbind {start|stop|reload}" 212 | + exit 1 213 | +esac 214 | + 215 | +exit 0 216 | diff --git a/package/rpcbind/rpcbind.mk b/package/rpcbind/rpcbind.mk 217 | index 19bdace..95bc491 100644 218 | --- a/package/rpcbind/rpcbind.mk 219 | +++ b/package/rpcbind/rpcbind.mk 220 | @@ -15,4 +15,11 @@ RPCBIND_CONF_ENV += \ 221 | CFLAGS="$(TARGET_CFLAGS) -I$(STAGING_DIR)/usr/include/tirpc/" 222 | RPCBIND_DEPENDENCIES += libtirpc 223 | 224 | +define RPCBIND_INSTALL_FIXUP 225 | + $(INSTALL) -m 0755 package/rpcbind/S50rpcbind \ 226 | + $(TARGET_DIR)/etc/init.d/S50rpcbind 227 | +endef 228 | + 229 | +RPCBIND_POST_INSTALL_TARGET_HOOKS += RPCBIND_INSTALL_FIXUP 230 | + 231 | $(eval $(autotools-package)) 232 | -------------------------------------------------------------------------------- /src/lib/cirros/shlib: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -f 3 | 4 | CR=" 5 | " 6 | 7 | error() { echo "$@" 1>&2; } 8 | fail() { [ $# -eq 0 ] || error "$@"; exit 1; } 9 | 10 | bad_Usage() { Usage 1>&2; [ $# -eq 0 ] || error "$@"; return 1; } 11 | read_uptime() { 12 | local idle 13 | { read _RET idle /dev/null 2>&1 || _RET="" 14 | } 15 | 16 | time_call() { 17 | local start="$1" end="$2" ret="" delta="" 18 | read_uptime 19 | start="${_RET%.*}${_RET#*.}" 20 | "$@" 21 | ret=$? 22 | read_uptime 23 | end="${_RET%.*}${_RET#*.}" 24 | delta=$(($end-$start)) 25 | t=${delta%??} 26 | _RET_TIME="$t.${delta#${t}}" 27 | return $ret 28 | } 29 | 30 | 31 | debug() { 32 | local level=${1}; shift; 33 | [ "${level}" -gt "${VERBOSITY}" ] && return 34 | error "${@}" 35 | } 36 | 37 | net_get_gateway() { 38 | _RET=$(route -n | awk '$1 == "0.0.0.0" && $2 != "0.0.0.0" { print $2 }') 39 | } 40 | net_get_nameservers() { 41 | local gw nslist 42 | local t1 t2 t3 nslist="" ns="" 43 | while read t1 t2 t3; do 44 | case "$t1" in 45 | nameserver) nslist="${nslist} ${t2}";; 46 | esac 47 | done < /etc/resolv.conf 48 | _RET="$nslist" 49 | } 50 | 51 | check_ping_gateway() { 52 | local gw="$1" 53 | [ -z "$gw" ] && net_get_gateway && gw=$_RET 54 | [ -n "$gw" ] || { debug 2 "No gateway found"; return 1; } 55 | ping -c 1 $gw -W 3 >/dev/null 2>&1 56 | } 57 | 58 | debug_connection() { 59 | local gw="" 60 | 61 | echo "############ debug start ##############" 62 | echo "### /etc/init.d/sshd start" 63 | /etc/init.d/sshd start 64 | net_get_gateway && gw=$_RET 65 | echo "### ifconfig -a" 66 | ifconfig -a 67 | echo "### route -n" 68 | route -n 69 | echo "### cat /etc/resolv.conf" 70 | cat /etc/resolv.conf 71 | if [ -n "${gw}" ]; then 72 | echo "### ping -c 5 ${gw}" 73 | ping -c 5 ${gw} 74 | else 75 | echo "### gateway not found" 76 | fi 77 | local t1 t2 t3 nslist="" ns="" 78 | while read t1 t2 t3; do 79 | case "$t1" in 80 | nameserver) nslist="${nslist} ${t2}";; 81 | esac 82 | done < /etc/resolv.conf 83 | echo "### pinging nameservers" 84 | for ns in ${nslist}; do 85 | echo "#### ping -c 5 ${ns}" 86 | ping -c 5 ${ns} 87 | done 88 | echo "### uname -a" 89 | uname -a 90 | lxc-is-container || { echo "### lsmod"; lsmod; } 91 | echo "### dmesg | tail" 92 | dmesg | tail 93 | echo "### tail -n 25 /var/log/messages" 94 | tail -n 25 /var/log/messages 95 | echo "############ debug end ##############" 96 | } 97 | 98 | mount_callback_umount() { 99 | # dev, opts, callback, args 100 | local dev="$1" opts="$2" callback="$3" ret="" 101 | local tmpd=$(mktemp -d "${TMPDIR:-/tmp}/${0##*/}.mp.XXXXXX") 102 | mount "$dev" $opts "$tmpd" || { 103 | ret=$?; 104 | debug 2 "failed mount $dev"; 105 | rmdir "$tmpd" 106 | return $ret; 107 | } 108 | shift 3; 109 | "$callback" "$tmpd" "$@" 110 | ret=$? 111 | umount "$tmpd" || { 112 | ret=$?; 113 | debug 1 "failed umount $dev"; 114 | return $ret; 115 | } 116 | rmdir "$tmpd" 117 | return 0 118 | } 119 | 120 | find_devs_with() { 121 | # return a list of devices that match filter 122 | # where filter is like: 123 | # TYPE= 124 | # LABEL=