惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Archives - TechRepublic
Security Archives - TechRepublic
D
Docker
D
DataBreaches.Net
V
Vulnerabilities – Threatpost
P
Palo Alto Networks Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
IT之家
IT之家
L
LINUX DO - 热门话题
T
The Blog of Author Tim Ferriss
雷峰网
雷峰网
Project Zero
Project Zero
T
Threatpost
D
Darknet – Hacking Tools, Hacker News & Cyber Security
宝玉的分享
宝玉的分享
Stack Overflow Blog
Stack Overflow Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Securelist
Cisco Talos Blog
Cisco Talos Blog
Google DeepMind News
Google DeepMind News
Scott Helme
Scott Helme
The Cloudflare Blog
Know Your Adversary
Know Your Adversary
T
Tor Project blog
博客园_首页
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
Security Latest
Security Latest
Cyberwarzone
Cyberwarzone
S
Schneier on Security
T
The Exploit Database - CXSecurity.com
H
Help Net Security
Simon Willison's Weblog
Simon Willison's Weblog
阮一峰的网络日志
阮一峰的网络日志
C
Cyber Attacks, Cyber Crime and Cyber Security
P
Proofpoint News Feed
AWS News Blog
AWS News Blog
The GitHub Blog
The GitHub Blog
P
Proofpoint News Feed
T
Troy Hunt's Blog
量子位
G
GRAHAM CLULEY
O
OpenAI News
Engineering at Meta
Engineering at Meta
博客园 - Franky
SecWiki News
SecWiki News
F
Fortinet All Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

JieJiSS' Blog

为 SQLAlchemy Model 添加 type hint 和 type check Boot an Arch Linux RISC-V using qemu-system 关于基于机器学习的多目标对象追踪算法的文献综述 - JieJiSS' Blog ACTF2022 safer-tg-bot-{1,2} WP - JieJiSS' Blog A RISC-V gcc pitfall revealed by a glibc update Setup an Arch Linux RISC-V Development Environment 解构赋值踩坑:神秘失踪的数据 - JieJiSS' Blog How's the GDPR (used to) related to my blog Rust is incompatible with LLVM, at least partially python-mtrpacket 在 riscv64 上编译测试不通过 - JieJiSS' Blog 快速获得 RISC-V 开发环境 - JieJiSS' Blog 在 RISC-V 上编译 Node.js 16 Redmi AirDots 3 Pro 连接电脑后蓝牙类别不正确的解决方案 为什么 ArrowFunction 不能 new - JieJiSS' Blog Bilibili 2020-10-24 CTF WriteUp - JieJiSS' Blog 对于又一种对SS流式加密的攻击(奇虎团队)的详细分析 - JieJiSS' Blog 在MacOS上配置dnscrypt-proxy(免分流) - JieJiSS' Blog 市县中心点坐标(经纬度) - JieJiSS' Blog 二项式定理及其推广公式的一种简单理解办法 - JieJiSS' Blog
RV64 板子更换 rootfs 指南 - JieJiSS' Blog
2022-08-25 · via JieJiSS' Blog

文章目录

  1. 0x00 警告
  2. 0x01 准备工作
  3. 0x02 开始更换 rootfs

XieJiSS, revision 3

本文可能不会及时更新,请以RV64 板子更换 rootfs 指南 - archriscv-packages Wiki为准

0x00 警告

请确保你或你的同伴可以在物理上(通过串口)访问到板子。否则,你的板子将在 0x02 的第 6 步重新启动时失联。

0x01 准备工作

  1. 首先,以 root 身份回到根目录:

    1
    2
    sudo su
    cd /
  2. 下载 rootfs tarball(确保安装了 wget):

    1
    2
    3
    4
    mkdir new && cd new
    wget curl -O https://archriscv.felixc.at/images/archriscv-20220727.tar.zst
    tar -xf archriscv-20220727.tar.zst
    cd ..
  3. 在根目录创建 old 文件夹:

    1
    mkdir old
  4. 看一下 fstab

    1
    cat /etc/fstab

    最好拍照或截图备查。

  5. 获取当前的 Linux 内核版本:

    首先,初始化用于从 vmlinuz 提取内核版本的脚本。vmlinuz 一般位于 /boot 目录下,需要 root 权限才能访问。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    kver_generic() {
    # For unknown architectures, we can try to grep the uncompressed or gzipped
    # image for the boot banner.
    # This should work at least for ARM when run on /boot/Image, or RISC-V on
    # gzipped /boot/vmlinuz-linuz. On other architectures it may be worth trying
    # rather than bailing, and inform the user if none was found.

    # Loosely grep for `linux_banner`:
    # https://elixir.bootlin.com/linux/v5.7.2/source/init/version.c#L46
    local kver= reader=cat

    [[ $(file -b --mime-type "$1") == 'application/gzip' ]] && reader=zcat

    read _ _ kver _ < <($reader "$1" | grep -m1 -aoE 'Linux version .(\.[-[:alnum:]]+)+')

    printf '%s' "$kver"
    }

    执行 kver_generic /boot/vmlinuz,记住 Linux 内核版本。可以将其赋值给一个临时的 shell 变量,也可以继续拍照记录:

    1
    linux_kver=$(kver_generic /boot/vmlinuz)

    注意,如果你当前的系统没有开启内核压缩,那么可能需要将 vmlinuz 修改为 vmlinux

  6. 看一下 ip addr 和 router 的地址:

    1
    2
    3
    # 这里 eth0 可能需要按实际情况修改,ip addr show 可以查看全部 device
    # 一般 ip addr show 的第二个 device 就是我们需要的 device(第一个是 lo 本地回环)
    ip addr show dev eth0

    记录 inet 行的 IP,这是你本机当前的 IP 地址。之后会用到,建议拍照或截图留存。(包括 IP 后面的 /24,如果显示的不是 /24 那么之后步骤中也要对应修改成此时显示的后缀)

    其实理论上这步不需要的,用 dhcp 即可。但似乎 PLCT 南京内网的端口转发本质上基于静态 IP,依赖了 dhcp 客户端重启后服务端优先发放此前释放的 IP 的特征,并不稳定。建议还是在 0x02 的第七步里配成静态 IP。

    1
    ip route show dev eth0

    记录 default via 后面的 IP 地址,这个就是你的板子所在局域网的 router 的地址。建议拍照或截图留存。

    如果目标板子不在 PLCT 南京内网,并且你并不理解上述命令的用途:建议在此停下,先和 mentor 讨论清楚网络拓扑再继续。

0x02 开始更换 rootfs

  1. 记录几个关键路径(不用真的记,反正这里有):

    1
    2
    /new/lib/    # 后面步骤中会设置为 LD_LIBRARY_PATH
    /new/lib/ld-linux-riscv64-lp64d.so.1

    在新的 rootfs 并非 Arch Linux 时,可能需要将 /lib 替换为 /usr/lib。原因详见:The /lib directory becomes a symlink - Arch Linux News

  2. 移动文件夹

    1
    2
    mv etc home media mnt opt root srv var old/  # 这里保留 /boot
    mv new/etc new/home new/mnt new/opt new/root new/srv new/var ./
  3. 继续移动文件夹

    1
    2
    3
    4
    LD_LIBRARY_PATH=/new/lib/ /new/lib/ld-linux-riscv64-lp64d.so.1 /new/bin/mv bin sbin usr lib old/
    LD_LIBRARY_PATH=/new/lib/ /new/lib/ld-linux-riscv64-lp64d.so.1 /new/bin/mv new/bin new/sbin new/usr new/lib ./

    mv old/lib/firmware ./lib/

    /lib/firmware 是 Ubuntu on Unmatched 的 firmware 路径,可能需要按实际情况修改。

  4. 把 kernel modules 移动回来

    1
    mv old/usr/lib/modules/$linux_kver ./lib/modules/

    这里的 $linux_kver 是前面「获取当前的 Linux 内核版本」步骤中设置的。

    dtbs、vmlinuz 等均位于 /boot 下,此前并未覆盖 /boot 因此在这一步不用操心它们。备注:一般来讲,新 rootfs 的 tar 文件里面并不会包含 dtbs 和 vmlinuz 等文件,它们一般会出现在 .img.iso 内,这超出了 rootfs 的范畴,故本文不做详细解释。

  5. 修改 fstab

    1
    2
    echo "LABEL=cloudimg-rootfs  /      ext4     discard,errors=remount-ro       0 1" >> /etc/fstab
    echo "LABEL=timesyncd-clock /var/lib/systemd/timesync/ tmpfs size=1K,rw,nodev,nosuid,noexec,noatime 0 1" >> /etc/fstab

    注意这里可能需要根据之前看的 fstab 内容来酌情修改第一行,例如原本是 vfat 的盘你肯定不会希望它被设置成按照 ext4 格式读取。

    第二行的 tmpfs 是因为我们稍后要启用 systemd-timesyncd,但是不希望它太过影响硬盘寿命。如果你不在乎,可以丢掉这行。

  6. 重启机器。

  7. 重启后已经是 Arch Linux 了。开始配网络和 fstab

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    echo test > test.txt  # 测试 / 是否被 mount 为 rw
    # mount -o remount,rw /
    rm test.txt

    ip addr add 之前记录下的内网IPv4地址/24 dev eth0
    ip link set eth0 up
    ip route add default via 之前记录下的router地址 dev eth0

    # 114.114.114.114 是国内常用的 dns 递归服务器
    echo 'nameserver 114.114.114.114' > /etc/resolv.conf

    systemctl start systemd-timesyncd

    pacman -Syu --noconfirm
    pacman -Syy vim openssh dhcpcd
    systemctl start sshd.service
    systemctl enable sshd.service
    touch .ssh/authorized_keys # 受信任的 ssh 公钥,可以使用 vim 编辑

    vim /etc/dhcpcd.conf # 配置样例如下。这里受限于南京内网拓扑,提供的是静态 IP 的配置方案
    1
    2
    3
    4
    5
    6


    interface eth0
    static ip_address=之前记录下的内网IPv4地址/24
    static routers=之前记录下的router地址
    static domain_name_servers=114.114.114.114
  8. 更新 pacman 软件源,随后再次重启。

    1
    2
    pacman -Syu --noconfirm
    # reboot -f,对于 Unmatched 板子可能还需要按 reset 按钮

    跑完 Syu 如果不重启,可能会遇到很多「升级升了一半」导致的问题,例如找不到 kernel module、找不到各种符号等等。

来源:https://blog.jiejiss.com/