• linux开发之制作Ubuntu根文件系统


    首先在http://cdimage.ubuntu.com/ubuntu-base/releases/网址下载对应的ubuntu根文件系统源码,链接地址如下图所示,我们这里使用的是20.04版本的ubuntu源码
    在这里插入图片描述
    然后进入下图所示的选项
    在这里插入图片描述
    执行下载我们所需要的文件
    在这里插入图片描述
    选择上图所示的文件进行下载。下载完成后将文件复制到我们的开发机器上。
    在这里插入图片描述
    在开发机器上对文件进行解压缩操作,如上图命令。解压缩完成后的文件夹如下图所示
    在这里插入图片描述
    可以查看我们开机机上是否有 /usr/bin/qemu-arm-static文件,如果没有则 在开发机上执行 apt-get install qemu-user-static安装qemu相关工具即可,然后在根文件系统根目录下执行命令sudo cp /usr/bin/qemu-arm-static ./usr/bin/复制文件即可,如下图所示。
    在这里插入图片描述
    接着拷贝开发机上的DNS配置文件到我们制作的根文件系统上,执行命令 sudo cp /etc/resolv.conf ./etc/即可,如下图所示。
    在这里插入图片描述
    接着修改默认源,使用命令sudo vim etc/apt/sources.list打开文件即可,如下图所示
    在这里插入图片描述
    然后将里面的内容全部删除,替换成如下内容

    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
    
    • 1
    • 2
    • 3
    • 4

    替换后的如下图所示,我们的默认源也是好了的。
    在这里插入图片描述
    这些完成后,就可以在主机上去测试看看我们的根文件系统是否可以使用了。
    如下图先创建个挂载某些文件系统的脚本文件。
    在这里插入图片描述
    文件内容如下

    TOP_DIR=$(cd $(dirname $0) && pwd)
    sudo mount -t proc /proc $TOP_DIR/proc
    sudo mount -t sysfs /sys $TOP_DIR/sys
    sudo mount -o bind $TOP_DIR/dev
    sudo mount -o bind /dev/pts $TOP_DIR/dev/pts
    sudo chroot $TOP_DIR
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    然后修改脚本文件权限 sudo chmod 777 mount.sh即可。接着添加个取消挂载的脚本,文件内容如下

    TOP_DIR=$(cd $(dirname $0) && pwd)
    sudo umount  $TOP_DIR/proc
    sudo umount  $TOP_DIR/sys
    sudo umount  $TOP_DIR/dev
    sudo umount  $TOP_DIR/dev/pts
    
    • 1
    • 2
    • 3
    • 4
    • 5

    同样的也要修改脚本文件的权限sudo chmod 777 unmount.sh即可。执行挂载脚本./mount.sh即可
    执行passwd root设置我们的密码,输入两次密码即可,设置成功如下图所示
    在这里插入图片描述
    然后设置下本机名称 echo "test_root" > /etc/hostname即可,然后执行exit退出根文件系统,接着执行./unmount.sh脚本,取消我们的挂载文件。
    遇到的问题 /bin/sh: 0: can't access tty; job control turned of,这个问题主要是找不到init进程,我这边安装systemd后也没有,查看其他的是使用/sbin/init链接到/lib/systemdsystemd上,这样就可以解决这个问题了
    在这里插入图片描述
    其中lib/systemd/system/getty@.service文件内容如下

    [Unit]
    Description=Getty on %I
    Documentation=man:agetty(8) man:systemd-getty-generator(8)
    Documentation=http://0pointer.de/blog/projects/serial-console.html
    After=systemd-user-sessions.service plymouth-quit-wait.service getty-pre.target
    After=rc-local.service
    
    # If additional gettys are spawned during boot then we should make
    # sure that this is synchronized before getty.target, even though
    # getty.target didn't actually pull it in.
    Before=getty.target
    IgnoreOnIsolate=yes
    
    # IgnoreOnIsolate causes issues with sulogin, if someone isolates
    # rescue.target or starts rescue.service from multi-user.target or
    # graphical.target.
    Conflicts=rescue.service
    Before=rescue.service
    
    # On systems without virtual consoles, don't start any getty. Note
    # that serial gettys are covered by serial-getty@.service, not this
    # unit.
    ConditionPathExists=/dev/tty0
    
    [Service]
    # the VT is cleared by TTYVTDisallocate
    # The '-o' option value tells agetty to replace 'login' arguments with an
    # option to preserve environment (-p), followed by '--' for safety, and then
    # the entered username.
    ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear %I $TERM
    Type=idle
    Restart=always
    RestartSec=0
    UtmpIdentifier=%I
    TTYPath=/dev/%I
    TTYReset=yes
    TTYVHangup=yes
    TTYVTDisallocate=yes
    KillMode=process
    IgnoreSIGPIPE=no
    SendSIGHUP=yes
    
    # Unset locale for the console getty since the console has problems
    # displaying some internationalized messages.
    UnsetEnvironment=LANG LANGUAGE LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT LC_IDENTIFICATION
    
    [Install]
    WantedBy=getty.target
    DefaultInstance=tty1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    问题2 Timed out waiting for device /dev/ttyFIQ0,这是tty服务造成的

    [  OK  ] Started System Logging Service.
    [ TIME ] Timed out waiting for device /dev/ttyFIQ0.
    [DEPEND] Dependency failed for Serial Getty on ttyFIQ0.
    [  OK  ] Reached target Login Prompts.ev/ttyFIQ0 (59s / 1min 30s)
    [  OK  ] Reached target Multi-User System.tyFIQ0 (53s / 1mi
    [  OK  ] Reached target Graphical Interface.FIQ0 (45s / 1mi
             Starting Update UTMP about System Runlevel Changes...
    [  OK  ] Finished Update UTMP about System Runlevel Changes.
    DDR V1.14 b1f29a2a6f typ 22/09/02-16:40:04tyFIQ0 (8s / 1min
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    如下图所示
    在这里插入图片描述
    解决方式:在根文件系统里面执行 apt-get install udev即可。安装一些常用命令,这边我是用脚本的方式让它运行

    cat << EOF | sudo chroot $TARGET_ROOTFS_DIR
    apt-get update
    apt install sudo usbutils -fy
    apt install rsyslog net-tools udhcpc -fy
    apt install udev htop iputils-ping -fy
    DEBIAN_FRONTEND=noninteractive apt-get install -fy systemd
    ln -s /lib/systemd/systemd /sbin/init
    echo -e "root\nroot" | passwd root
    useradd -s '/bin/bash' -m -G adm,sudo hzmct
    echo -e "hzmct\nhzmct" | passwd hzmct
    echo "hzmct" > /etc/hostname
    echo "127.0.0.1  localhost" > /etc/hosts
    echo "127.0.0.1  hzmct" >> /etc/hosts
    EOF
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    【无标题】
    如何设置接口调用失败后自动重连
    [安卓app毕业设计源码]精品基于Uniapp+SSM实现的家庭客栈/民宿管理系统实现的App[包运行成功]
    c# 输出二进制字符串
    Semantic Kernel 通过 LocalAI 集成本地模型
    HarmonyOS(35) @State使用注意事项
    如何寻找适合协作的产品设计公司?
    Linux用户操作
    JDK动态代理与CGLIB动态代理
    ArcGIS中批量mxd高版本转低版本
  • 原文地址:https://blog.csdn.net/qq_41795122/article/details/127646888