Ubuntu-SystemTap+Docker安装和使用过程中的各种问题记录
一. 安装新系统时的常用基础配置(Ubuntu16.04)
1. Google拼音输入法
参考:https://blog.csdn.net/u011795345/article/details/53041707
// 安装汉语语言包 $ sudo apt-get install language-pack-zh-hans // 安装谷歌拼音输入法 $ sudo apt-get install fcitx-googlepinyin // 打开SystemSettings-->Language Support,系统会进行语言包搜索,照系统提示安装语言包 // keyboard input method system”为:fcitx。 // 重启电脑 // 进行输入法配置 $ fcitx-configtool // 点击左下角的+号加入Google pinyin
2. 切换成aliyun源
参考:https://blog.csdn.net/qq_45067943/article/details/105183727
1. systemSettings-Software&updates-other 2. 选择China-选择阿里云源 3. reload
3. sudo apt-get update时报错lock
参考:https://blog.csdn.net/qq_42393859/article/details/84950337
E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable) E: Unable to lock the list directory 解决办法: $ sudo rm /var/cache/apt/archives/lock $ sudo rm /var/lib/dpkg/lock 如果报错为lock-frontend相关 那么添加再执行一句 $ sudo rm /var/lib/dpkg/lock-frontend
至于为什么新装的电脑还没有apt-get装任何工具,第一次在命令行使用时就显示lock。参考的解释为”刚装好的Ubantu系统,内部缺少很多软件源,这时,系统会自动启动软件源更新进程“apt-get”,并且它会一直存活。由于它在运行时,会占用软件源更新时的系统锁(以下称“系统更新锁”,此锁文件在“/var/lib/apt/lists/”目录下),而当有新的apt-get进程生成时,就会因为得不到系统更新锁而出现"E: 无法获得锁 /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)"错误提示“
4. 自己添加下载源,sudo apt-get update时报错
正在读取软件包列表... 完成
W: 仓库 “http://ddebs.ubuntu.com xenial-security Release” 没有 Release 文件。
N: 无法认证来自该源的数据,所以使用它会带来潜在风险。
N: 参见 apt-secure(8) 手册以了解仓库创建和用户配置方面的细节。
E: 无法下载 http://ddebs.ubuntu.com/dists/xenial-security/main/binary-amd64/Packages 404 Not Found
E: 部分索引文件下载失败。如果忽略它们,那将转而使用旧的索引文件。
在系统设置-软件及更新-其它软件中,把报错的下载源前面的勾选 去掉
ly@ubuntu:~/Desktop/systemtap_scripts$ sudo apt-get update Hit:1 http://archive.ubuntukylin.com:10006/ubuntukylin trusty InRelease Hit:2 http://mirrors.tuna.tsinghua.edu.cn/ubuntu xenial InRelease Get:3 http://mirrors.tuna.tsinghua.edu.cn/ubuntu xenial-updates InRelease [109 kB] Get:4 http://mirrors.tuna.tsinghua.edu.cn/ubuntu xenial-backports InRelease [107 kB] Get:5 http://mirrors.tuna.tsinghua.edu.cn/ubuntu xenial-security InRelease [109 kB] Fetched 325 kB in 3s (88.7 kB/s) *** Error in `appstreamcli': double free or corruption (fasttop): 0x0000000001367950 *** ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x77725)[0x7ff8ca918725] /lib/x86_64-linux-gnu/libc.so.6(+0x7ff4a)[0x7ff8ca920f4a] /lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7ff8ca924abc]
Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/cache/app-info -a -e /usr/bin/appstreamcli; then appstreamcli refresh > /dev/null; fi'
对于这两个报错,google了一下发现相应的解决办法是执行sudo apt purge libappstream3,从而清除stream。但是这招对我没用
后来分析这个问题的出现可能是在于我第一次切换镜像源加载的时候突然断网,导致reload步骤中断,从而出现这个问题。所以尝试直接是在software&update时,切换了镜像源,reload的时候系统重新加载了目录,解决了问题。
5. 分辨率
我刚装好的机器,分辨率只有800x600,而且在systemsettings-display里面也没有办法切换,使用xrandr也解决不了。
以下为几种情况的解决办法
5.1 修改grub
$ sudo vim /etc/default/grub 把文件中的GRUB_GFXMODE=800x600,改成想要的分辨率,比如我的屏幕分辨率是3840x2160 $ sudo update-grub 重启生效
5.2 显卡驱动未安装
我是nvidia的显卡,首先判断自己的显卡驱动是否安装
ly@ly-ubuntu:~$ nvidia-smi
nvidia-smi: command not found
那我这个显卡驱动是没有安装的,但是很奇怪的是...替换了内核之后,分辨率就显示正常了,我只进行了5.1步骤中对分辨率的修改
参考的nvidia显卡驱动安装的博客:
https://www.cnblogs.com/fanminhao/p/8902296.html
https://www.jianshu.com/p/d1ae5d7a5424
6. 使用dpkg时报错
dpkg: error: dpkg status database is locked by another process ly@ubunru:~/Desktop$ ly@ubunru:~/Desktop$ ^C ly@ubunru:~/Desktop$ sudo rm /var/lib/dpkg/lock ly@ubunru:~/Desktop$ ly@ubunru:~/Desktop$ sudo dpkg --configure -a ly@ubunru:~/Desktop$ ly@ubunru:~/Desktop$ sudo rm /var/lib/ap apparmor/ app-info/ apt/ ly@ubunru:~/Desktop$ sudo rm /var/lib/apt/lists/lock
7. 执行apt-get update时,报错KeyEXPIRED
Reading package lists... W : GPG error: http://nginx.org jessie InRelease: The following signatures were invalid: KEYEXPIRED 1471427554
首先查看哪个key过期了,然后再更新
$ apt-key list ---> Running in b6056a377274 /etc/apt/trusted.gpg -------------------- pub 2048R/7BD9BF62 2011-08-19 [expired: 2016-08-17] uid nginx signing key <signing-key@nginx.com> /etc/apt/trusted.gpg.d/debian-archive-jessie-automatic.gpg ---------------------------------------------------------- pub 4096R/2B90D010 2014-11-21 [expires: 2022-11-19] uid Debian Archive Automatic Signing Key (8/jessie) <ftpmaster@debian.org> /etc/apt/trusted.gpg.d/debian-archive-jessie-security-automatic.gpg ------------------------------------------------------------------- pub 4096R/C857C906 2014-11-21 [expires: 2022-11-19] uid Debian Security Archive Automatic Signing Key (8/jessie) <ftpmaster@debian.org> /etc/apt/trusted.gpg.d/debian-archive-jessie-stable.gpg ------------------------------------------------------- pub 4096R/518E17E1 2013-08-17 [expires: 2021-08-15] uid Jessie Stable Release Key <debian-release@lists.debian.org> /etc/apt/trusted.gpg.d/debian-archive-stretch-automatic.gpg ----------------------------------------------------------- pub 4096R/F66AEC98 2017-05-22 [expires: 2025-05-20] uid Debian Archive Automatic Signing Key (9/stretch) <ftpmaster@debian.org> sub 4096R/B7D453EC 2017-05-22 [expires: 2025-05-20] /etc/apt/trusted.gpg.d/debian-archive-stretch-security-automatic.gpg -------------------------------------------------------------------- pub 4096R/8AE22BA9 2017-05-22 [expires: 2025-05-20] uid Debian Security Archive Automatic Signing Key (9/stretch) <ftpmaster@debian.org> sub 4096R/331F7F50 2017-05-22 [expires: 2025-05-20] /etc/apt/trusted.gpg.d/debian-archive-stretch-stable.gpg -------------------------------------------------------- pub 4096R/1A7B6500 2017-05-20 [expires: 2025-05-18] uid Debian Stable Release Key (9/stretch) <debian-release@lists.debian.org> /etc/apt/trusted.gpg.d/debian-archive-wheezy-automatic.gpg ---------------------------------------------------------- pub 4096R/46925553 2012-04-27 [expired: 2020-04-25] uid Debian Archive Automatic Signing Key (7.0/wheezy) <ftpmaster@debian.org> //直接看过期的key $apt-key list | grep “expired:” //更新 apt-key adv --recv-keys --keyserver keys.gnupg.net [KEY] //如apt-key adv --recv-keys --keyserver keys.gnupg.net 7BD9BF62
二. Kernel debug symbol
安装教程:https://yaapb.wordpress.com/2012/12/28/debugging-your-running-kernel-in-ubuntu/
需要注意的是,下图红框步骤中建立链接的是linux-source-3.2.0/linux-source-3.2.0,但我们现在所在的位置是linux-source-3.2.0,所以需要cd ..返回至上一级目录
移除符号链接,https://www.jb51.net/article/170752.htm
// 进入符号链接存在的位置,执行 # unlink linux-source
同时,kernel debug symbols的安装按照博客中的方式下载实在太慢了。。。因为连接的是外网,如果没有FQ,极其慢,800M的文件下6个多小时就绝望。。。
所以可以去网站(http://ddebs.ubuntu.com/pool/main/l/linux/)下载自己版本对应的debuginfo安装包,然后执行安装
// 查看自己系统的内核版本号 ly@ubuntu:~$ uname -r 4.4.0-203-generic // 比如我这个内核版本,系统是64位的,那么对应的安装包就是:linux-image-unsigned-4.4.0-203-generic-dbgsym_4.4.0-203.235_amd64.ddeb // 在ddeb安装包存放的位置执行安装指令 ly@ubuntu:~/Desktop$ sudo dpkg -i linux-image-unsigned-4.4.0-203-generic-dbgsym_4.4.0-203.235_amd64.ddeb
三. Ubuntu系统内核替换
由于4.15.0-x的内核,存在让我无法解决的问题...(https://github.com/tbsdtv/linux_media/issues/105),所以我试图在4.15.0-x的系统上替换成低版本的4.4.0-200的内核
按照的执行教程:https://www.cnblogs.com/liuwu265/p/4228027.html
https://blog.csdn.net/zhaogang1993/article/details/79514344
需要注意的是第5)步,可以按照自己的核个数,来设置。比如我是8核,这样设置,可以使得8核多线程编译,会比较快
而且这样替换后的版本形式可能就不一样了,如4.4.0-200对应的是4.4.200,因此如第二部分安装内核调试符号可能就不能通过替换内核解决。
因为版本不一致,会导致安装linux-tools(sudo apt-get install linux-tools-common linux-tools-3.2.0-31)时,出现找不到linux-tools-4.4.200安装包的问题,并且安装linux-tools-4.4.0-200-generic也无法使用
四. Docker的安装
本身的系统是Ubuntu16.04,参考的安装教程:https://www.runoob.com/docker/ubuntu-docker-install.html
// 我使用的直接是这个直接安装的指令,通过镜像整个下载和安装的过程也还比较快 $ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun // 验证是否安装成功 $ sudo docker run hello-world
在命令使用过程中遇到了:ConnectionError: ('Connection aborted.', error(2, 'No such file or directory'))
参考解答:https://github.com/docker/docker-py/issues/1334
总结起来,解决我该一问题的方法是,在执行docker相关操作之前记得先关闭docker,然后需要的时候再开启
$ sudo service docker stop
也不排除解决这个问题是由于我执行了nginx的安装操作,建立了某些文件,这条纯猜想(https://www.runoob.com/docker/docker-install-nginx.html)
五. SystemTap的安装及使用
这个安装参考我的博文:https://www.cnblogs.com/lyeeer/p/14406957.html
使用过程中(当我重启虚拟机中的Ubuntu系统)遇到了问题:
semantic error: type definition 'task_struct' not found in 'kernel<linux/sched.h>'
解决这个问题,首先需要去查看自己的kernel版本是否发生了变化(虽然我也觉得很奇妙,但是我确实遇到了这样的问题。。。)
比如我出现这个问题的时候,重启前内核版本为4.4.0-21,重启后的内核版本为4.4.0-203,当然使用systemTap时内核版本不一致了。
解决起来就需要参考第二部分,重新安装kernel debug symbols
去网站(http://ddebs.ubuntu.com/pool/main/l/linux/)下载自己版本对应的debuginfo安装包,然后执行安装
// 查看自己系统的内核版本号 ly@ubuntu:~$ uname -r 4.4.0-203-generic // 比如我这个内核版本,系统是64位的,那么对应的安装包就是:linux-image-unsigned-4.4.0-203-generic-dbgsym_4.4.0-203.235_amd64.ddeb // 在ddeb安装包存放的位置执行安装指令 ly@ubuntu:~/Desktop$ sudo dpkg -i linux-image-unsigned-4.4.0-203-generic-dbgsym_4.4.0-203.235_amd64.ddeb
还有一个问题是我在使用systemtap捕获执行脚本时,在pass4时报错"ERROR: Couldn't insert module '/tmp/stap1fSq2k/stap_25649.ko': Invalid module format",这个确实困扰了我很久。。。
然后我找到一篇相关的博文:https://sourceware.org/bugzilla/show_bug.cgi?id=24720#c1
是由于guru模式的问题,但是由于我的stp脚本中嵌入了C语言代码,所以不可能去掉-g,那么解决方法就是在执行命令中添加-B CONFIG_MODVERSIONS=y
如我的执行命令如下:
$ sudo stap -B CONFIG_MODVERSIONS=y -g home/ly/Desktop/LiCShield-master/LiCShield-master/tracing_tool/systemtap_scripts/tracer.stp -DSTP_NO_OVERLOAD -DMAXSTRINGLEN=4096 -v -c /usr/bin/docker -d -o /root/results/nginx_test_0/build_trace.txt
在4.15.0-x的内核中执行stap命令报错error: implicit declaration of function 'ACCESS_ONCE'
这个看到一个相关博文:https://github.com/tbsdtv/linux_media/issues/105
但我仍然没有解决这个问题...