ubuntu日常使用指南

目录

  • ubuntu日常使用指南
    • 换源
    • 开发相关的基本包
    • vimrc
    • python, pip
    • zsh, oh-my-zsh, josh
    • 配置android相关环境
    • 查看库文件(libxxx.a/libxxx.so,动态静态库均可)是哪个编译器生成的
    • ldd查看动态库的依赖项
    • nvidia-smi反应慢
    • 查找ppa软件包
    • U盘启动ubuntu(安装),进不去桌面
    • 安装软件包/编译常见软件包
      • 查找包
      • 安装软件到系统路径
      • 编译时提示头文件找不到
      • 双“重定向”
      • 装ffmpeg
      • 编译安装opencv和opencv contrib 以及python接口
      • 编译安装protobuf3.2
      • py-faster-rcnn
      • android-studio
      • exfat无法挂载?
      • flash
      • 正确安装pip, pip3
      • 耳机插入后没声音
      • 安装最新版emacs
      • refs
    • 好用的命令与参数搭配
    • 常见vim操作
      • 鼠标粘贴
      • 全局替换
    • 几个简单方便的脚本
      • cmake项目的编译脚本
      • 使用外部库的CMakeLists.txt
    • 启动后提示硬盘出错,进入busybox的initramfs界面
    • 提示"boot"分区空间不足
    • svn1.6在centos6下的使用
    • pureftp在centos下与MySQL搭配使用
    • 配置samba服务器
    • sudo命令突然不能使用
    • 安装python3.6
    • Ubuntu的man就是个渣渣
    • 删除(大)文件后,磁盘可用空间没有变化?
    • ssh突然无法连接
    • protobuf报错,未定义的引用
    • nvidia显卡驱动需要重装
    • 明确/etc/environment的存在

ubuntu日常使用指南

换源

ubuntu16.04, ustc

sudo tee /etc/apt/sources.list  << EOF
# 默认注释了源码仓库,如有需要可自行取消注释
deb https://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
EOF

ubuntu18.04, ustc

sudo tee /etc/apt/sources.list  << EOF

# 默认注释了源码仓库,如有需要可自行取消注释
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
EOF

For other options, use this python script to generate it

#!/usr/bin/env python
#coding: utf-8

def get_mirror_site(dist_num_str='16.04', site_name='ustc'):
    site_mp = {
        'ustc': 'https://mirrors.ustc.edu.cn',
        'aliyun': 'http://mirrors.aliyun.com',
        'tuna': 'https://mirrors.tuna.tsinghua.edu.cn',
    }

    site_url = site_mp[site_name]

    dist_mp = {
        '12.04': 'precise',
        '14.04': 'trusty',
        '16.04': 'xenial',
        '16.10': 'yakkety',
        '17.04': 'zesty',
        '17.10': 'artful',
        '18.04': 'bionic'
    }

    dist_name = dist_mp[dist_num_str]


    mirror_url_lst = [
        '# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释',
        'deb {:s}/ubuntu/ {:s} main restricted universe multiverse'.format(site_url, dist_name),
        '# deb-src {:s}/ubuntu/ {:s} main restricted universe multiverse'.format(site_url, dist_name),
        'deb {:s}/ubuntu/ {:s}-updates main restricted universe multiverse'.format(site_url, dist_name),
        '# deb-src {:s}/ubuntu/ {:s}-updates main restricted universe multiverse'.format(site_url, dist_name),
        'deb {:s}/ubuntu/ {:s}-backports main restricted universe multiverse'.format(site_url, dist_name),
        '# deb-src {:s}/ubuntu/ {:s}-backports main restricted universe multiverse'.format(site_url, dist_name),
        'deb {:s}/ubuntu/ {:s}-security main restricted universe multiverse'.format(site_url, dist_name),
        '# deb-src {:s}/ubuntu/ {:s}-security main restricted universe multiverse'.format(site_url, dist_name),

        '# 预发布软件源,不建议启用',
        '# deb {:s}/ubuntu/ {:s}-proposed main restricted universe multiverse'.format(site_url, dist_name),
        '# deb-src {:s}/ubuntu/ {:s}-proposed main restricted universe multiverse'.format(site_url, dist_name)
    ]
    for mirror_url in mirror_url_lst:
        print(mirror_url)

if __name__ == '__main__':
    get_mirror_site()

remember to sudo apt update

开发相关的基本包

ubuntu桌面版,默认不带vim,不带git,不带cmake,不带pip...真搞不清楚ubuntu是啥定位,明明实际情况是:用ubuntu的90%+的是用来开发的,基本的开发包还得要手动安装:

sudo apt install vim git curl cmake aptitude autoconf automake libtool exfat-utils emacs openssh-server subversion unrar tmux enca

vimrc

git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime
sh ~/.vim_runtime/install_awesome_vimrc.sh
git clone --depth=1 https://github.com/zchrissirhcz/dotfiles /tmp/dotfiles
cp /tmp/dotfiles/my_configs.vim ~/.vim_runtime/

python, pip

mkdir -p ~/.pip
(
cat << EOF
[global]
index-url = https://mirrors.ustc.edu.cn/pypi/web/simple/
format = columns
EOF
) > ~/.pip/pip.conf

sudo apt install -y python-pip
sudo pip install -U pip
sudo apt remove -y python-pip

sudo apt  install -y python3-pip
sudo pip3 install  -U  pip
sudo apt remove -y python3-pip

sudo sed -i "s/\/usr\/bin\/python3/\/usr\/bin\/python/g" `which pip`

zsh, oh-my-zsh, josh

sudo apt install zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
sed -i "s/ZSH_THEME=\"robbyrussell\"/ZSH_THEME=\"josh\"/g" ~/.zshrc

配置android相关环境

最近突然觉得各种rc文件很方便,需要用的时候source一下就能用,不需要的时候也不至于污染系统PATH,哈哈。
~/.androidrc内容:

export ANDROID_SDK=/home/zz/Android/Sdk                                          
export PATH=$ANDROID_SDK/cmake/3.6.4111459/bin:$ANDROID_SDK/platform-tools:$PATH 
export ANDROID_NDK=/home/zz/Android/Sdk/ndk-bundle                               

使用android ndk构建之前,只需要source ~/.androidrc再cmake构建即可。

查看库文件(libxxx.a/libxxx.so,动态静态库均可)是哪个编译器生成的

objdump -s --section=.comment libxxx.a    #静态库

objdump -s --section=.comment libxxx.so  #动态库

ldd查看动态库的依赖项

ldd libxxx.so

通常可以查看出glibc版本,确定gcc版本

nvidia-smi反应慢

一般出现在4卡以上的机器上。解决办法是输入如下命令:

sudo nvidia-persistenced --persistence-mode

查找ppa软件包

经常发现ubuntu的apt提供的包版本太老,手动编译新版本实际上要自己手动解决依赖不方便,google/bing查找的话也比较凌乱。

实际上,直接从launchpad上就能找的。https://launchpad.net/ubuntu这里查找各种ppa提供的包。

(其实很久之前玩fedora的时候就用过类似的一个网站:pkgs.org,但是后来用ubuntu后就忘记了。。)

U盘启动ubuntu(安装),进不去桌面

换个usb接口试试。选择try ubuntu而不是install试试。

安装软件包/编译常见软件包

有些包用apt去装就可以了,或许需要添加ppa源;有些包则版本太老,需要从源码编译安装。

查找包

aptitude search pkgName

pkgName可以有多个(空格分隔)

安装软件到系统路径

有些软件包无法通过apt安装,例如CUDA;又或者,apt提供的安装包比较老/不全,希望自行编译安装,例如OpenCV、CMake、Protobuf。

其中,如果某个包主要对应一个可执行程序,比如cmake,而你希望apt安装的版本和自行编译安装的版本同时存在,那么安装到/usr/local/cmake-3.12这样的路径下就好了,通过~/.cmakerc中设定:

export PATH=/usr/local/cmake-3.12/bin:$PATH

并使用source ~/.cmakerc来临时切换版本。

而对于另外一些包,它被安装的目的可能更多的是提供一个.so,被其他程序连接,比如CUDA相关的libcudart.so,libcudnn.so等,以及OpenCV的各种库文件,则往往是在链接器相关的路径、环境变量上做游戏,例如写入到LD_LIBRARY_PATH,或者写入到/etc/ld.so.conf相应的配置文件+执行sudo ldconfig命令,来系统级的让相应的库文件被找到。
相关的,还有个LD_PRELOAD,可以用于同一个库的不同版本的先后查找配置上。

编译时提示头文件找不到

问题原因可能有多种。以caffe在ubuntu16.04上编译为例。

提示hdf5.h找不到。猜测是hdf相关的包的头文件不在系统的INCLUDE查找路径。

查找hdf相关的包。我记得自己装过,所以增加grep过滤:aptitude search hdf5 | grep '^i'

过滤查找结果中最可能的是-dev包。查看-dev包都安装了什么,分别装在哪里。因为确定是要找hdf5.h,所以依然grep过滤:dpkg -L libhdf5-dev | grep 'hdf5.h$'

结果是唯一的,/usr/include/hdf5/serial/hdf5.h。添加/usr/include/hdf5/serial到Caffe的Makefile中INCLUDE_DIRS变量上。

双“重定向”

用caffe训练,产生log。想既在屏幕上看到实时log输出,也同时保存一份到文件。使用2>&1和tee命令,以及管道:

 ......caffe train --solver=......  2>&1 | tee log.txt  

装ffmpeg

比如opencv调用网络摄像头 需要编解码支持 要用ffmpeg

sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next 
sudo apt-get update 
sudo apt-get install ffmpeg

编译安装opencv和opencv contrib 以及python接口

罗嗦版:http://www.cnblogs.com/zjutzz/p/6714490.html

mkdir -p ~/work/gitdown
cd $_
git clone https://github.com/opencv/opencv
git clone https://github.com/opencv/opencv_contrib
cd opencv
mkdir build
cd build
cmake \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr/local/opencv-git-master \
-D WITH_CUDA=OFF \
-D WITH_VTK=OFF \
-D WITH_MATLAB=OFF \
-D BUILD_DOCS=ON \
-D OPENCV_EXTRA_MODULES_PATH=/home/chris/work/gitwhat/opencv_contrib/modules \
-D PYTHON2_EXECUTABLE=/usr/bin/python \
-D PYTHON3_EXECUTABLE=/usr/bin/python3 \
-D PYTHON_INCLUDE_DIR=/usr/include/python2.7 \
-D PYTHON_INCLUDE_DIR2=/usr/include/x86_64-linux-gnu/python2.7 \
-D PYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7.so \
-D PYTHON2_NUMPY_INCLUDE_DIRS=/usr/lib/python2.7/dist-packages/numpy/core/include/ \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3.5/dist-packages/numpy/core/include/ \
..

期间容易出现ippicv等第三方包下载不下来的情况。找到对应的.cmake文件,把下载地址拼接出来自行下载,注意替换掉md5的hash值。下载的文件放到/.cache目录下,例如:

.cache
├── ippicv
│   └── 1469ff5ced054be500921d2d46278ef4-ippicv_linux_20151201.tgz
├── protobuf
│   └── bd5e3eed635a8d32e2b99658633815ef-protobuf-cpp-3.1.0.tar.gz
├── tiny_dnn
│   └── adb1c512e09ca2c7a6faef36f9c53e59-v1.0.0a3.tar.gz
└── xfeatures2d
    ├── boostdesc
    │   ├── 0ae0675534aa318d9668f2a179c2a052-boostdesc_lbgm.i
    │   ├── 0ea90e7a8f3f7876d450e4149c97c74f-boostdesc_bgm.i
    │   ├── 202e1b3e9fec871b04da31f7f016679f-boostdesc_binboost_064.i
    │   ├── 232c966b13651bd0e46a1497b0852191-boostdesc_bgm_bi.i
    │   ├── 324426a24fa56ad9c5b8e3e0b3e5303e-boostdesc_bgm_hd.i
    │   ├── 98ea99d399965c03d555cef3ea502a0b-boostdesc_binboost_128.i
    │   └── e6dcfa9f647779eb1ce446a8d759b6ea-boostdesc_binboost_256.i
    └── vgg
        ├── 151805e03568c9f490a5e3a872777b75-vgg_generated_120.i
        ├── 7126a5d9a8884ebca5aea5d63d677225-vgg_generated_64.i
        ├── 7cd47228edec52b6d82f46511af325c5-vgg_generated_80.i
        └── e8d0dcd54d1bcfdc29203d011a797179-vgg_generated_48.i

新编译出来的cv2.so位于/usr/local/opencv-git-master/lib/cv2.so

sudo apt-get remove python-opencv
sudo ln -sf /usr/local/opencv-git-master/lib/python2.7/dist-packages/cv2.so /usr/lib/python2.7

或者设定PYTHONPATH也可以

编译安装protobuf3.2

apt装的protobuf是2.5版本. pip装的protobuf是3.2版。 使用了python layer的网络,如果用tools/caffe.cpp编译出的工具build/caffe来执行网络,会报protobuf版本问题,需要protobuf-cpp的版本装3.2版

编译装protobuf3.2

卸载apt的protobub

sudo apt-get remove --purge libprotobuf-dev

如果你是ubuntu-desktop用户,那你的桌面有可能被误删。立即安装(不要重启):

sudo apt-get install ubuntu-desktop -y
sudo apt-get install unity -y
sudo apt-get install compiz-gnome -y
sudo apt-get install libcompizconfig0 -y

静态编译protobuf(产生libprotobuf.a而不是.so文件,否则caffe编译会报错)

sudo apt-get install autoconf automake libtool curl make g++ unzip
cd ~/work/gitdown
git clone https://github.com/google/protobuf
cd protobuf
git checkout -b 3.2.x origin/3.2.x

./autogen.sh
vim configure

修改2658行和2661行,引号里面都换成"-fPIC"

./configure --disable-shared
make -j8
sudo make install

sudo ldconfig

重新编译caffe

cd ~/work/caffe-BVLC
make clean
make -j8
make pycaffe

py-faster-rcnn

http://www.cnblogs.com/zjutzz/p/6034408.html

android-studio

真机调试:需要先设定udev的规则。
参考:http://www.jianshu.com/p/958361328ae5

exfat无法挂载?

sudo apt-get install exfat-utils

flash

sudo apt-get install flashplugin-installer

正确安装pip, pip3

需要安装pip,并且pip升级到最新版。现在(2018.07.28)可行的做法(亲测有效,ubuntu16.04):

sudo  apt  install  python-pip    #用apt装pip,是8.0版的pip
sudo  pip  install  -U  pip           #用8.0的pip给自己升级
sudo  apt  remove  python-pip  #干掉apt装的(老版本的)pip.  现在,系统有的pip,是最新版的pip

pip3?如法炮制:

sudo  apt  install  python3-pip
sudo  pip3  install  -U  pip
sudo  apt  remove  python-pip

sudo  vim   `which  pip`   #查看一下pip,是否被python3给覆盖了,也就是确保解释器为#!/usr/bin/python而不是#!/usr/bin/python3

耳机插入后没声音

需要手动设置下:


sudo apt install pavucontrol
pavucontrol  #打开了音量控制中心的GUI界面,然后手动选择输出设备为headphone

参考:
http://www.linuxdiyf.com/linux/25058.html

安装最新版emacs

当不得不只能通过ssh连接到linux服务器进行C++开发时,我选择使用emacs。ubuntu16.04自带的emacs是24版,用我的配置文件会出现打开emacs后卡死在加载配置文件上的问题。索性安装最新版emacs(27):

#(emacs-snapshot 是最新版本,更新速度相对较快) 
sudo add-apt-repository ppa:ubuntu-elisp/ppa 
sudo apt update 
sudo apt install emacs-snapshot emacs-snapshot-el

refs

http://blog.csdn.net/linyushan11/article/details/10378419

https://github.com/BVLC/caffe/issues/19

安装最新emacs

好用的命令与参数搭配

将所有文件的编码,转换为UTF-8

find . ! -type d -exec enca -L zh_CN -x UTF-8 {} \;

将所有c/cpp/h文件的行尾换行符,从unix改成dos(使用场景:工程的代码中有//开头的中文注释,在linux下可正常编译,在visual studio中编译报错,报错地点处于"//开头的注释后的一行"对应的字段/变量定义等):

find . -name '*.[c|cpp|h]' -exec unix2dos {} \;

将指定目录下所有文件权限设定为644

find . ! -type d -exec chmod 644 {} \;

将指定目录下所有目录权限设定为755

find .  -type d -exec chmod 755 {} \;

替换文本文件中行尾换行符,从dos(CRLF)为unix行尾换行符:

find . -name '*.php' | xargs -I {} perl -pi -e 's/\r//g' {}

批量删除所有.svn子目录:

find . -type d -name ".svn"|xargs rm -rf

对目录下所有文件执行同种操作,比如文件名追加"pop":

for file in "$(ls)"; do echo -e "$file"pop; done

计算md5加密:

echo -n "你的字符串" | openssl md5

其中-n参数一定要有,否则结果就不一样了(掺杂了回车的结果)

查看CPU是几核的:

cat /proc/cpuinfo | grep 'procossor' | wc -l

持续查看某条命令结果:用watch。例如每隔一秒监控一次nvidia显卡显存占用:

watch -n 1 nvidia-smi

列出目录下的文件,每行1个:

ls src -1  #-1表示每行1个

列出目录下文件,每行一个,并且加上路径名作为前缀:

ls src -1  | awk '{print "src/"$1}'

常见vim操作

鼠标粘贴

用鼠标复制内容到系统粘贴板后,粘贴到vim中,需要先开启paste(避免不正常的缩进),然后再粘贴

# 先按escape进入命令模式
:set paste
# 然后按i,进入insert模式
# 用鼠标粘贴

全局替换

:1,$s/old_string/new_string/g

解释:1,$表示从第一行到最后一行;s表示替代;old_string表示想要被替换掉的字符串(替换为new_string);g表示global,是说对于每一行,替换行内所有的old_string

几个简单方便的脚本

cmake项目的编译脚本

cmake执行后产生log,希望保存log方便后续查看。
cmake可能有很多参数,一下子记不住。
那么使用这个脚本:

#!/bin/bash
# compile.sh
set -x   #把本行后的脚本执行内容,打印到屏幕。用于调试
set -e   #本行后,如果某行执行结果返回值不是true,那么终止

LOG="log.build"
touch $LOG
rm $LOG

exec &> >(tee -a "$LOG")   #将屏幕输出内容,同时写入log文件:便于后续查找

echo "Logging to $LOG"


BUILD_ROOT=build
if [ -d $BUILD_ROOT ]; then
    rm -rf $BUILD_ROOT
fi
mkdir -p $BUILD_ROOT
cd $BUILD_ROOT
echo "building root folder is $BUILD_ROOT"

echo "Now do cmake"

cmake ..

echo "Now do make"

make -j8

echo "Done"

在此基础上可以添加sudo make install,以及cmake的各种option值。

使用外部库的CMakeLists.txt

dlib

比如使用dlib库写自己的代码。那么自行下载并编译dlib,会同时生成静态库libdlib.a和动态库libdlib.dylib文件。

要使用dlib(静态库、动态库都可以),假设我的代码只有一个assignment_learning_ex.cpp文件(来自dlib的tutorial),那么它配套的CMakeLists.txt这样写:

cmake_minimum_required(VERSION 2.8.12)

project(examples)

set (CMAKE_CXX_STANDARD 11)  # -std=c++11

set(INC_DIR /Users/tusdk/work/dlib)   #dlib头文件路径,改成你的

set(LINK_DIR /Users/tusdk/work/dlib/build/dlib)  #dlib库文件路径,改成你的

include_directories(${INC_DIR})

link_directories(${LINK_DIR})

add_executable(assignment_learning_ex assignment_learning_ex.cpp)

target_link_libraries(assignment_learning_ex dlib)

.cpp文件和CMakeLists.txt文件放同一目录下,执行:

mkdir -p build
cd build
cmake ..
make -j8

完成编译,可以运行了。

这种写法,应该是比较方便使用的,每次只编译自己代码就好了,dlib不用重新编译。

而dlib官方的文档,意思是自己的调用dlib库的程序(用cmake构建),每次都重新编译dlib。虽然说了一堆道理,但是编译dlib对我来说没有必要,浪费时间,不如去掉,所以,用我贴出来这个脚本会方便。

在cmake项目中使用自行编译的opencv

find_package时指定opencv编译的build目录即可。其实前面的dlib,原则上这么做应该也行。但是dlib生成的.cmake脚本不在同一目录有点麻烦。

caffe2中有个Dependencies.cmake,稍作修改,把opencv的部分拿出来:

# ---[ OpenCV
if(USE_OPENCV)
  # OpenCV 3
  find_package(OpenCV QUIET COMPONENTS core highgui imgproc imgcodecs
      CONFIG
      PATHS "/Users/tusdk/work/opencv/build/")
  if(NOT OpenCV_FOUND)
    # OpenCV 2
    find_package(OpenCV QUIET COMPONENTS core highgui imgproc)
  endif()
  if (OpenCV_FOUND)
    include_directories(SYSTEM ${OpenCV_INCLUDE_DIRS})
    list(APPEND Caffe2_DEPENDENCY_LIBS ${OpenCV_LIBS})
    message(STATUS "OpenCV found (${OpenCV_CONFIG_PATH})")
  else()
    message(WARNING "Not compiling with OpenCV. Suppress this warning with -DUSE_OPENCV=OFF")
    set(USE_OPENCV OFF)
  endif()
endif()

==== update =====

也是被opencv和cmake折腾的醉了。仔细看了下cmake的find_package的文档后,才知道怎么master这些包(比如opencv)

对于自行编译的opencv 假设安装在了/opt/opencv-git-master 那么通过在CMakeLists.txt里设定CMAKE_PREFIX_PATH,能最高优先级地设定opencv的查找路径。e.g.:

cmake_minimum_required(VERSION 3.2)
project(play)

message("CMAKE_MODULE_PATH is: ${CMAKE_MODULE_PATH}")
message("CMAKE_SYSTEM_PREFIX_PATH: ${CMAKE_SYSTEM_PREFIX_PATH}")
message("CMAKE_SYSTEM_FRAMEWORK_PATH: ${CMAKE_SYSTEM_FRAMEWORK_PATH}")
message("CMAKE_SYSTEM_APPBUNDLE_PATH: ${CMAKE_SYSTEM_APPBUNDLE_PATH}")

list(APPEND CMAKE_PREFIX_PATH "/opt/opencv-git-master")  ##!! 这里在设定
# 假如是apt装的opencv,那么先通过dpkg -L libopencv-dev查询知道,.cmake文件在/usr/share/OpenCV,那么用下面这行:
#list(APPEND CMAKE_PREFIX_PATH "/usr/share/OpenCV/")
message("CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")

find_package(OpenCV
    #NO_CMAKE_PATH
    #NO_CMAKE_ENVIRONMENT_PATH
    #NO_SYSTEM_ENVIRONMENT_PATH
    #NO_CMAKE_PACKAGE_REGISTRY
    #NO_CMAKE_SYSTEM_PATH
    )

message(${OpenCV_DIR})

#add_executable(hello main.cpp)

而如果你opencv安装在/usr/local或者/usr/local/opencv开头的路径中,那么不用设定CMAKE_PREFIX_PATH就能被找到,当然设定这个变量会有更高优先级。

具体参考cmake官方文档中find_package()的内容,或者cmake简明使用指南.

启动后提示硬盘出错,进入busybox的initramfs界面

这问题今天(2017-11-21 11:44:35)第一次遇到,解决办法是手动调用磁盘修复命令。虽然它提示了手动修复,但是我怎么知道哪些参数?还是靠百度,靠网友的经历了。
参考http://blog.csdn.net/babyfish13/article/details/51190148,我用的文中第二种方式。

提示"boot"分区空间不足

是旧的内核太多了。保险的方式是安装byobu后操作。
purge-old-kernels在byobu软件包中,首先,安装byobu:

sudo apt install byobu

运行purge-old-kernels卸载旧内核:

sudo purge-old-kernels

为了保险它会保留最新的两个Linux内核。

参考:http://blog.topspeedsnail.com/archives/6069

svn1.6在centos6下的使用

之前用centos6.5的时候 懒得手动编译高版本svn,用的是1.6版的,写了一些笔记:
http://www.cnblogs.com/zjutzz/p/4887288.html

其实如果可以还是用更新版本的svn吧,bug少,操作更人性化。

pureftp在centos下与MySQL搭配使用

之前用pureftp作为ftp的服务端软件,写了一些笔记:
http://www.cnblogs.com/zjutzz/p/4993106.html

其实如果只是内网使用服务器,比如Deep Learning日常连接到服务器做训练、测试、开发,用sftp就好了,简单省事。

配置samba服务器

使用场景:在windows系统上访问linux主机/服务器上的目录、文件。
在ubuntu16.04上配置如下:
1)关防火墙

sudo ufw disable      //关闭防火墙 
sudo ufw enable        //开启
sudo ufw status   //查看状态 

2) 安装samba包

sudo apt-get install samba

3) 改配置文件

sudo vim /etc/samba/smb.conf

配置项参考:https://blog.csdn.net/lan120576664/article/details/50396511

这里还需要注意目录权限问题。比如/home/tony的目录默认只能tony或者tony组的访问,其他用户不能访问。

并且注意:配置/etc/smb.conf中使用@tony表示tony组,而tony则表示用户tony

4) 添加samba用户并设置密码
要求用户必须是已经存在的linux用户

sudo smbpasswd -a chris

表示的是添加chris用户,然后输入samba访问的密码。

5) 重启服务以生效

sudo service smbd restart

6)在windows上访问
打开资源管理器,地址栏输入"\172.17.xxx.xxx",这个是你的ubuntu的ip地址,可以通过ifconfig命令查看

7) windows上清除访问凭证
查看现有samba连接凭证:

net use 

清除某个凭证:

net use \\172.17.89.33\some_dir  /delete

sudo命令突然不能使用

有个师妹今天运行py-faster-rcnn代码来调用Matlab命令,提示matlab权限不足,但是修改权限时候不小心改了/usr路径的权限(大概是chown -R777 /usr这样,缺少了必要的空格,导致路径下文件的setuid权限出问题)。
总之,效果就是,sudo命令用不了了。
解决方法很简单:进入tty界面(ctrl+F1),用root登录,然后输入chmod -R 4755 /usr

当然,如果你仅仅是sudo命令本身不能用 那么就是chmod 4755 /usr/bin/sudo

参考:http://blog.csdn.net/shihuacai/article/details/14645447


安装python3.6

项目用到python3.6特性(比如f'name.png'形式的表达)。ubuntu16.04默认的python3是3.5。

以下做法搜集自网络,表面上看起来可用,但是隐患众多。最简单的例子:重启后gnome-terminal可能用不了了。因为很多系统工具比如gnome-terminal用了python3.5,如果把系统的python3从python3.5改到python3.6会埋藏各种隐患。最好是自行编译,对于项目中需要用python3.6的地方,通过#!/usr/bin/env python3.6来指定

添加ppa源并安装

sudo add-apt-repository ppa:jonathonf/python-3.6
sudo apt update
sudo apt install python3.6
sudo apt install python3.6-dev #!这里是重点!记得装dev包,不然后续pip3 install xx时容易报错提示Python.h找不到

设定python3默认指向python3.6:

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5  1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6  2

确认一下:

python3  -V

补救措施
如果你不幸重启后发现gnome-terminal不能用了。执行这些:

sudo apt-get remove --purge python-apt 
sudo apt-get install python-apt -f  
cd /usr/lib/python3/dist-packages/ 
sudo ln -sf apt_pkg.cpython-35m-x86_64-linux-gnu.so apt_pkg.cpython-36m-x86_64-linux-gnu.so

cd /usr/lib/python3/dist-packages/gi
sudo ln -sf _gi.cpython-35m-x86_64-linux-gnu.so _gi.cpython-36m-x86_64-linux-gnu.so
sudo ln -sf _gi_cairo.cpython-35m-x86_64-linux-gnu.so _gi_cairo.cpython-36m-x86_64-linux-gnu.so

# 以下两个如果没有执行,则software & updates的GUI程序窗口就打不开了。
sudo ln -sf _dbus_glib_bindings.cpython-35m-x86_64-linux-gnu.so _dbus_glib_bindings.cpython-36m-x86_64-linux-gnu.so
sudo ln -sf _dbus_bindings.cpython-35m-x86_64-linux-gnu.so _dbus_bindings.cpython-36m-x86_64-linux-gnu.so

ref1, ref2

Ubuntu的man就是个渣渣

在用pip3装python包,并且开了lantern的socks代理。但是还是提示socks错误,很无语。
然后想让pip缓存文件。于是man pip3。没想到里面的帮助信息都是过时的。正确方法是:pip3 --help而不是man pip3

删除(大)文件后,磁盘可用空间没有变化?

本人把一块3T的硬盘划分出1.1T,挂在/opt了,用来缓解/home和/下捉襟见肘的磁盘空间。
然而,训练产生的caffemodel文件很大,很快,整个/opt也只有70G可用了。尝试查看每个目录占用大小:

cd /opt
du -sh *

找到大块文件后,删掉它,包括用rm命令,和手动右键选择"move to trash"。随后再次du -sh *以及df -Th,发现/opt可用大小还是70G。

问题在于,文件没有真的被干掉,而是被转移在/opt/.Trash/files目录下了。删除这个目录下的文件,就彻底删除了。


ssh突然无法连接

比如A想ssh到B但是连不上。首先确认B开启了sshd服务,并且如果有错误的话,也能在查看服务的时候看到:

sudo service ssdh status

发生过的实际例子是,B上的shell先前用的zsh,后来删掉了换成了bash,然后A这里,先前能连B,后来连不上。简单办法是B上装上zsh即可。


protobuf报错,未定义的引用

可能出现在很多软件的编译环节。比如,编译opencv的时候,编译了opencv contrib中的dnn模块,该模块需要用protobuf来转换Caffe的模型。报错如下:

[ 75%] Linking CXX executable ../../bin/opencv_test_dnn
../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(int, std::string const&, google::protobuf::io::CodedOutputStream*)’未定义的引用
../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::io::CodedOutputStream::WriteStringWithSizeToArray(std::string const&, unsigned char*)’未定义的引用
../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::internal::WireFormatLite::ReadString(google::protobuf::io::CodedInputStream*, std::string*)’未定义的引用
../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::Message::GetTypeName() const’未定义的引用
../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::internal::StringTypeHandlerBase::Delete(std::string*)’未定义的引用
../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::MessageFactory::InternalRegisterGeneratedFile(char const*, void (*)(std::string const&))’未定义的引用
../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased(int, std::string const&, google::protobuf::io::CodedOutputStream*)’未定义的引用
../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::internal::StringTypeHandlerBase::New()’未定义的引用
../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::internal::empty_string_’未定义的引用
../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::internal::WireFormatLite::WriteString(int, std::string const&, google::protobuf::io::CodedOutputStream*)’未定义的引用
../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::DescriptorPool::FindFileByName(std::string const&) const’未定义的引用
../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::internal::WireFormatLite::ReadBytes(google::protobuf::io::CodedInputStream*, std::string*)’未定义的引用
../../lib/libopencv_dnn.so.3.1.0:对‘google::protobuf::Message::InitializationErrorString() const’未定义的引用
collect2: error: ld returned 1 exit status
modules/dnn/CMakeFiles/opencv_test_dnn.dir/build.make:258: recipe for target 'bin/opencv_test_dnn' failed
make[2]: *** [bin/opencv_test_dnn] Error 1
CMakeFiles/Makefile2:4958: recipe for target 'modules/dnn/CMakeFiles/opencv_test_dnn.dir/all' failed
make[1]: *** [modules/dnn/CMakeFiles/opencv_test_dnn.dir/all] Error 2

解决办法:一开始我猜是存在多个版本的protobuf导致的。其实这个思维定式在一定条件下是正确的。然而本质原因是:你的protobuf对应的动态链接库文件(protobuf-xxx-.so),它被编译出来的时候的g++版本,和你当前使用的(比如用来编译OpenCV的dnn模块)的g++版本不一致。

典型的例子:因为一些原因,切换了g++版本。个人是很讨厌切换系统g++版本的,会导致类似这个例子中的各种问题。要用不同版本的g++,可以,但是不要替换系统默认的g++。

nvidia显卡驱动需要重装

应该是安装nvidia显卡驱动的时候没有打到内核里面去。。。还没有测试过,不过看起来应该是这么搞的:

https://askubuntu.com/questions/841876/how-to-disable-nouveau-kernel-driver

参考其中第二个答案,主要是dkms的安装、重新编译内核、重启

明确/etc/environment的存在

2018-12-25 20:58:50
今天晚上帮同事配hexo,这个开源博客系统很久之前玩过,基于nodejs的,npm包的下载通常是卡脖子的问题,今天也是卡在这里。
具体描述:已经配置了npm镜像,无论是否开启代理(to cross the great wall),都无法下载hexo,一直提示localhost的1080端口走不通。

我的思路:肯定是某个配置文件设定了1080代理端口,直觉是~/.bashrc或者/etc/profile设定的,这俩文件应该说是进入bash后必然执行的两个文件了。然而naive,就算不加载这两个文件,环境变量$http_proxy依然是1080。

最后总算找到,是/etc/environment这个文件设定了1080代理。

/etc/environment设定了系统级别的环境变量。没什么特殊癖好的话别在这个文件里写东西,这是StackOverFlow上的网友以及我的共同观点。因为修改它导致的环境变量出问题,大部分人根本不知道这玩意儿的存在。。

你可能感兴趣的:(ubuntu日常使用指南)