<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Linux Forum &mdash; Перепаковать "initrd"]]></title>
		<link>https://linuxforum.ru/viewtopic.php?id=41175</link>
		<atom:link href="https://linuxforum.ru/extern.php?action=feed&amp;tid=41175&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Перепаковать "initrd"».]]></description>
		<lastBuildDate>Fri, 08 Mar 2024 14:06:17 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Перепаковать "initrd"]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=471988#p471988</link>
			<description><![CDATA[<p>Разобрался.<br />Ошибка была в строке: echo &quot;SQUASHFS_BIN_2: ${SQUASHFS_BIN:1:$}&quot;<br />которая вызывала сбой выполнения скрипта.<br />Экспериментировал в загрузочном скрипте: нужно было удалить 1 символ из переменной SQUASHFS_BIN.<br />Правильная строка: echo &quot;SQUASHFS_BIN_2: ${SQUASHFS_BIN:1:${#SQUASHFS_BIN}}&quot;</p>]]></description>
			<author><![CDATA[null@example.com (Ciber SLasH)]]></author>
			<pubDate>Fri, 08 Mar 2024 14:06:17 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=471988#p471988</guid>
		</item>
		<item>
			<title><![CDATA[Перепаковать "initrd"]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=471984#p471984</link>
			<description><![CDATA[<p>Приветствую!<br />Хотел переупаковать &quot;initrd&quot; (нужна была правка скрипта &quot;init&quot;) в <a href="https://t.me/vss_flood/37920">Mods 455</a>, но в итоге, при загрузке получаю: Failed to execute /init (error -2).<br />Распаковывал &quot;/tiny/initrd&quot; так (перед этим скопировав его в /tmp/initrdnew/initrd.xz):<br /></p><div class="codebox"><pre><code>[root /tmp/initrdnew]# xz -d ./initrd.xz &amp;&amp; cat ./initrd | cpio -i -d -H newc
[root /tmp/initrdnew]# rm ./initrd.xz</code></pre></div><p>Дальше заменил &quot;init&quot; в этой папке на такой же, но в котором вставлены 2 строки после 64 строки файла (после done):<br /></p><div class="quotebox"><blockquote><p>echo &quot;SQUASHFS_BIN_1: ${SQUASHFS_BIN}&quot;<br />echo &quot;SQUASHFS_BIN_2: ${SQUASHFS_BIN:1:$}&quot;</p></blockquote></div><p>И переупаковал:<br /></p><div class="codebox"><pre><code>find . -print | cpio -H newc -o | xz -z -F xz -C crc32 –x86 –lzma2=dict=8MiB &gt; ../initrd.cpio.xz
cp -f ../initrd.cpio.xz /mnt/d/tiny/initrd</code></pre></div><p>Но после подмены родного &quot;initrd&quot; на новый - получаем незагрузку.<br />Удаление &quot;/tmp/initrdnew/bin/busybox&quot; из распакованного &quot;initrd&quot; не помогает. При загрузке всё равно ошибка:<br /></p><div class="quotebox"><blockquote><p>Failed to execute /init (error -2)<br />Kernel panic - not syncing: No working init found.</p></blockquote></div><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;init</div><div class="fancy_spoiler"><div class="codebox"><pre><code>#!/bin/sh

# Copyright (c) 2009-2020, NVIDIA CORPORATION.  All rights reserved.
# See /etc/LICENSE file for details.

VERSION=&quot;20.10&quot;
CONSOLE=&quot;/dev/console&quot;
ROOTFS=&quot;/mnt/root&quot;
MNT_TIMEOUT=&quot;10&quot;
MNTNV=&quot;mnt/nv&quot;
MNTSQUASH=&quot;mnt/squash&quot;
MNTETC=&quot;mnt/etc&quot;
SQUASHFS_BIN=&quot;tiny/squash.bin&quot;
NFSSHARE=&quot;&quot;
NET=&quot;eth0&quot;
OVRCFG=&quot;1&quot;
COLDPLUG=&quot;1&quot;

# Clear input and output
exec &gt;${CONSOLE} &lt;${CONSOLE} 2&gt;&amp;1

# Display startup info
echo -e &quot;\033[1mBooting TinyLinux $VERSION\033[0m&quot;

# Mount basic filesystems
mount -t proc     proc     /proc
mount -t sysfs    sysfs    /sys
mount -t devtmpfs devtmpfs /dev

# Install busybox symbolic links
/bin/busybox --install -s

# Save kernel boot time for later
KERNEL_BOOT_TIME=$(awk &#039;{print $1*1000}&#039; /proc/uptime)

# Prevent kernel logs from being sent to the console
dmesg -n 1

# Setup hotplug
# Use modprobe from busybox to avoid genkernel&#039;s modprobe sript
# which does not process module aliases.
echo &#039;#!/bin/sh

[ &quot;$ACTION&quot; = &quot;add&quot; ] &amp;&amp; busybox modprobe &quot;$MODALIAS&quot;&#039; &gt; /tmp/hotplug
chmod 755 /tmp/hotplug
echo /tmp/hotplug &gt; /proc/sys/kernel/hotplug

# Allow overriding squash.bin location on the kernel command line
parse_opt()
{
    echo &quot;$1&quot; | cut -f 2- -d &#039;=&#039;
}
for ARG in `cat /proc/cmdline`; do
    case &quot;$ARG&quot; in
        squash\=*)        SQUASHFS_BIN=`parse_opt &quot;$ARG&quot;` ;;
        partno\=*)        PARTNUMBER=`parse_opt &quot;$ARG&quot;` ;;
        nfsshare\=*)      NFSSHARE=`parse_opt &quot;$ARG&quot;` ;;
        net\=*)           NET=`parse_opt &quot;$ARG&quot;` ;;
        ovrcfg\=*)        OVRCFG=`parse_opt &quot;$ARG&quot;` ;;
        mount_timeout\=*) MNT_TIMEOUT=`parse_opt &quot;$ARG&quot;` ;;
        nocoldplug)       COLDPLUG=&quot;&quot; ;;
    esac
done

echo &quot;SQUASHFS_BIN_1: ${SQUASHFS_BIN}&quot;
echo &quot;SQUASHFS_BIN_2: ${SQUASHFS_BIN:1:$}&quot; 

# Create root filesystem
mkdir -p &quot;${ROOTFS}&quot;
mount -t tmpfs tmpfs &quot;${ROOTFS}&quot;

# Coldplug
if [ &quot;$COLDPLUG&quot; = &quot;1&quot; ]; then
    ls /sys/bus/pci/devices/*/uevent /sys/bus/usb/devices/*/uevent /sys/block/*/uevent /sys/block/*/*/uevent | while read UEVENT; do
        echo &quot;add&quot; &gt; &quot;$UEVENT&quot;
    done
fi

# Mounts squashed root filesystem and checks TinyLinux version
mount_squash()
{
    if ! mount -t squashfs -o loop,ro &quot;${ROOTFS}/${MNTNV}/${SQUASHFS_BIN}&quot; &quot;${ROOTFS}/${MNTSQUASH}&quot;; then
        echo &quot;Error: Failed to mount ${1}/${SQUASHFS_BIN}&quot;
        return 1
    fi

    # Check TinyLinux version in the squashed root filesystem
    SQUASHFS_VERSION=$(head -n 1 &quot;${ROOTFS}/${MNTSQUASH}/etc/release&quot; | sed &quot;s/.*version //&quot;)
    if [ &quot;$VERSION&quot; != &quot;$SQUASHFS_VERSION&quot; ]; then
        echo &quot;Error: initrd version $VERSION does not match TinyLinux version $SQUASHFS_VERSION&quot;
        echo &quot;       found in ${1}/${SQUASHFS_BIN}&quot;
        umount &quot;${ROOTFS}/${MNTSQUASH}&quot;
        return 1
    fi
}

# Mount non-volatile volume or NFS share
mkdir -p &quot;${ROOTFS}/${MNTNV}&quot; &quot;${ROOTFS}/${MNTSQUASH}&quot;
RETRYCOUNT=0
TRIEDDEVS=&quot;&quot;
FOUNDDEV=&quot;&quot;
while true; do
    if [ &quot;$NFSSHARE&quot; ]; then
        if [ -e &quot;/sys/class/net/$NET&quot; ]; then
            echo &quot;Obtaining DHCP lease for $NET...&quot;
            FOUNDDEV=&quot;$NET&quot;
            ifconfig &quot;$NET&quot; up || exec /bin/sh
            udhcpc -n -T 1 -t 60 -q -i &quot;$NET&quot; || exec /bin/sh
            mount -t nfs -o nolock &quot;$NFSSHARE&quot; &quot;${ROOTFS}/${MNTNV}&quot; || exec /bin/sh
            mount_squash &quot;$NFSSHARE&quot; || exec /bin/sh
        fi
    else
        [ -z &quot;$PARTNUMBER&quot; ] || P_PARTNUMBER=&quot;p$PARTNUMBER&quot;
        for DEVFILE in `find /dev/ -name &quot;[sh]d[a-z]${PARTNUMBER}*&quot; \
                                -o -name &quot;sr${PARTNUMBER}*&quot;         \
                                -o -name &quot;mmcblk*${P_PARTNUMBER}*&quot;  \
                                -o -name &quot;nvme*n*${P_PARTNUMBER}*&quot;`; do
            echo &quot;$TRIEDDEVS&quot; | grep -q &quot;$DEVFILE\&gt;&quot; &amp;&amp; continue
            mount &quot;$DEVFILE&quot; &quot;${ROOTFS}/${MNTNV}&quot; 2&gt;/dev/null || continue

            TRIEDDEVS=&quot;$TRIEDDEVS $DEVFILE&quot;
            if [ -f &quot;${ROOTFS}/${MNTNV}/${SQUASHFS_BIN}&quot; ] &amp;&amp; mount_squash &quot;$DEVFILE&quot;; then
                echo &quot;Found root device ${DEVFILE}&quot;
                FOUNDDEV=&quot;${DEVFILE}&quot;
                break
            fi
            umount &quot;${ROOTFS}/${MNTNV}&quot; || exec /bin/sh
        done
    fi
    [ &quot;$FOUNDDEV&quot; ] &amp;&amp; break
    if [ $RETRYCOUNT -eq 0 ]; then
        [ &quot;$NFSSHARE&quot; ] &amp;&amp; echo &quot;Ethernet device $NET not found. Waiting...&quot;
        [ -z &quot;$NFSSHARE&quot; ] &amp;&amp; echo &quot;Partition with root filesystem not found. Waiting...&quot;
    fi
    WAITTIME=$(($(awk &#039;{print $1*1000}&#039; /proc/uptime) - $KERNEL_BOOT_TIME))
    [ $WAITTIME -gt $(($MNT_TIMEOUT * 1000)) ] &amp;&amp; ( echo &quot;Giving up...&quot; &amp;&amp; exec /bin/sh )
    RETRYCOUNT=$(($RETRYCOUNT+1))
done

# Create symlinks to the squashed root filesystem
cd &quot;${ROOTFS}&quot;
ln -s &quot;${MNTSQUASH}&quot;/* .
rm -f etc

# Create symlink to home dir
ln -s &quot;${MNTNV}/home&quot; home

# Determine location of upper /etc filesystem for overlayfs
CONFIG_DIR=&quot;${ROOTFS}/${MNTNV}/`dirname &quot;$SQUASHFS_BIN&quot;`&quot;

# Mounts /etc using overlayfs
mount_overlay()
{
    mount -t overlay -o noatime,lowerdir=&quot;${ROOTFS}/${MNTSQUASH}/etc&quot;,upperdir=&quot;$1/etc&quot;,workdir=&quot;$1/work&quot; overlay etc
}

# Mounts /etc overlayfs using upper filesystem from config file
mount_overlay_from_config()
{
    local ETCOVR
    if [ -f &quot;$CONFIG_DIR/config&quot; ]; then
        ETCOVR=&quot;${ROOTFS}/${MNTETC}&quot;
        mkdir -p &quot;$ETCOVR&quot;
        mount -o loop &quot;$CONFIG_DIR/config&quot; &quot;$ETCOVR&quot; || return $?
    else
        ETCOVR=etc_overlay
        mkdir -p &quot;$ETCOVR&quot;
        echo &quot;Persistent configuration not found, storing configuration in tmpfs&quot;
    fi

    mkdir -p &quot;${ETCOVR}/etc&quot; &quot;${ETCOVR}/work&quot;

    local RET
    RET=0
    mount_overlay &quot;${ETCOVR}&quot; || RET=$?

    [ $RET -eq 0 ] || umount &quot;$ETCOVR&quot;

    return $RET
}

# Creates a clean configuration in upper filesystem
restore_previous_config()
{
    echo &quot;Restoring previous configuration&quot;

    local ETCOVR
    ETCOVR=&quot;${ROOTFS}/${MNTETC}&quot;
    mkdir -p &quot;$ETCOVR&quot;
    mount -o loop &quot;$CONFIG_DIR/config&quot; &quot;$ETCOVR&quot; || return $?

    mkdir -p /bak
    cp -ar &quot;${ETCOVR}/etc&quot; /bak/
    rm -rf &quot;${ETCOVR}/etc&quot; &quot;${ETCOVR}/work&quot;
    mkdir -p &quot;${ETCOVR}/etc&quot; &quot;${ETCOVR}/work&quot;

    local RET
    RET=0
    mount_overlay &quot;${ETCOVR}&quot; || RET=$?

    if [ $RET -ne 0 ]; then
        umount &quot;$ETCOVR&quot;
        return $RET
    fi

    cp -arv /bak/etc /
    rm -rf /bak

    return 0
}

# Set up /etc
OVROK=0
mkdir etc
ln -s /proc/mounts etc/mtab
if [ &quot;$OVRCFG&quot; != &quot;0&quot; ]; then
    if [ ! -f &quot;$CONFIG_DIR/config&quot; ] &amp;&amp; [ -f &quot;$CONFIG_DIR/config.new&quot; ]; then
        cp &quot;$CONFIG_DIR/config.new&quot; &quot;$CONFIG_DIR/config&quot; || echo &quot;Error: Failed to copy config.new&quot;
    fi
    if mount_overlay_from_config; then
        OVROK=1
    else
        echo &quot;Error: Failed to mount configuration overlay&quot;
        if [ -f &quot;$CONFIG_DIR/config&quot; ]; then
            if restore_previous_config; then
                OVROK=1
            else
                echo &quot;Error: Failed to restore previous configuration&quot;
                mv &quot;$CONFIG_DIR/config&quot; &quot;$CONFIG_DIR/config.bad&quot;
                if [ -f &quot;$CONFIG_DIR/config.new&quot; ]; then
                    echo &quot;Trying config.new&quot;
                    cp &quot;$CONFIG_DIR/config.new&quot; &quot;$CONFIG_DIR/config&quot;
                else
                    echo &quot;Trying config in ramdisk&quot;
                fi
                if mount_overlay_from_config; then
                    OVROK=1
                else
                    echo &quot;Error: Failed to mount backup configuration overlay&quot;
                fi
            fi
        fi
    fi
fi
if [ &quot;$OVROK&quot; != &quot;1&quot; ]; then
    echo &quot;Copying configuration to ramdisk&quot;
    cp -a &quot;${ROOTFS}/${MNTSQUASH}&quot;/etc/* etc/
fi

# Mount boot partition
if [ &quot;$PARTNUMBER&quot; = &quot;2&quot; ] &amp;&amp; [ -z &quot;$NFSSHARE&quot; ] &amp;&amp; [ ! -f &quot;${CONFIG_DIR}/kernel&quot; ]; then
    mkdir &quot;${ROOTFS}/boot&quot;
    mount -o ro &quot;${FOUNDDEV%2}1&quot; &quot;${ROOTFS}/boot&quot;
fi

# Copy resolv.conf
[ &quot;$NFSSHARE&quot; ] &amp;&amp; [ -f &quot;/etc/resolv.conf&quot; ] &amp;&amp; cp /etc/resolv.conf etc/

# Create necessary directories
mkdir dev
mkdir proc
mkdir root
mkdir sys
mkdir tmp
chmod 1777 tmp
mkdir -p var/tmp
chmod 1777 var/tmp
mkdir var/log
chmod 755 var/log

# Create basic device nodes
mknod dev/null c 1 3
mknod dev/console c 5 1

# Unmount filesystems
umount /dev
umount /sys
rm /etc/mtab
cp /proc/mounts /etc/mtab
umount /proc

# Store kernel boot time for reporting in /sbin/rc
echo &quot;$KERNEL_BOOT_TIME&quot; &gt; var/log/kernel_boot_time

# Switch to the new root filesystem
exec /bin/busybox switch_root -c /dev/console &quot;${ROOTFS}&quot; /sbin/init

# Fallback - enter shell
exec /bin/busybox sh</code></pre></div></div></div>]]></description>
			<author><![CDATA[null@example.com (Ciber SLasH)]]></author>
			<pubDate>Thu, 29 Feb 2024 13:58:46 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=471984#p471984</guid>
		</item>
	</channel>
</rss>
