Debian11_手工制作deb安装包_过程和方法

发布时间 2023-08-11 14:45:59作者: osnosn

Debian11_手工制作deb安装包_过程和方法

转载注明来源: 本文链接 来自osnosn的博客,写于 2023-08-10.

参考

需求

  • 想给 armbian 系统更换/升级内核。
    内核包括 image,kmod 和 headers,文件很多,需要放置在不同的系统目录中。
  • 但网上找到别人编译好的内核,是 tar.gz 的压缩包。
    安装过程麻烦。解压后,要copy到指定位置。时间久了,就忘了copy到哪里了。
    不方便安装,不方便卸载。
  • 想把这些文件,打包成一个 deb 安装包。 用 "dpkg -i" 安装,用 "dpkg -r" 卸载。就方便多了。

制作 deb 包

  • 按照参考中的帖子,制作 deb 包,似乎是不难。
    无非就是两步。
    • 准备 deb 包内的文件目录。
    • 创建"控制文件",即 "DEBIAN/" 目录。

最终写了个脚本

以下是完整的例子

  • 去 【kernel_dev】下载 "5.15.125-ophub.tar.gz",约 89MB。
  • 脚本没有获取命令行参数。内核版本号,写在脚本的第二行,需要的时候,手工修改一下 "version=" 即可。
    脚本执行后,会在当前目录创建几个目录,
    "debian/", "img_root/", "head_root/", "5.15.125/"(解压 tar.gz 创建的目录)。
    最后生成两个 deb 文件。脚本执行结束后,上述的 4 个目录就没用了,可以删除。
    #!/bin/bash
    
    version=5.15.125
    
    tar zxf ${version}.tar.gz -C ./
    kernel_boot="$(basename $(ls ${version}/boot-${inputs_kernel}*.tar.gz 2>/dev/null | head -n 1))"
    kernel_name="${kernel_boot:5:-7}"
    
    #--- 源码包控制文件,Source package control files ---
    mkdir -p debian
    cat <<EOF > debian/changelog
    linux-image-headers-s905d-ophub (0.1) focal; urgency=low
    
      * Custom built Linux kernel.
    
     -- System Administrator <root@localhost.localdomain>  Fri, 11 Aug 2023 00:42:42 -0000
    EOF
    cat <<EOF > debian/control
    Source: linux-image-headers-s905d-ophub
    Maintainer: System Administrator <root@localhost.localdomain>
    
    Package: linux-image-${version}-aml-s905d-ophub
    Architecture: arm64
    Section: kernel
    Priority: optional
    Homepage: https://www.kernel.org/
    Description: Linux kernel, version ${version}-aml-s905d-ophub
     This package contains the Linux kernel, modules and corresponding other files.
    
    Package: linux-headers-${version}-aml-s905d-ophub
    Architecture: arm64
    Section: kernel
    Priority: optional
    Homepage: https://www.kernel.org/
    Description: Linux kernel headers for ${version}-aml-s905d-ophub on arm64
     This package provides kernel header files for ${version}-aml-s905d-ophub on arm64.
     This is useful for people who need to build external modules
    EOF
    #--------------image deb---------
    IMAGE_ROOT=img_root
    mkdir -p "${IMAGE_ROOT}"
    #...--- boot ---
    boot_dir=${IMAGE_ROOT}/boot
    mkdir -p "${boot_dir}"
    tar zxf ${version}/boot-${kernel_name}.tar.gz -C ${boot_dir}/
    #mv ${boot_dir}/uInitrd-${kernel_name}  ${boot_dir}/uInitrd
    #cp ${boot_dir}/vmlinuz-${kernel_name}  ${boot_dir}/zImage
    #...--- dtb ---
    dtb_dir=${boot_dir}/dtb-${kernel_name}/
    mkdir -p "${dtb_dir}"
    tar zxf ${version}/dtb-amlogic-${kernel_name}.tar.gz -C ${dtb_dir}
    
    #...--- kmod ---
    kmod_dir=${IMAGE_ROOT}/usr/lib/modules
    mkdir -p "${kmod_dir}"
    tar zxf ${version}/modules-${kernel_name}.tar.gz -C ${kmod_dir}
    rm -f ${kmod_dir}/${kernel_name}/{build,source}
    
    
    mkdir -p "${IMAGE_ROOT}/DEBIAN"
    touch ${IMAGE_ROOT}/DEBIAN/md5sums
    cat <<EOF > ${IMAGE_ROOT}/DEBIAN/postinst
    #!/bin/sh
    set -e
    # Pass maintainer script parameters to hook scripts
    export DEB_MAINT_PARAMS="$*"
    # Tell initramfs builder whether it's wanted
    export INITRD=Yes
    test -d /etc/kernel/postinst.d && run-parts --arg="${version}-aml-s905d-ophub" --arg="/boot/vmlinuz-${version}-aml-s905d-ophub" /etc/kernel/postinst.d
    exit 0
    EOF
    cat <<EOF > ${IMAGE_ROOT}/DEBIAN/postrm
    #!/bin/sh
    set -e
    # Pass maintainer script parameters to hook scripts
    export DEB_MAINT_PARAMS="$*"
    # Tell initramfs builder whether it's wanted
    export INITRD=Yes
    test -d /etc/kernel/postrm.d && run-parts --arg="${version}-aml-s905d-ophub" --arg="/boot/vmlinuz-${version}-aml-s905d-ophub" /etc/kernel/postrm.d
    exit 0
    EOF
    cat <<EOF > ${IMAGE_ROOT}/DEBIAN/preinst
    #!/bin/sh
    set -e
    # Pass maintainer script parameters to hook scripts
    export DEB_MAINT_PARAMS="$*"
    # Tell initramfs builder whether it's wanted
    export INITRD=Yes
    test -d /etc/kernel/preinst.d && run-parts --arg="${version}-aml-s905d-ophub" --arg="/boot/vmlinuz-${version}-aml-s905d-ophub" /etc/kernel/preinst.d
    exit 0
    EOF
    cat <<EOF > ${IMAGE_ROOT}/DEBIAN/prerm
    #!/bin/sh
    set -e
    # Pass maintainer script parameters to hook scripts
    export DEB_MAINT_PARAMS="$*"
    # Tell initramfs builder whether it's wanted
    export INITRD=Yes
    test -d /etc/kernel/prerm.d && run-parts --arg="${version}-aml-s905d-ophub" --arg="/boot/vmlinuz-${version}-aml-s905d-ophub" /etc/kernel/prerm.d
    exit 0
    EOF
    chmod +x ${IMAGE_ROOT}/DEBIAN/postinst ${IMAGE_ROOT}/DEBIAN/postrm ${IMAGE_ROOT}/DEBIAN/preinst ${IMAGE_ROOT}/DEBIAN/prerm
    dpkg-gencontrol  -P${IMAGE_ROOT} -plinux-image-${version}-aml-s905d-ophub -v${version}-aml-s905d-ophub-1 -DSource=linux-upstream
    dpkg-deb -b ${IMAGE_ROOT} linux-image-${version}-aml-s905d-ophub_arm64.deb
    
    
    #--------------headers deb---------
    HEADER_ROOT=head_root
    mkdir -p "${HEADER_ROOT}"
    header_dir=${HEADER_ROOT}/usr/src/linux-headers-${kernel_name}
    mkdir -p "${header_dir}"
    tar zxf ${version}/header-${version}-ophub.tar.gz -C ${header_dir}
    
    kmod_dir=${HEADER_ROOT}/usr/lib/modules
    mkdir -p "${kmod_dir}/${kernel_name}"
    ln -sf /usr/src/linux-headers-${kernel_name} ${kmod_dir}/${kernel_name}/build
    
    mkdir -p "${HEADER_ROOT}/DEBIAN"
    touch ${HEADER_ROOT}/DEBIAN/md5sums
    dpkg-gencontrol  -P${HEADER_ROOT} -plinux-headers-${version}-aml-s905d-ophub -v${version}-aml-s905d-ophub-1 -DSource=linux-upstream
    dpkg-deb -b ${HEADER_ROOT} linux-headers-${version}-aml-s905d-ophub_arm64.deb
    
    #--------------end---------
    
    在 N1 上执行这个脚本。耗时 2m55s 生成两个 deb 文件。文件还挺大的。
    7.2M  linux-headers-5.15.125-aml-s905d-ophub_arm64.deb
     64M  linux-image-5.15.125-aml-s905d-ophub_arm64.deb
    

----end----


转载注明来源: 本文链接 https://www.cnblogs.com/osnosn/p/17622874.html
来自 osnosn的博客 https://www.cnblogs.com/osnosn/ .