When working with Ubuntu 10.04 Server, you might need to execute network-dependent operations during the early boot stage. This requires modifying the initramfs to include curl and ensuring the network is initialized before your script runs. Here's how to achieve this reliably, even across kernel upgrades.
First, create or edit the configuration file for initramfs-tools:
sudo nano /etc/initramfs-tools/initramfs.conf
Add the following line to include curl:
MODULES=net
BUSYBOX=y
KEYMAP=n
COMPCACHE_SIZE=""
DEVICE=
IP=
BOOT=local
MODULES=most
BUSYBOX=y
ADDITIONAL_PACKAGES="curl"
Create a script that will execute during initramfs stage. Place it in the hooks directory:
sudo nano /etc/initramfs-tools/scripts/init-premount/custom_curl
Here's an example script that waits for network connectivity:
#!/bin/sh
PREREQ=""
prereqs() {
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
. /scripts/functions
wait_for_network() {
while ! ip route | grep -q default; do
sleep 1
done
}
wait_for_network
curl http://example.com/api/checkin --data "hostname=$(hostname)"
Make the script executable:
sudo chmod +x /etc/initramfs-tools/scripts/init-premount/custom_curl
After making these changes, update your initramfs:
sudo update-initramfs -u
To test if curl is included in your initramfs:
lsinitramfs /boot/initrd.img-$(uname -r) | grep curl
To maintain these changes when upgrading kernels, create a post-install hook:
sudo nano /etc/kernel/postinst.d/zz-update-initramfs
Add the following content:
#!/bin/sh
version="$1"
update-initramfs -k "${version}" -u
Make it executable:
sudo chmod +x /etc/kernel/postinst.d/zz-update-initramfs
- Check boot logs with
dmesg | grep initramfs - Test network functionality in initramfs shell (accessible via recovery mode)
- Verify curl binary is present in initramfs with
lsinitramfs
Initramfs (initial RAM filesystem) is a temporary root filesystem used during Linux boot before the real rootfs is mounted. In Ubuntu 10.04 Server, it's built using initramfs-tools. The critical components are:
/etc/initramfs-tools/ ├── hooks/ # Scripts that modify initramfs content ├── init-bottom/ # Late-init scripts ├── init-premount/ # Early-init scripts └── scripts/ # Main boot scripts
To include curl and its dependencies, create a hook script:
# /etc/initramfs-tools/hooks/curl_hook
#!/bin/sh
PREREQ=""
prereqs() {
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
. /usr/share/initramfs-tools/hook-functions
# Copy curl binary and libraries
copy_exec /usr/bin/curl /bin
copy_exec /usr/lib/libcurl.so.4
copy_exec /usr/lib/libssl.so.1.0.0
copy_exec /usr/lib/libcrypto.so.1.0.0
copy_exec /usr/lib/libz.so.1
Make it executable:
sudo chmod +x /etc/initramfs-tools/hooks/curl_hook
Create a script to set up networking before curl executes:
# /etc/initramfs-tools/scripts/init-premount/networking
#!/bin/sh
PREREQ=""
prereqs() {
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
# Wait for network interfaces
ip link set eth0 up
udhcpc -i eth0 || true
Add your custom script that runs curl:
# /etc/initramfs-tools/scripts/local-premount/curl_script
#!/bin/sh
PREREQ=""
prereqs() {
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
# Example: Fetch configuration
curl -s http://example.com/boot_config > /tmp/config
[ -s /tmp/config ] && . /tmp/config
Update initramfs and test:
sudo update-initramfs -u -k all
To debug, add break=premount to kernel parameters in GRUB, then inspect /bin/curl availability.
Create a package configuration file:
# /etc/initramfs-tools/conf.d/curl COPY_TO_INITRAMFS=1
This ensures your changes persist when new kernels are installed.
- Check
/var/log/syslogfor initramfs errors - Test with
lsinitramfs /boot/initrd.img-$(uname -r) - Increase boot verbosity by removing
quiet splashfrom GRUB