Tiny Core Linux Customization
Overview
Brief notes for the Tiny Core Linux rescue Kernel; customized and minimized to a 25MB; containing many useful administrative utilities; very useful for rescue, offline cold backups, restores, troubleshooting boot problems, disaster recovery. It can launch from a local Linux boot loader, an external USB hard disk, or a USB stick, or a virtual/physical CDROM ISO. The distro is very well maintained with the latest kernels. The Tiny Core Linux Team did a great job with this mini distro and the Linux community celebrates their work.
Main site: http://tinycorelinux.net/
The utilities that I most used: LVM, mount, sshd, rsync, scp, netcat, netstat, tar, chroot.
Download
http://tinycorelinux … yCorePure64-11.0.iso [28MB]
GRUB2 Boot
Add to an existing GRUB2 system, to enable rescue boot from a regular local hard disk. Copy the Tiny Core kernel and ramdisk:
# mount -o loop TinyCorePure64-11.0.iso /mnt # mkdir -p /boot/tce/optional # cp /mnt/boot/vmlinuz64 /boot/tcvmlinuz64 # cp /mnt/boot/corepure64.gz /boot/tccorepure64.gz # cp -r /mnt/boot/cde/* /boot/tce/ # chmod 0444 /boot/tcvmlinuz64 # chmod 0444 tccorepure64.gz # chmod 0750 /boot/tce
Add the GRUB2 entry:
# cat /etc/grub.d/40_custom menuentry "Tiny Core 11.1 Rescue" { linux /tcvmlinuz64 noswap nozswap nohdcp superuser vga=791 tz=GM-5 host=foo initrd /tccorepure64.gz }
Rebuild the GRUB2 configuration, then test it:
# grub2-mkconfig -o /boot/grub2/grub.cfg # reboot
Legacy GRUB Boot
For older Legacy GRUB copy the /boot files as above, then create the boot stanza as follows. NOTE: The EFI path can be /boot/efi/EFI/grub.conf.
# cat /boot/grub/menu.lst ... title TC Rescue root (hd0,0) kernel /tcvmlinuz64 vga=791 noswap nozswap tz=GM-5 superuser initrd /tccorepure64.gz
Prefered Extensions
Copy the extensions suitable for your own rescue scenario. For my needs I select SSHD, LVM, rsync, squashfs-tools., Follow the logic.
# cd /boot/tce/optional/ # LIST=" acl.tcz attr.tcz exfat-fuse.tcz exfat-utils.tcz fuse3.tcz fuse.tcz glib2.tcz liblvm2.tcz liblzma.tcz libzstd.tcz lvm2.tcz lzo.tcz mdadm.tcz ncursesw-dev.tcz ncursesw.tcz openssh.tcz openssl-1.1.1.tcz pcre.tcz popt.tcz raid-dm-5.4.3-tinycore64.tcz readline.tcz rsync.tcz squashfs-tools.tcz sshd_config sshfs.tcz udev-lib.tcz " # cd /boot/tce/optional # for a in $LIST ; do wget http://tinycorelinux.net/11.x/x86_64/tcz/$a ; done
Add the extensions to the onboot file and initialize the data file. Reboot and test.
# ls -l *.tcz | awk '{print $NF}' > ../onboot.lst # touch /mnt/tmp/tce/mydata.tgz # reboot
Configure SSHD
# cd /usr/local/etc/ssh/ # echo " Port 22 HostKey /usr/local/etc/ssh/ssh_host_rsa_key PermitRootLogin yes AuthorizedKeysFile .ssh/authorized_keys Subsystem sftp /usr/local/lib/openssh/sftp-server " >> sshd_config
Create the new system keys and start sshd.
# ssh-keygen -f ssh_host_rsa_key -N '' -t rsa # /usr/local/sbin/sshd -p 22
Copy the files for later use:
# blkid # mount /dev/sdX1 /mnt/sdX1 # cp /usr/local/etc/ssh/ssh* /mnt/sdX1/tce/optional/
Configure Startup
Set the configuration files on every boot. Follow the logic
# echo " #!/bin/sh #pkill udhcpc #ifconfig eth0 192.168.1.200 netmask 255.255.255.0 #route add default gw 192.168.1.1 HD=`mount | grep mnt | awk '{print $3}'` cp $HD/tce/optional/sshd_config /usr/local/etc/ssh/sshd_config cp $HD/tce/optional/ssh_host_rsa* /usr/local/etc/ssh/ chmod 0600 /usr/local/etc/ssh/ssh_* /usr/local/sbin/sshd echo "root:welcome" | chpasswd #vgscan #vgchange -ay " >> /opt/bootlocal.sh
Save the settings:
# filetool.sh -b
NOTE: Another alternative about persistent configuration files is to add to /opt/.filetool.lst the files or directories to backup; then run `filetool.sh -b`. Make sure that the leading “/” is left out. Other similar files: etc/shadow, usr/local/etc/ssh.
Dynamic Extensions
To install more extensions run tce-ab and select Install, the tcz packages will be automatically placed in tce/optional subdirectory. Make sure to load it automatically by adding it to tce/onboot.lst. You need to be use “tc” in order to install extensions.
# su - tc $ tce-ab
Basic Bootable USB Stick Install
Identify the device name for the USB stick then write the ISO into it.
# lsblk # dd if=TinyCore64.iso /dev/sdX bs=4M
NOTE: This USB stick will only operate read-only mode.
Custom Bootable USB Stick Install
This method allows the installation of more packages dynamically. NOTE: With the 64bit version of TinyCore64 there is no GUI custom installer as with the 32bit GUI version. You’ll have to install to USB stick manually. There are several ways to do this, but below is what worked for me.
Using Debian 10 as your workstation, install the required packages for preparing the USB stick:
# apt-get install mbr dosfstools syslinux syslinux-common isolinux extlinux mtools
Modify the USB stick with a bootable FAT32 partition:
# lsblk # printf "dnnnpn1nnntnbnanwn" | fdisk /dev/sdX # mkdosfs /dev/sdX1
Copy the ISO to the USB stick. Also copy extra Syslinux/Extlinux boot loader files.
# mkdir -p /mnt/{iso|usb} # mount -o loop TinyCorePure64-11.0.iso /mnt/iso/ # mount /dev/sdX1 /mnt/usb/ # cp -R /mnt/iso/* /mnt/usb/ # sync
Rename and modify necessary files and directories, and install the Syslinux boot loader on the USB stick:
# cd /mnt/usb # mv cde tce # cd boot # mv isolinux syslinux # cd syslinux # mv isolinux.cfg syslinux.cfg # mv isolinux.bin syslinux.bin # echo " DEFAULT tc LABEL tc KERNEL /boot/vmlinuz64 APPEND initrd=/boot/corepure64.gz waitusb=5 vga=791 noswap nozswap tz=GM-5 superuser " > syslinux.cfg # chmod 0666 syslinux.cfg # chmod 0444 syslinux.bin # rm -rf boot.msg f1 f2 f3 f4 menu.c32 # syslinux -d /boot/syslinux -isf /dev/sdX1
NOTE: TinyCorePure64-11.1.iso comes with GUI extensions. If you don’t need the GUI or if you want to make the USB stick minimal, then delete them:
# rm -rf /mnt/usb/tce/optional/*
Else include them all in the onboot.lst, and then to open the GUI environment run `startx`:
# cd /mnt/usb/tce/optional # ls -l *.tcz | awk '{print $NF}' > ../onboot.lst
Copy the desired extensions and configuration files to /mnt/usb/tce/optional/, and modify /boot/tce/onboot.lst. Follow the logic to also modify bootlocal.sh
Dismount, label and try it.
# cd # umount /mnt/usb # fatlabel /dev/sdc1 USB-TC # sync
Custom External Bootable USB Disk Install
For best results:
- Use a low voltage self- powered external disk.
- Use a solid state drive external disk SSD.
- Use two partitions: 1) ext4 for boot 100MB 2) NTFS for shareable data.
NOTE: I tried exFAT but did not like it and instead I prefer NTFS. exFAT is unstable, works only on SSD drives, has no journal, and requires special partition parameters. NTFS is much better, older and mature, journaled, more stable, shared easily in hybrid environments, although a little slower.
Format the disk and create the file systems:
# fdisk /dev/sdX # mkdosfs /dev/sdX1 # mkfs.ntfs -Q /dev/sdX2
Create with Extlinux variant of Syslinux.
#apt-get install extlinux
Follow the same Syslinux logic above, then;
# vi extlinux.conf DEFAULT tc SAY Tiny Core Linux 11.1 64bit... LABEL tc KERNEL vmlinuz64 APPEND initrd=corepure64.gz waitusb=5 vga=791 noswap nozswap tz=GM-5 superuser
Install the MBR:
# cat /usr/lib/EXTLINUX/mbr.bin > /dev/sdX
Label the partitions:
# e2label /dev/sdc1 USB-ext4 # ntfslabel /dev/sdc2 USB-NTFS
Custom ISO File
Remaster the ISO file and burn it or use it to boot physical or virtual guests.
# apt-get install isolinux xorriso
As above, copy the kernel and ramdisk of the regular ISO onto a temporary directory. As an alternative we can extract the extension, and then the tce extensions directory is not needed. Follow the logic.
# mkdir -p /tmp/mysiso # cp -a /mnt/iso/ /tmp/myiso/ # cd /tmp/myiso/boot/isolinux # cp /usr/lib/ISOLINUX/isolinux.bin . # cp /usr/lib/ISOLINUX/isohdpfx.bin . # chmod 744 *.bin
Create a simple isolinux config file:
# vi isolinux.cfg default 1 label 1 kernel /boot/vmlinuz64 append initrd=/boot/corepure64.gz tce waitusb=5 vga=791 noswap nozswap tz=GM-5 superuser
Extract the extensions into the ramdisk. Make any modifications necessary.
# mkdir -p /tmp/myiso && cd /tmp/myiso # zcat /boot/tcorepure64.gz | cpio -i -H newc -d # for a in `ls /boot/tce/optional/*.tcz ; do unsquashfs -f -d /tmp/myiso/ $a ; done
Recreate the ramdisk and the custom ISO file:
# cd /tmp/myiso # find | sudo cpio -o -H newc | gzip -2 > /boot/tmycorepure64.gz # xorriso -as mkisofs -o /tmp/mytc.iso -isohybrid-mbr /boot/isolinux/isohdpfx.bin -c boot.cat -b /boot/isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table .
Remove the tce directory (no longer needed). Now everything is included in the ramdisk.
# rm -rf /boot/tce
Persistent Files
After booting specify persistent files or directories to extract after after boot, then backup the mydata.tgz tarball. Notice the missing foot slash.
$ vi /opt/.filetool.lst opt etc/shadow usr/local/etc/ssh $ filetool.sh -b
Transfering Files with Netcat
With netcat files can be transfered on a listening port without authentication; great for quick rescue backups.
From the target workstation, listen on a netcat port 8000, ready to extract the received compressed tarball:
# mkdir -p /data/backup # cd /data/backup # nc -l -p 8000 | tar zvx
From soruce Tinycore rescue session, send the tarball of the files to be trasfered.
# cd /mnt/root # tar zvcf - . | nc targethost 8000
== Weaknesses ==
Lack of hardware support. Booting some production servers I noticed that some disk arrays are not detected.
== Summary ==
Tiny Core Linux is a good distro for disaster recovery. However, make sure you prepare and test it with your hardware, ahead of time, and not be taken by surprises. It’s not a one size fits all recovery distro. However, what’s great about it is that, if you are clever enough, you can always add to it whatever you need.
The End.