2016-07-19 2:44 GMT+02:00 Daniel Golle <dan...@makrotopia.org>: > Hi Etienne, > Hi Arjen, > Hi John, > Hi Jo,
Hi Daniel > > while wondering which process is blocking my rootfs from being > unmounted for sysupgrade I discovered that getrandom story going > on and while waiting for blocking I/O read from /dev/urandom, it > even ignored any TERM or KILL signals. In my test (x86_64 vm), all INT TERM KILL are enough to kill getrandom (i've also checked with strace) Can you verify that "killall getrandom" is enough on your device > This then prevented the rootfs from unmounting and thus the ubi > device from detaching. The sysupgrade script, however, seems not to > care about that and just started ubiformat anyway and managed to > format and flash most of the NAND -- and by doing to, filling up the > random pool, which then resulted in /etc/urandom.seed being created > and ruining what was just written. If it wasn't for the serial > console being already hooked up, the device would have been bricked. > Please be more careful when making such fundamental changes such > as this one. Btw, it also prevents reboot until random seed is > written. The init process is blocked waiting for getrandom which break many things (including halt/reboot) I'm sending a patch to use procd so it doesn't block anymore > Please fix getrandom to be more graceful and use non-blocking reads > with (delayed) retries or something like that. > > Cheers > > Daniel > > > On Tue, Jun 28, 2016 at 12:55:57PM +0200, Etienne Champetier wrote: >> Hi Arjen, >> >> 2016-06-28 11:52 GMT+02:00 Arjen de Korte <arjen+l...@de-korte.org>: >> > Citeren John Crispin <j...@phrozen.org>: >> > >> >> On 28/06/2016 10:28, Jo-Philipp Wich wrote: >> >>> >> >>> Hi Etienne, >> >>> >> >>> I like this approach, fine with me now. >> >>> >> >> >> >> same here, we could not also consider adding a uci-defaults script that >> >> check if rootfs is on a mtd or real lbock device and change the default >> >> during firstboot, but i guess that would be a new patch. i have just >> >> pulled this into my staging tree >> > >> > >> > Would it be useful to list /etc/urandom.seed in >> > package/base-files/files/lib/upgrade/keep.d/base-files-essential to keep on >> > sysupgrade? Or would this break if the file does not exist? In that case, >> > it >> > might be useful to make a note to add it to /etc/sysupgrade.conf if the >> > contents should be kept on upgrades. >> > >> >> We can keep /etc/urandom.seed on upgrade, be we shouldn't include it >> in config backup >> >> > >> >>> On 06/27/2016 05:53 PM, Etienne CHAMPETIER wrote: >> >>>> >> >>>> This commit: >> >>>> 1) seed /dev/urandom with the saved seeds as early as possible >> >>>> (see /lib/preinit/81_urandom_seed) >> >>>> 2) save a seed at /etc/urandom.seed if it doesn't exists >> >>>> 3) save a new seed each boot at "system.@system[0].urandom_seed" >> >>>> (see /etc/init.d/urandom_seed) >> >>>> >> >>>> We use getrandom() so we are sure /dev/urandom pool is initialized >> >>>> >> >>>> Seed size is 512 bytes (ie /proc/sys/kernel/random/poolsize / 8) >> >>>> it's the same size as in ubuntu 14.04 and all systemd systems >> >>>> >> >>>> Seeding /dev/urandom doesn't change entropy estimation, so we still have >> >>>> "random: ubus urandom read with 4 bits of entropy available" >> >>>> messages in the logs, but we can now ignore them if >> >>>> after "urandom-seed: Seeding with ..." message >> >>>> >> >>>> Saving a new seed on each boot is disabled by default to avoid too much >> >>>> writes without user consent >> >>>> >> >>>> v2: log preinit messages to /dev/kmsg >> >>>> v3: use non generic function name for logging, as /lib/preinit/ files >> >>>> are all sourced together in /etc/preinit >> >>>> v4: after a lot of discussion on the ML, use a uci config param >> >>>> v5: config param is now the path of the seed >> >>>> >> >>>> Signed-off-by: Etienne CHAMPETIER <champetier.etie...@gmail.com> >> >>> >> >>> Acked-by: Jo-Philipp Wich <j...@mein.io> >> >>>> >> >>>> --- >> >>>> package/base-files/files/bin/config_generate | 1 + >> >>>> package/base-files/files/etc/init.d/urandom_seed | 29 >> >>>> ++++++++++++++++++++++ >> >>>> .../base-files/files/lib/preinit/81_urandom_seed | 24 >> >>>> ++++++++++++++++++ >> >>>> 3 files changed, 54 insertions(+) >> >>>> create mode 100755 package/base-files/files/etc/init.d/urandom_seed >> >>>> create mode 100644 package/base-files/files/lib/preinit/81_urandom_seed >> >>>> >> >>>> diff --git a/package/base-files/files/bin/config_generate >> >>>> b/package/base-files/files/bin/config_generate >> >>>> index 8002bc4..c0ba0fb 100755 >> >>>> --- a/package/base-files/files/bin/config_generate >> >>>> +++ b/package/base-files/files/bin/config_generate >> >>>> @@ -230,6 +230,7 @@ generate_static_system() { >> >>>> set system.@system[-1].timezone='UTC' >> >>>> set system.@system[-1].ttylogin='0' >> >>>> set system.@system[-1].log_size='64' >> >>>> + set system.@system[-1].urandom_seed='0' >> >>>> >> >>>> delete system.ntp >> >>>> set system.ntp='timeserver' >> >>>> diff --git a/package/base-files/files/etc/init.d/urandom_seed >> >>>> b/package/base-files/files/etc/init.d/urandom_seed >> >>>> new file mode 100755 >> >>>> index 0000000..cb2eb44 >> >>>> --- /dev/null >> >>>> +++ b/package/base-files/files/etc/init.d/urandom_seed >> >>>> @@ -0,0 +1,29 @@ >> >>>> +#!/bin/sh /etc/rc.common >> >>>> + >> >>>> +START=99 >> >>>> + >> >>>> +EXTRA_COMMANDS="save" >> >>>> + >> >>>> +_log() { >> >>>> + logger -t urandom_seed "$1" >> >>>> +} >> >>>> + >> >>>> +_save() { >> >>>> + touch $1.tmp || { _log "touch $1 failed"; return; } >> >>>> + chown root:root $1.tmp || { _log "chown $1 failed"; return; } >> >>>> + chmod 600 $1.tmp || { _log "chmod $1 failed"; return; } >> >>>> + getrandom 512 > $1.tmp || { _log "getrandom failed"; return; } >> >>>> + mv $1.tmp $1 || { _log "mv $1 failed"; return; } >> >>>> +} >> >>>> + >> >>>> +save() { >> >>>> + SEED="$(uci -q get system.@system[0].urandom_seed)" >> >>>> + [ "${SEED:0:1}" == "/" ] && _save "$SEED" && _log "Seed saved >> >>>> ($SEED)" >> >>>> + >> >>>> + SEED=/etc/urandom.seed >> >>>> + [ ! -f $SEED ] && _save "$SEED" && _log "Seed saved ($SEED)" >> >>>> +} >> >>>> + >> >>>> +boot() { >> >>>> + save >> >>>> +} >> >>>> diff --git a/package/base-files/files/lib/preinit/81_urandom_seed >> >>>> b/package/base-files/files/lib/preinit/81_urandom_seed >> >>>> new file mode 100644 >> >>>> index 0000000..10878f3 >> >>>> --- /dev/null >> >>>> +++ b/package/base-files/files/lib/preinit/81_urandom_seed >> >>>> @@ -0,0 +1,24 @@ >> >>>> +#!/bin/sh >> >>>> + >> >>>> +log_urandom_seed() { >> >>>> + echo "urandom-seed: $1" > /dev/kmsg >> >>>> +} >> >>>> + >> >>>> +_do_urandom_seed() { >> >>>> + [ -f "$1" ] || { log_urandom_seed "Seed file not found ($1)"; >> >>>> return; } >> >>>> + [ -O "$1" -a -G "$1" -a ! -x "$1" ] || { log_urandom_seed "Wrong >> >>>> owner / permissions for $1"; return; } >> >>>> + >> >>>> + log_urandom_seed "Seeding with $1" >> >>>> + cat "$1" > /dev/urandom >> >>>> +} >> >>>> + >> >>>> +do_urandom_seed() { >> >>>> + [ -c /dev/urandom ] || { log_urandom_seed "Something is wrong with >> >>>> /dev/urandom"; return; } >> >>>> + >> >>>> + _do_urandom_seed "/etc/urandom.seed" >> >>>> + >> >>>> + SEED="$(uci -q get system.@system[0].urandom_seed)" >> >>>> + [ "${SEED:0:1}" == "/" -a "$SEED" != "/etc/urandom.seed" ] && >> >>>> _do_urandom_seed "$SEED" >> >>>> +} >> >>>> + >> >>>> +boot_hook_add preinit_main do_urandom_seed >> >>>> >> >>> >> >>> >> >> _______________________________________________ >> Lede-dev mailing list >> Lede-dev@lists.infradead.org >> http://lists.infradead.org/mailman/listinfo/lede-dev _______________________________________________ Lede-dev mailing list Lede-dev@lists.infradead.org http://lists.infradead.org/mailman/listinfo/lede-dev