• Linux实战篇(一):Deepin20.4 离线软件源


    需求背景是 有一台 内网的电脑上装了一个 Deepin20.4 (基于Ubuntu 20.4),它自带了一些软件但我还想装更多的软件。 内网的这个Deepin能下载东西,但不不能上传东西,也就不能向平常一样在终端  使用 apt install 命令安装软件,手动去 ubuntu官网下载难以解决递归式的依赖。所以我转为在连网的电脑上 制作一个离线软件源,这个软件源只包含内网电脑上需要的软件包。离线软件源做好后再传到内网Deepin 去安装。

    一 . 获取初始Deepin系统上已经存在的软件

    目的是避免下载内网 Deepin 已经有了的软件包。 终端输入命令  dpkg -l  你会看到啥? 一大堆 信息,我们需要哦的只是 其中的软件名,利用文本流处理命令中的 awk 命令 取第二个字段: dpkg -l | awk '/[hi]i/{print $2}'  ,其中的 | 代表管道,使得 dpkg  -l  的标准输出 作为 awk 的标准输入。  awk 中的  / [hi]i / 被斜杠包着,是正则表达式,[ hi ] 代表此处有一个字符并且是  h 或者 i 中的一个,后面的 print $2 表示打印匹配行的  第二个字段 。 awk  行中字段的分法是  空格, 可以用 awk -F fs 把分隔符 设成其他符号。经过awk 语句 过滤 得到如下形式:

    nvidia-egl-icd:amd64
    nvidia-egl-icd:i386
    nvidia-installer-cleanup
    nvidia-kernel-common
    nvidia-kernel-dkms

    后面的 :amd64 ,:i386 指示的是平台架构,使用  apt-get download  debname  (debname 代表软件包名)时候,这些东西是不需要的,再用sed 命令过滤掉,最后 用重定向 符 > 将结果保存到文件: dpkg -l | awk '/[hi]i/{print $2}'|sed -e 's/:.*//g ' > originalhave ,sed  命令中的 s 代表 substitute (替换),s 后面紧跟的符号作为后面的参数分隔符,这里是斜杠 / ,换成! 或者其他也是可以的,  / :.*/  中的 冒号代表这个字符串就是 冒号开头,后面的 . 下点号 代表任意字符( 有不能代表的字符吗?),下点号后面的 星号 × 是修饰这个 下点号的, 表示这个任意字符长度任意,最后的 g 代表 global 就是说对awk 标准输出传过来给 sed 的全部字符流都都执行这样的  命令。结果重定向到了 originalhave 文本文件。

    二. 获取软件递归依赖

     1 #! /bin/sh
     2 
     3 #该脚本放到 软件包所在文件夹执行
     4 
     5 SAMEDIR_DEB=samedirdebs
     6 OUTPUTLIST=needlist
     7 TMPOUT=tmpneedlist
     8 
     9 echo "`date` start"
    10 ls | grep ".deb$" | sort | uniq > $SAMEDIR_DEB         #当前文件夹含有的  。deb 软件包
    11 cat $SAMEDIR_DEB
    12 echo "up is curhave"
    13 echo ""
    14 echo `date`
    15 echo ""
    16 if [ -n "$1"  ]; then          #输入非空,收集 第一个参数(软件) 的递归依赖 ,该功能未完善
    17     echo $#
    18     #for i in range $# ;do
    19     #    echo ${$i}
    20         apt-cache  depends $1 -i --recurse |grep -v "破坏:"| tr -d "|,<,>, " | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'|sed -e 's/^依赖://g'|sed -e 's/^推荐://g'|sed -e 's/^建议://g'|sed -e 's/^预依赖://g' |sed -e 's/:.*//g '|sort | uniq >>$OUTPUTLIST
    21      #done
    22 
    23 
    24 else                                                     # 收集此脚本所在目录 的软件 的 递归依赖
    25     
    26     echo "update current directly"
    27     for i in `cat $SAMEDIR_DEB | sed -e 's/_.*//g'`; do    #此脚本所在目录中 git_1%3a2.20.1.1-2deb10u3dde_amd64 这种 只 截取 git 去搜索递归依赖  
    28         echo "##------------->>"
    29         echo $i
    30         apt-cache  depends $i -i --recurse |grep -v "破坏:"| tr -d "|,<,>, " | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'|sed -e 's/^依赖://g'|sed -e 's/^推荐://g'|sed -e 's/^建议://g'|sed -e 's/预依赖://g' |sed -e 's/:.*//g '|sort | uniq >>$OUTPUTLIST
    31         echo "<<------------##"
    32         echo " "
    33     done
    34 
    35 
    36 fi
    37 
    38 cat $SAMEDIR_DEB $OUTPUTLIST | sort | uniq > $TMPOUT       # 需要创建临时文件,不能  cat  a  b | sort | uniq > b。反之 b 可能会被置空。
    39                                                                #同时也是将当前文件加 已经有了的软件加到 临时需求列表,再 在下面的命令中 
    40                                                               #用uniq -u 在需求列表中减去当前文件夹已经有了的软件。
    41 cat $TMPOUT $SAMEDIR_DEB | sort |uniq -u >$OUTPUTLIST     # 取两文件中不同的部分输出
    42 
    43 
    44 
    45 #在 内网Deepin 刚刚装好系统时 获取已有文件:
    46 # dpkg -l | awk '/[hi]i/{print $2}'|sed -e 's/:.*//g ' > originalhave   # 这个命令在内网Deepin执行
    47 # originalhave 文件放到 脚本相同文件夹
    48 #再学习上面的语句 得到
    49 
    50 
    51 cat $OUTPUTLIST  originalhave | sort | uniq > $TMPOUT      
    52                                                                                                                 
    53 cat $TMPOUT originalhave | sort |uniq -u >$OUTPUTLIST     # 取两文件中不同的部分输出为 最终需求列表。
    54 
    55 #下载:
    56 for i in `cat OUTPUTLIST ` ; do   # 注意这里不是单引号 ,而是 电脑键盘左上角 波浪线号 一个位 的 ` `, 叫反引号
    57     echo " "
    58     echo " "
    59     echo "start download $i:"
    60     apt-get download $i                        #有时候 下载卡住 ,可以考虑优化脚本跳过。
    61 
    62 done    #下载完这么多的依赖包后,这个文件夹 里太多deb 包了。再次执行这个脚本会遍历大量的软件的依赖,估计会很慢,考虑修改中。

    写完这个脚本记得 [ chmod u+x 脚本名  ] 或者暂时 [ chmod 777 脚本名 ]给脚本赋予执行权限。

    三. 制作离线软件包 Release /InRelease / Release.gpg:

    看这个吧:ubuntu制作离线源的几种方法 - 法斯特 - 博客园 

    四. 参考资料:

    如何创建本地APT存储库? --Qastack


    apt如何列出所有已经安装的软件包 - 嗯是神经蛙 - 简书 

     
      

    << 转载需注明出处 >>
  • 相关阅读:
    Connection parameters are correct , SSL not enabled
    log4j配置文件的详解
    java.lang.IllegalArgumentException: addChild: Child name '/SSHE' is not unique
    MYSQL的三种注释
    Oracle19c 单节点ASM 存储模式数据库实例搭建过程
    [专题]中立遭质疑,提价遭反对,ARM的生存难题怎么破?
    快速排序的理解
    chrome审查元素功能,web开发强大帮手
    MyEclipse Server view报错解决方法
    把Java程序打包成jar文件包并执行
  • 原文地址:https://www.cnblogs.com/Huae/p/14071645.html
Copyright © 2020-2023  润新知