On Wed, Feb 12, 2020 at 06:10:53PM +0000, Steve McIntyre wrote: > Russ Allbery wrote: > >If we go down this path, can we make cross-grading a supported feature for > >the next stable release? I'm sure I'm not the only one who is stuck with > >continuously-upgraded i386 hosts who has been wanting to switch but has > >been waiting until cross-grading is a little bit less scary. > > ACK - I've heard quite a few people asking for this over the last few > years. I've personally cross-graded a couple of systems (and my home > server has moved twice, i386->amd64->arm64), but it's not for the > faint-hearted. > > /me ponders - this could be a fun task for a GSoC/outreachy student to > hack on, maybe?
Prior art: * my unfinished https://github.com/kilobyte/crossgrade -- does a lot of error checking and continue-after-problem, but currently stops after crossgrading the essential set * stuff linked from https://wiki.debian.org/CrossGrading Problems: * crossgrades fail _badly_ in a hard to recover way if packages for the two architectures come in different versions (including binNMUs). This hurts especially if -ports archs are involved. * arch-specific or local packages are not as bad but 1. crossgrade must know what's safe to remove, 2. what should be left unchanged (and their recursive deps unremoved), 3. there may be non-multiarchable packages within 1. or 2.'s dependency chain * systemd can't handle being crossgraded (I'm a systemd hater, but same was noticed by eg. anarcat and Simon Richter). On a minimal system it may survive but usually it starts killing daemons (including X), unmounting stuff, choking and forcing an unclean reboot, etc. This could be worked around by: • switching to sysvinit • booting from a different media then chrooting to crossgrade (not for ordinary users unless it's eg. scripted from d-i) • having a package bring a grub entry that boots with init=/usr/sbin/crossgrade to do the thing? Meow! -- ⢀⣴⠾⠻⢶⣦⠀ .globl _start↵.data↵rc: .ascii "/etc/init.d/rcS\0"↵.text↵_start ⣾⠁⢰⠒⠀⣿⡁ mov $57,%rax↵syscall↵cmp $0,%rax↵jne child↵parent:↵mov $61,%rax ⢿⡄⠘⠷⠚⠋⠀ mov $-1,%rdi↵xor %rsi,%rsi↵xor %rdx,%rdx↵syscall↵jmp parent↵child: ⠈⠳⣄⠀⠀⠀⠀ mov $59,%rax↵mov $rc,%rdi↵xor %rsi,%rsi↵xor %rdx,%rdx↵syscall