openSUSE diagnose


#1

嗯,想把一些想法实现了…目前主要有以下三个:

  1. installed packages,instdpkg 想要解决这么一个情境:我就更新了一下,就不能用了。我也不知道/忘了更新过什么。其实 zypper 的 log 一直都存着,只是许多人不会看(能这么提问自然不会看日志的居多)。

主要结构就是一个 filter + parser,按日期和时间把那次操作安装的包筛选出来,然后用漂亮的格式显示在终端上面。结合下面要说一个想法到时甚至能把文件变动都找出来。

这样不但方便了用户(提供信息更加靠谱),也方便了帮忙的人(更稳了,也不用肉眼去筛日志了)。

  1. packman switcher,pkmswch 想要解决的情境是:我把解码器包切到 packman 源了,但是可能没有切换完全,造成比如之前解决过的一个问题那样,ffmpeg 能剪切视频但是因为用的 oss 的 libavformat57 导致不能封装成 mp4。这样的问题很难调试,尤其在用户言之凿凿地告诉你他用的就是 packman 的包时。一个 pkmswch 甩过去,全知道了。

做起来也挺方便的,就是把 oss 里对应包的版本找出来,只要 release number 一样就可以判断是同一个包啦(在 packman 编译和 obs 编译出的包的 release number 鲜有相同)

  1. tw-wayback,wayback 想要解决的事情就是,给 openSUSE_Tumbleweed 加一个 rollback machine。但要足够简单,像 Arch Linux Archive 那样的是不行的,因为第一没有服务器,第二运维的工作量太大。

目前的想法是做一个在服务区和本地都能跑的。目标是在本地存储的东西尽量少。想法是先存一下 tumbleweed 的 metadata,里面包括了那个基准版本的源里所有软件的版本号,下次 tw 更新时(这个没必要做 watchdog,因为用户自行运行的话,只需要现在所用系统的关键软件的版本号,也就是说,他升级完了自己存一份 metadata 就行了,服务器另当别论),再下一份最新的 metadata,与老的比较,把更新的软件筛出来,然后利用 deltarpm 工具做一个可以用它把新版本降为老版本的差值rpm,保存即可。tw 每次更新都不大,所以存储空间应该也不大。

这样,某个包出问题就可以回退,甚至直接回滚到上一个版本的 tumbleweed。当然用 snapper 更好一些,可是不是每个人都会用也不是每个人都有 btrfs 分区。

从我的 iPhone 发送,使用 Tapatalk


关于 ffmpeg 更新 libavformat57 之后的问题
42.2的多媒体怎么这么麻烦?
#2

repo 已经建好,就等代码了 :slight_smile:

已经把第一个想法实现了,下载即可体验

instdpkg

用起来挺简单的:

instdpkg -timeline

查看你都哪天安装或者卸载软件了.

instdpkg -date=2016-12-23 -time=02:24:00

显示那天从那个时间开始到那天结束安装的所有包.-time 选项可以省略,显示全天的包.如果那天你指的是今天的话,-date 选项也可以省略.

结果的显示超漂亮:

================ Packages modified on 2016-12-22 after 23:26:12 ======================
|        time      | action | name | version | arch | repo |
2016-12-22 23:39:36|install|libavformat57|3.2.2-3.3|x86_64|packman
2016-12-22 23:26:12|install|libgstbasecamerabinsrc-1_0-0|1.10.2-4.7|x86_64|packman
2016-12-22 23:26:12|install|libgstphotography-1_0-0|1.10.2-4.7|x86_64|packman
2016-12-22 23:26:12|install|gstreamer-plugins-ugly|1.10.2-4.2|x86_64|packman
2016-12-22 23:26:13|install|libgstbadvideo-1_0-0|1.10.2-4.7|x86_64|packman
2016-12-22 23:26:13|install|libgstbadaudio-1_0-0|1.10.2-4.7|x86_64|packman
2016-12-22 23:26:13|install|libgstadaptivedemux-1_0-0|1.10.2-4.7|x86_64|packman
2016-12-22 23:26:14|install|gstreamer-plugins-bad|1.10.2-4.7|x86_64|packman

以后如果论坛里哪个用户再说出比如"我不知道我装什么了","我忘了我装什么了",丢出去很 geek.


#3

:1:


#4

又搞定一个 pkmswitch100

这个工具是 ** 确保把系统包切换成 packman 版本时,切换了所有相关的包,不至于造成一半一半的情况 ** .
以后在遇到关于 packman 包的一些诡异问题的时候可以建议用户先跑一下我这个工具,有很大几率解决问题,因为一般来说 repo-oss 和 packman 源不太会出错.

比如一些用户自己安装 ffmpeg,直接 sudo zypper in ffmpeg,那很大可能安装的其实是 repo-oss 里面的阉割版 ffmpeg.
因为无论是你之前安装别的软件,或者是系统自带的软件,都可能依赖了 ffmpeg 的 library 比如 libavcodec57,没加 packman 源之前肯定是用系统包就是那个阉割版咯.
而 zypper/YaST 默认是不允许把已安装的包从一个源中的版本更新到另一个源中的版本的,那么为了保证一套包的连贯性(毕竟 ffmpeg 自身肯定依赖了它自己的 library),
ffmpeg 也只能给你装系统版本的了;或者只把 ffmpeg 本身装了 packman 的,因为已安装包默认不允许换源,自动解决器只能做这样的处理.

用 YaST 装一般不会造成上面的问题,因为有版本选项卡可以给你选,但产生了另一个问题,就是用户可能只把 ffmpeg 自身的版本切到了 packman,
而其它已安装的 library 没有去管它.

这个的目的就是为了解决以上那些也可以说是粗心,不了解,也可以说是 openSUSE 下比较特殊的常见问题.

需要注意的是: ** 这个工具只会处理你已经安装了的包.如果不是 packman 的版本,就提示;如果是 packman 的版本,但不是最新的,也会提示.所以可以作为一个更新助手,但不能作为一个初装工具.**
初装工具我后续会做出来.

提示是这样的:

======================= Packages not from Packman =========================
libavformat57

FIX: Run 'sudo zypper install libavformat57-3.2.2-3.4.x86_64'.
======================= Packman Packages need updates =====================
libavutil55
ffmpeg
libavfilter6
libpostproc54
libavcodec57
libswresample2
libswscale4
vlc-lang
gstreamer-plugins-ugly-orig-addon
libavdevice57
libavresample3

FIX: Run 'sudo zypper up libavutil55 ffmpeg libavfilter6 libpostproc54 libavcodec57 libswresample2 libswscale4 vlc-lang gstreamer-plugins-ugly-orig-addon libavdevice57 libavresample3'.

使用方法:

0. 你的 packman 源的名字必须叫 “packman” .我知道这个注意事项有点傻,但确实是有一些新用户手动添加源的时候会把它命名成其它奇奇怪怪的.
1. 运行一下 “sudo zypper ref” 刷新源 .保证源的 metadata 是最新的.不是最新的也能查出来是不是 packman 包,但提供的解决方案里面的版本号就不准了.
2.在终端运行 “ruby pkmswitch100.rb”


#5

又搞定一个: bstmirror

就像名字说的那样,它会告诉你, 对你来说最快的 openSUSE 和 packman 镜像分别都是什么.

ruby --version # 看看你系统 ruby 的版本号,比如是 2.2.5p319
sudo zypper in ruby2.2-rubygem-nokogiri # 安装一个库,我用它来过滤网页标签的.
ruby bstmirror.rb -region="Asia" -os=422

region 选项有以下几个值:Africa, Asia, Europe, North America, South America, Oceania.对应的是大洲.

os 选项有以下几个值:tw, 422, 421.相信也不用多解释,就是发行版的版本啊.

还有一个 file 选项,有两个值:quick 和 long,默认是 quick.说白了就是在进行速度测试的时候下载的文件的大小,文件越大测试越接近真实安装软件包时候的情况,当然跑起来等的时间就越长.

得到的结果就很引人入胜了:

======================= Best openSUSE Mirror ======================
http://mirrors.tuna.tsinghua.edu.cn/opensuse/
======================= Best Packman Mirror =======================
http://mirror.karneval.cz/pub/linux/packman/ (这里就不准了吧,建议多跑几遍,在我这儿大文件其实是华中科大的最快,用小文件测试有其随机性)

再配合我马上就要开发出来的 mirrorswitch 工具,分分钟换最快的源不是梦.

这里需要说的一点是,目前我采用的是相信官方数据的模式.但是其实官方数据对某几个源是失真的,原因不详,比如华中科大的源,在官方的 flag 显示没有 tumbleweed, 42.2 和 42.1.
但是显然有,后面会针对所有 flag 都没有的源加上一个访问测试,防止把真正最快的源遗漏掉.

PS: 华中科大源我也不知道什么原因,估计是主域名禁用了 ping 的缘故.


#6

再开一个 grub2-debug,这次用 golang 写,这样依赖就足够小,小到可以在 rescue system 中执行。

就像这个帖子一样,能把所有需要的信息一次性全部采集完。


#7

另外做了一个 rescue-network,也是用 golang 写确保依赖最小化。能够在终端上网的:

rescue-network -device=wifi -gateway=192.168.31.1 -netmask=255.255.255.0 -essid=MyHomeNetwork --password=12345678

#8

谁能给我看下 /sys/firmware/efi/vars/SecureBoot-/data 和 /sys/firmware/efi/vars/FastBoot-/data 的内容,我服务器上连 UEFI 都没有…


昨夜升级nvidia一个什么东西 进不了图形界面 现在连grub都毁了
#9

我的里面没有数据~~


#10

我这目录也是没有。

苏姐厉害丫,看你的github,继ruby之后又有了擅长的。


#11

@liangzi @无尽破碎

不是 SecureBoot-,/sys/formware/efi/vars 下面有个 SecureBoot 和 FastBoot 开头的文件夹,我要分别看里面的 data。

golang 还好啦,难得不会写,基本语法在过年时候学了一下


#12

rescue里没有wicked吗?


#13

FastBootOption ,附件是压缩包 ,SecureBoot 没有,现代的新主板 Secuboot 变成强制标准厂商只要一偷懒就全变成自适应没有选项,可能要找个低一些版本号的板子手动指定 SecuBoot:enable 才会有

fastboot.pdf (1.2 KB)


#14

看不懂报错?直接看那个文件(/var/log/zypp/history)是有安装/移除的。

 D/cache instdpkg -d= "2018-0308"                                                                                                            (%1) 
Traceback (most recent call last):
/home/mxo/bin/instdpkg:69:in `<main>': undefined method `empty?' for nil:NilClass (NoMethodError)
 D/cache                                                                                                                                 (%1) (1) 
 D/cache instdpkg -d= "2018-03-08"                                                                                                           (%1) 
Traceback (most recent call last):
/home/mxo/bin/instdpkg:69:in `<main>': undefined method `empty?' for nil:NilClass (NoMethodError)
 D/cache chmod 0766 ~/bin/instdpkg                                                                                                           (%1) 
 D/cache instdpkg -d= "2018-03-08"                                                                                                           (%1) 
Traceback (most recent call last):
/home/mxo/bin/instdpkg:69:in `<main>': undefined method `empty?' for nil:NilClass (NoMethodError)

#15

应该是你用的时间参数有问题

Screenshot_2018-03-12_09-50-02

-d= 后面没有空格的


#16

嗯,太有误导性了。。


#17

这个似乎是 discourse 迁移时候的问题


#18

而且遇到的cli程序基本是
这样的, 或者支持了这些再支持等号。。嘿
cmd --option(-o) value