一个fully retryable的rootbuild packer脚本,从0打造matecloudos(3):以lfs9观点看compiletc tools in advance

从Ubuntu-base构建ubuntu rootfs(以x86_64和arm为例) 版权声明:本文为本文为博主原创文章,转载请注明出处。如有问题,欢迎指正。 文章目录1.介绍2.目的2.准备宿主系统2.1 宿主系统需求附:创建回环文件并分区1. 创建镜像文件2. 建立分区3. 映射分区设备并格式化4. 挂载分区2.2 挂载新分区2.3 配置目标Ubuntu源2.3 配置DNS2.3 配置用户创建默认配置文件2.3 进入chroot环境3.安装软件3.1 安装内核3.2 安装X-window4.安装各种桌面(可选)4.1 安装Lubuntu的定制LXDE4.2 安装gnome桌面4.3 安装 阅读详情

本文关键字:shell中的数组作为参数传递且带下标,bash 数组作为变量,bash 数组作为环境变量,bash中的以及多层单双引号转义处理,bash中Shell嵌套中的$转义处理, chrooted shell $ escape

在《一个fully retryable的rootbuild packer脚本,从0打造matecloudos(2)》中,我们见到了一种用数组化命令字符串和统一compiletarget()的的方式来构建lfs9的compiletc11基础部分,在那文的结尾,我们提到,为了清晰化这种布局,我们把那个大数组放到了前面,把common部分也作为bash module,这样主脚本文件的后面是逻辑主体,很短小很清晰,我们还提到,利用export可以将上层shell的processtable带入到下层shell,这就是本文要讲到的chroot环境和通过``,$()等命令替换,甚至bash -c ""等方式开启的子shell环境。

怎么在上下级shell间传递一个大大的命令数组?为什么要这样做?
因为bash中,主从shell间的变量是主shell的变量能传到子shell,且数组不是一级公民,不能直接传递,也不好通过传递${arr[@]}的方式进行(因为如果这样,在子shell中还要重新组装一次为新数组),所以我们在主shell中,把数组先设为一个大大的字符串(数组化每条命令字符串和字符串化整个数组的区别正是本文与上文的区别之一),然后通过export导出这个大串到子shell,在子shell中重新构建为数组只需一个declare -A,declare -A是bash中定义关联数组的方法,我们在上二文都用到了,必须显式定义。而且它会进入到shell的环境变量,通过export和declare -A可以看到(注意,如果你在脚本中自动输出,里面的条目都是打乱的,并不影响脚本逻辑使用,如果手动粘贴命令,则可以看到按定义顺序显示的数组条目)。

接上文,本文讲解的是compiletc11的第三部分,将上面涉及到的要点进行讲解(注意上面提到三种环境chroot,substutue和bash -c,都将在接下来涉及)。

废话不说,上脚本。

增加了chroot支持的common

主要是把路径形式按chrootmode设置调用是chroot的/下还是非chroot下的/mnt/sda1/tmp下(文章2的普通模式)

#!/usr/local/bin/bash

export chrootmode='0'

while [[ $# -ge 1 ]]; do
  case $1 in
    -c|--chroot)
      shift
      chrootmode="$1"
      shift
      ;;
    *)
      if [[ "$1" != 'error' ]]; then echo -ne "\nInvaild option: '$1'\n\n"; fi
      echo -ne " Usage(args are self explained):\n\tbash $(basename $0)\t-c/--chroot\n\t\t\t\t\n"
      exit 1;
      ;;
    esac
  done

DOWNLOADPREFIX=${DOWNLOADPREFIX:-http://10.211.55.2:8000/buildmatecloudos}

[[ "$chrootmode" == '0' ]] && DIR_DOWNLOADS=${DIR_DOWNLOADS:-/mnt/sda1/tmp/build} || DIR_DOWNLOADS=${DIR_DOWNLOADS:-/build}
[[ "$chrootmode" == '0' ]] && DIR_GCC=${DIR_GCC:-/mnt/sda1/tmp/build} || DIR_GCC=${DIR_GCC:-/build}
[[ "$chrootmode" == '0' ]] && DIR_LOGS=${DIR_LOGS:-/mnt/sda1/tmp/logs} || DIR_LOGS=${DIR_LOGS:-/logs}

[ ! -d ${DIR_DOWNLOADS} ]        && mkdir ${DIR_DOWNLOADS}
[ ! -d ${DIR_GCC} ]        && mkdir ${DIR_GCC}
[ ! -d ${DIR_LOGS} ]       && mkdir ${DIR_LOGS}

然后是二个函数不变
......

buildrootbase中的字串化大数组以及多层引号转义处理

buildrootbase是另起的脚本文件,对应lfs9的compiletc11的“make basic filesystem”,以示与上文“constructing a temp system”分开。(如果你要看详细的lfs,从一个低的版本开始,如lfs62,高版本lfs9有相当大的省略)

这里面的重点是:由于是一个大“”括起来的大字串,包括开头(和末尾的)在内,实际上是整个数组定义字串化的全部内容,所以相比文章中pure processtable,这里命名为processtablestr,与前者比较主要的区别在:里面如果有双引号要用\转义,如果双引号中还有双引号,那么双引号要改成单引号,因为bash只允许最大三级的引号嵌套(这是我总结的不知对不对),即3级转义“”:一级不用转,二级用\,三级用’,直观的手段是你可以直接在一个bash shell中粘贴这个"processtablestr="大字串"以进行测试,如果没有出错,差不多就行了,如果有出错,在转化成数组后,调用数组时,会提示出错must use subscript when assigning associative array。

PROCESSTABLESTR="(
    [\"linux_p2_custproc\"]=\"cp -f /src/1.buildbase/kernelandtoolchain/config-5.4.3-tinycore64 ../.config;cd ../ && make mrproper && make headers\"
    [\"linux_p2_postcmds\"]=\"find usr/include -name '.*' -delete; \
    rm usr/include/Makefile; \
    cp -rv usr/include/* /usr/include\"

    [\"glibc_p2_precmds\"]=\"cd ../ && patch -Np1 -i /src/1.buildbase/kernelandtoolchain/glibc-2.30-fhs-1.patch; \
    sed -i '/asm.socket.h/a# include <linux/sockios.h>' sysdeps/unix/sysv/linux/bits/socket.h; \
    ln -sfv ../../lib/ld-linux-x86-64.so.2 /lib64; \
    cd buildp2; \
    echo 'CFLAGS += -mtune=generic -Os -pipe' > configparms\"
    [\"glibc_p2_confqz\"]=\"CC='gcc -ffile-prefix-map=/tools=/usr'\"
    [\"glibc_p2_confhz\"]=\"--prefix=/usr --disable-werror --libexecdir=/usr/lib/glibc --enable-kernel=4.19.10 --enable-stack-protector=strong --with-headers=/usr/include libc_cv_slibdir=/lib --enable-obsolete-rpc\"
    [\"glibc_p2_mdlcmds1\"]=\"find . -name config.make -type f -exec sed -i 's/-g -O2//g' {} \\; ; \
    find . -name config.status -type f -exec sed -i 's/-g -O2//g' {} \\; \"
    [\"glibc_p2_mdlcmds2\"]=\"touch /etc/ld.so.conf; \
    sed '/test-installation/s@DEFERSUBMEPERLDEFERSUBME@echo not running@' -i Makefile\"
    [\"glibc_p2_postcmds\"]=\"cp ../nscd/nscd.conf /etc/nscd.conf; \
    mkdir -p /var/cache/nscd; \
    make localedata/install-locales; \
    sed -i 's@lib64/ld-linux-x86-64.so.2@lib/ld-linux-x86-64.so.2@' /usr/bin/ldd; \
    mv -v /tools/bin/{ld,ld-old}; \
    mv -v /tools/x86_64-pc-linux-gnu/bin/{ld,ld-old}; \
    mv -v /tools/bin/{ld-new,ld}; \
    ln -sv /tools/bin/ld /tools/x86_64-pc-linux-gnu/bin/ld; \
    gcc -dumpspecs | sed -e 's@/tools@@g' -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > /tools/lib/gcc/x86_64-tc-linux-gnu/9.2.0/specs; \
    sed -i 's@lib64/ld-linux-x86-64.so.2@lib/ld-linux-x86-64.so.2@' /tools/lib/gcc/x86_64-pc-linux-gnu/9.2.0/specs; \
    echo 'int main(){}' > dummy.c; \
    cc dummy.c -v -Wl,--verbose &> dummy.log; \
    readelf -l a.out | grep ': /lib'; \
    grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log; \
    grep -B1 '^ /usr/include' dummy.log; \
    grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'; \
    grep '/lib.*/libc.so.6 ' dummy.log; \
    grep 'found' dummy.log; \
    rm -v dummy.c a.out dummy.log\"

    ......

)"

这里仅给出部分是因为还没有最终调试正确出所有的编译条目,注意与上一文的细节区别。

buildrootbase中的主逻辑以及子Shell和Shell嵌套中的$转义处理

下面的mkdir和mount为了追求脚本在调试时可retryable,都尽量用了判断和-p。mount部分需要重构。

#########begin main#########

TC=/mnt/sda1/tmp
mkdir -p $TC/dev
mkdir -p $TC/proc
mkdir -p $TC/sys
mkdir -p $TC/run
[[ ! -e $TC/dev/console ]] && mknod -m 600 $TC/dev/console c 5 1
[[ ! -e $TC/dev/null ]] && mknod -m 666 $TC/dev/null c 1 3
if awk -v status=1 '$2 == "$TC/dev" {status=0} END {exit status}' /proc/mounts; then   echo "yes"; else   mount --bind /dev $TC/dev; fi
if awk -v status=1 '$2 == "$TC/dev/pts" {status=0} END {exit status}' /proc/mounts; then   echo "yes"; else   mount -t devpts devpts $TC/dev/pts -o gid=5,mode=620; fi
if awk -v status=1 '$2 == "$TC/proc" {status=0} END {exit status}' /proc/mounts; then   echo "yes"; else   mount -t proc proc $TC/proc; fi
if awk -v status=1 '$2 == "$TC/sys" {status=0} END {exit status}' /proc/mounts; then   echo "yes"; else   mount -t sysfs sysfs $TC/sys; fi
if awk -v status=1 '$2 == "$TC/run" {status=0} END {exit status}' /proc/mounts; then   echo "yes"; else   mount -t tmpfs tmpfs $TC/run; fi
chown -R root:root $TC/tools
ln -sf $TC/tools /

注意这里,这里完成了开头讲的通过env变量export传递processtablestr,和稍后在chrooted bash shell中将这个big strdeclare -A重构为数组的动作,注意$(echo \$PROCESSTABLE),实际上开启了一个子shell作命令替换,这是一个用$()产生子shell的用法,所以这里要\转义$这个变量替换,所以这里可以解释为,export是没经过转义的原始字符串,而命令替换内部的echo出来的经过了转义的。否则$PROCESSTABLE根本取不到值。

实际上在讲到bash中嵌套的命令替换/变量替换的相关技术中,一般都会讲到内部的变量要经过转义。

chroot $TC /tools/bin/env -i MAKEFLAGS="-j 2" PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin PROCESSTABLE="${PROCESSTABLESTR}" /tools/bin/bash -c "
declare -A PROCESSTABLE=$(echo \$PROCESSTABLE); \
export; \

......

那么重点来了,如果上述是二级嵌套,那么这里又重新启动了一个bash -c,属于三级shell嵌套了,联系到上一节的引号嵌套转义,可以用相似的处理方法,将这个shell cmd str用''括起来(实际上''本来也是一种标识性的转义),而里面的命令和变量替换符,如CompilePackage \$packagedef,需要转义一次,否则$packagedef也根本取不到值。所以这里发生了一次三级引号转义和普通命令变量替换符$转义。

exec /tools/bin/bash --login +h -c ' \

touch /var/log/{btmp,lastlog,faillog,wtmp}; \
chmod 664  /var/log/lastlog; \
chmod 600  /var/log/btmp; \

这里的-c 1,使得buildrootbase采用正确的chroot相关路径设定。

. /src/common/common -c 1 ; \

for packagedef in linux-5.4.3.tar.xz:p2 glibc-2.30.tar.xz:p2 zlib-1.2.11.tar.gz:p1 file-5.37.tar.gz:p2 readline-7.0.tar.gz:p1 m4-1.4.18.tar.gz:p2 bc-2.2.0.tar.xz:p1 binutils-2.33.1.tar.xz:p3 gmp-6.1.2.tar.xz:p1 mpfr-4.0.2.tar.xz:p1 mpc-1.1.0.tar.gz:p1 gcc-9.2.0.tar.xz:p4; \
do \
  CompilePackage \$packagedef || exit 1; \
done; \
' \
"

#########end main#########

稍后的文章会给出完全调试正确后的结果,这里仅给出技术路线。

逆向分析美团外卖mtgsig3.0签名算法:从抓包到算法还原实战 在移动应用开发与安全领域,API接口签名是保障数据传输完整性与身份验证的核心机制。其基本原理是通过特定的算法,将请求参数、时间戳等数据与密钥结合,生成唯一的签名串,服务器通过验证签名来识别请求的合法性。这项技术的核心价值在于防止数据篡改、重放攻击和未授权访问,是构建安全客户端-服务器通信的基石。在实际应用中,签名算法广泛应用于电商、社交、金融等各类App的接口保护场景。本文以美团外卖App的mtgsig3.0签名为具体案例,详细拆解了其生成逻辑。通过结合Frida动态调试与Jadx静态分析,文章深入探讨了如 阅读详情

相关推荐

你的OLED屏和MPU6050为啥通信失败?从IIC的7位地址冲突讲起

本文深入解析OLED屏与MPU6050传感器在I2C总线上的通信故障,重点探讨7位地址冲突问题。通过分析I2C协议中的地址分配机制,提供硬件调整和软件调试的完整解决方案,帮助开发者有效排查和解决设备无响应问题。

weixin_26876073的博客 151

初学swift_004

下标操作,枚举和类的递归//: Playground - noun: a place where people can play import UIKit /****下标***********************/ class Teacher { var students = ["a","b","c"] subscript(i: Int) ->String { g

白月初的博客 604

AIGC实战指南:从提示词到工作流,掌握AI内容生成核心技能

人工智能生成内容(AIGC)作为当前AI技术的重要应用领域,其核心原理基于大语言模型(LLM)对海量数据的学习与模式识别。这项技术的价值在于将复杂的创作过程自动化,显著提升内容生产效率与创意实现的多样性。在实际应用中,AIGC已广泛渗透至文本创作、图像设计、音频合成及视频生成等多个场景,成为数字内容生产的重要工具。要高效运用AIGC,关键在于掌握提示词工程与模型微调等核心技能。例如,通过结构化提示词设计,可以精确引导模型生成符合预期的专业周报;而选择合适的微调模型,则能大幅提升图像生成的风格控制力与输出质量

weixin_26808439的博客 375

Dynamically creating keys/values in JavaScript associative array

http://stackoverflow.com/questions/351495/dynamically-creating-keys-in-javascript-associative-array

SalmonellaVaccine的专栏 832

CANOCO5.0实现冗余分析(RDA)最详细步骤

在地理及生态领域会常使用RDA分析,RDA的实现路径也有很多,今天介绍一下CANOCO软件的实现方法。1.不同样点和环境因子之间夹角是锐角 是正相关,是钝角是负相关。2.夹角越大 说明相关性较小,夹角越小,相关性越大。得有不同的物种或者样点数值,再加上环境因子数据。3.箭头越长 相关性越大。时间调整到2010年。

Along6的博客 1万+

告别Keil,在Windows上用VSCode + arm-none-eabi-gcc + Makefile搭建国产MCU开发环境(附JLink配置避坑)

本文详细介绍了如何在Windows上使用VSCode、arm-none-eabi-gcc和Makefile搭建国产MCU开发环境,替代传统的Keil和IAR。内容涵盖工具链配置、工程结构设计、Makefile编写、VSCode集成调试以及高效开发工作流,特别针对国产MCU如复旦微FM33系列提供了优化方案和避坑指南。

weixin_28729205的博客 434

第三十六章 : 数组

数组In the last chapter, we looked at how the shell can manipulate strings and numbers.The data types we have looked at so far are known in computer science circles asscalar variables; that is, variable...

卓越无关环境,保持空杯心态——靡不有初,鲜克有终 2565

HQChart实战教程64-自定义分时图标题栏

分时图标题栏显示的是当前十字光标所在位置的分钟信息,显示在分时图窗口顶部。一般会显示品种的名称,日期,时间,价格,均价 涨幅,成交量,金额等等,hqchart内置会显示这些信息。如果要额外显示其他的字段,就需要通过替换格式化标题输出函数来是现实。我们在hqchart实例创建完成以后,通过OnCreatedCallback回调函数替换自己的格式化输出函数。返回 { AryText:[ { Text:文字, Color:颜色},…入参 data={ Data: 当前十字光标所在位置的分钟线 }

小银 1056

linux shell 关联数组 hash

shell 的关联数组 Shell Associative Array    bashi没有原生的对于类似hash table的支持,不像perl或python. 下标数组元素是通过数组下标(数组下标可以是算术表达式,其结果必须是一个整数)来访问的,但是这种访问方式在表达某些关联性很强的数据时会存在限制。 shell 提供了另外一种数组,其可以使用任意的字符串作为下标(不必是整数)来访

ysdaniel的专栏 2万+

⚡【C++要笑着学】(13) STL介绍:什么是STL标准模板库 | STL的版本 | 浅谈STL的缺陷

再讲解函数模板之前先对STL做一个小铺垫,本篇将对STL做一个简单的介绍。

有道无术, 术尚可求。有术无道, 止于术。 3034

第18章:AI辅助Debug——如何将错误日志交给AI定位根因

> - 如何将错误日志、堆栈、代码片段组合发给AI,快速定位问题根因 > - AI分析错误的3个核心维度:环境差异、逻辑缺陷、并发竞态 > - 常见错误的AI分析Prompt模板(前端报错、后端异常、数据库错误、网络请求失败) > - 一个完整的调试案例:从用户报错到找出问题根源的全过程 > - 我如何用AI把平均调试时间从2小时缩短到20分钟

sfishfly的博客 44

交叉编译器 制作分析(CLFS2.0原理分析)

作者:冲天飞豹(youbest) 原文链接: http://www.linuxsir.org/bbs/showthread.php?t=267672 http://youbest.cublog.cn/ 更新日志 2006年9月28日:修改错字一处。 2006年8月30日:修改错误命令一处。 2006年8月22日:修改文字中的笔误两处。 2006年8月18日:修改图片中的笔误

1582

使用timeROC包的compare函数比较不同标记物下两个多时间AUC值是否具有统计显著性

时间依赖的接收器操作特征曲线(time-dependent receiver operating characteristic curve, time-dependent ROC curve)是评估和比较标记物在不同时间点上预测能力的重要工具。在R语言中,timeROC包提供了丰富的函数和工具,可用于分析和比较多时间点的AUC值。时间点(timepoints)表示观察的时间点,标记物1(marker1)和标记物2(marker2)分别表示在每个时间点上的预测概率。最后,我们输出比较结果。

2301_79331387的博客 921

alfs学习笔记-自动化构建lfs系统

一名linux爱好者,记录构建Linux From Scratch的过程 经博客园-骏马金龙前辈介绍,开始接触学习lfs,用博客记录学习笔记,如有写的不恰当的地方,望多多指正。笔记中只是记录一些问题和书中表述不清晰的内容的处理办法以及我的解决思路,仅做参考。 要实际构建lfs请结合lfs官方的书籍操作 一.lfs系列概述 1.lfs:Linux From Scratch(LFS)是一个项目...

weixin_30819163的博客 1119

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

云主机装黑果实践(1):deepin上qemu+kvm装黑果

本文关键字:用ubi在osx上打造一分区一安装启动U盘,deepin上qemu+kvm装黑果 在上文《云主机装黑果》中,我们讨论了其可能性,或许这里面的坑远远不止那文提到的,甚至最终不能成功。—— 但不管如何,实践总要先行。在理论与实践组成的一对学习矛盾中,先见独到的理论思考,与慢悠盲目的实践,都必不可少。现在让我们开始正式的实践。 我们在前面说到,现在最新的流行OS,如windows,ubt发行,osx,都是基于uefi机考虑的。同一个系统,安装在同一台pc的mbr或uefi模式下,表现结果和所需驱动都是

minlearn's techrepos 2971

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

将virtio集成slipstream到windows iso,winpe – 原生方法和利用0pe

本文关键字:集成srs到windows镜像,slipsrteam driver to windows iso,集成virtio到winpe,winpe集成virtio 目标: 制作一个winpe,使得其在virtio主机环境中可用,比如阿里云ECS或WEST263,godaddy云主机。 这种技术的本质是将srs驱动带入/植入需要这种驱动的镜像,让其在安装/启动过程中发现硬盘不蓝屏,且辅助其它安装过程继续到完成。这一般有二个步骤,第一步是将驱动手术式的植入iso,实现安装程序的对应这种srs设备的内部驱动支

minlearn's techrepos 2080

云主机装黑果实践(9):继续处理云主机上黑果clover preboot问题

本文关键字:clover fake display,unbound variable python_command, manual build compiling Clover from source,EDK2_REV,mac Merge lines between two patterns using sed, gnu sed vs bsd sed,sed同时匹配多个模式1管道符方式2多e选项3分号连接4大括号一次执行,sed同时匹配多个模式异与或模式,sed模式空间匹配多个模式循环内欠结构模式空间 在前

minlearn's techrepos 1867

普化群晖改造成正常磁盘布局及打开kernel message

__本文关键字:群晖显卡支持,dsm 6 console tty,打开console,让3.x linux使用graphical terminal as console,改变黑群原生磁盘布局,一种动态调整压缩镜像文件的方法。压缩0空间,及在linux上离线操作raid/llvm分区的方法,离线折腾黑群镜像,调整黑群剩余空间为存储空间。initrd加载二个gz,dd会复制uuid吗,debian上grub-install会自带device-map导致grub rescue__

minlearn's techrepos 1838

云主机装黑果实践(8):利用clover,离我们的目标更接近了

本文关键字:clover 黑底白苹果 无进度条,clover white screen,clover legcay bios video, clover force vesa mode, prevent Mojave switch video boot while booting,Resolution for General Protection Exception/ X64 Exception Type 0D Error 在文章7中我们讲到了使用clover来代替chameleon,因为似乎进行到上一文c

minlearn's techrepos 1800

共享在阿里云ecs上安装自定义iso的方法

本文关键字:阿里云 自定义iso,阿里云 自定义镜像 应用场景: 首先,最基本的目的:你想在云主机上安装自定义iso,比如一份精简或优化过了的镜像/高版本的系统镜像,而不是运营商提供给你的那些,或你想在在云主机上安装/ghost还原镜像变得跟本地一样方便而不用总是依赖于后台备份。 还比如,你想在阿里云海外linux主机上安装windows,但又不想花一月多出来的那20多元,这就要求winpe具备从linux完全转换到windows磁盘格式和系统的功能,再在这基础上安装自定义ISO。借助winpe virti

minlearn's techrepos 1711

云主机装黑果实践(5):重得到镜像和继续强化前置启动过程

本文关键字:,hackintosh Cirrus Logic GD5446,OS X,GD5446 kext,黑苹果 vga兼容 花屏,黑苹果 虚拟机 显卡驱动 在前文中,我们解决了大量启动测试前的关键问题,但还不算进入了真正的黑果适配机型的关键步骤,因为有一些前置问题依然存在, 1,关于前文那个编译后的变色龙有时在grub2+memdisk下启不动的问题,有没有永久解决法,有没有解法使kvm的ignore_msrs在guest端实现? 2,鉴于前面文章提到的云机适配问题,有没有方法在qemu中尽可能虚拟出

minlearn's techrepos 1456

云主机装黑果实践(6):处理云主机上变色龙启动后置过程:驱动和黑屏

本文关键字:无显驱vesa方式驱动osx10.14,mojave vga黑屏,云主机的显示器,非n非a卡黑果,waitting for root device,apfs modules stop 1432,appleexclude.kext,can’t determine on the same uuid,qemu virtual display,qemu vga glitch,starting darwin x86就黑屏, osx cascadelake 黑屏, 变色龙 skylake 黑屏 在前面5篇系

minlearn's techrepos 1394

使用群晖作mineportalbox(3):在阿里云上单盘安装群晖skynas

本文关键字:将群晖安装在阿里云主机上,skynas系统盘和数据盘同盘。mineportal3硬件选型,webpe,提取群晖webpe,使用webpe代替diskbios 在前面我们讲到省事直接使用白群晖的方式,和提到一些需要hacker的地方,有些时候,正规一成不变的方式和硬件的方式有时的确是难于忍受的。从本篇开始我们探究一些群晖的奇特面,比如将其安装在云主机上的方式。比如阿里云。 阿里云上的群晖官方发布了一个skynas,我们知道群晖是靠卖软件卖硬件的,那么阿里云当硬件的情况下,它只能对镜像收费了,阿里云

minlearn's techrepos 1315

在阿里云上装黑苹果(1):黑苹果基础

本文关键字:云mac当局域网第二mac用,本地盘与网盘组raid 我们在很多地方谈到,苹果之所以好用,是因为mac产品家族间注重融合,比如ipad os与osx是完全不一样的系统,但它们可以交互,他们是生态层面,加以技术辅助的融合,并不是从0开始就纯粹技术融合的,比如共用完全一样的内核,etc…—— 不管如何,这也使得苹果的产品非常难于部分替代的方式去整体代替,除非整个弃用。 苹果在现代OS软硬件的各个层次都有自己的定制,小到硬件(nvme硬件,disk format,bootcamp, NVRAM。etc

minlearn's techrepos 1248

一种混合包管理和容器管理方案,及在tinycorelinux上安装containerd和openfaas

本文关键字:在tinycorelinux上装docker,virtual appliance vs virtual appstack,no cgroup mount found in mountinfo: unknown,jailing process inside rootfs caused: pivot_root invalid argument: unknown 在《利用openfaas faasd在你的云主机上部署function serverless面板》 和《panel.sh:一个nginx+d

minlearn's techrepos 1165

使用群晖作mineportalbox(1):合理且不折腾地使用群晖硬件和套件

本文关键字:群晖,mineportalbox 在前面《免租用云主机将mineportal2做成nas》《使用树莓派和cloudwall打造个人云》中,我们从软硬结合的角度,提出了二种代替云主机,使云设施不再受远程托管的方案,毕竟,数据在身边才是安心的,这样的一个可同步体和手边的云盒子它更符合我们一直想给它定的名字:mineportal 为什么呢?因为它是优先在内网使用的,只有在对公服务时才需要寻求内网穿透的这样的方案,所以更适合portal to public这个“portal”。----- 因为现在加了盒

minlearn's techrepos 1073
上一篇: 一个fully retryable的rootbuild packer脚本,从0打造matecloudos(2):以lfs9观点看compiletc tools
下一篇: 一种混合包管理和容器管理方案,及在tinycorelinux上安装containerd和openfaas
Minlearn
博客等级 码龄18年 20粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值