Onwaier's Blog

大步后退亦或停止不前,不如匍匐前进

0%

创建hexo工程

1
hexo init blog

使用hexo初始化hexo项目,将会创建一个文件夹blog

新建post

1
2
cd blog
hexo new “HelloWorld”

进入blog文件夹,创建名为HelloWorld.md文件,位置为blog/sources/_posts/

生成静态文件

1
hexo generate # hexo g

将Markdown格式的文件解析成可以使用浏览器查看的HTML文件,HTML文件存储在blog/public目录下。

运行hexo服务器

1
hexo server # hexo s

打开命令行提示的网址,便能查看我们的blog

如需修改 HelloWorld.md文件,只需直接编辑,然后再次执行以下命令

1
2
hexo generate 
hexo server

部署

执行以下命令

1
hexo d # 需先执行hexo g 生成静态文件

即可在公网访问到文章。

创建草稿

1
hexo new draft draft1

创建名为draft1.md,在blog/sources/_drafts

查看已有草稿

1
hexo --draft

推送文章

将草稿draft1.md转至blog/sources/_drafts,可执行

1
hexo publish draft1

参考资料

  1. 知乎-Mac的移动硬盘不能装载该如何解决?
  2. 命令行卸载Tuxera使用系统偏好卸载Tuxera
  3. Macos 10.15.7系统无法挂载移动盘解决方案
  4. Tuxera NTFS在Mac os 10.15.7系统用命令挂载盘

解决轨迹

最开始以为是错误插拔导致硬盘无法挂载。参考资料1,执行相关命令,但发现仍然无法挂载硬盘。然后去苹果社区查相关信息,有人提是因为Tuxera不是最新版本,就按照资料2卸载旧版本,重启电脑。这时发现可以挂载硬盘,但只能读不能写,此时,内心窃喜。安装最新版本Tuxera,重启电脑,发现又无法挂载硬盘,回到了最初的起点。我有点怀疑是因为软件与系统不兼容导致的,因为我在卸载掉软件后,是可以正常挂载。所以,我使用“Macos10.15.7无法挂载移动盘”去google找到材料3,发现Paragon软件可以通过命令来手动挂载以解决不兼容的问题。那Tuxera是否也可以手动挂载那?加上Tuxera关键词,找到材料4,问题终于得到解决了。

解决方案

3条命令

  1. 终端输入sudo mkdir /Volumes/ntfs-disk,需输入开机密码。
  2. diskutil list查看硬盘信息,找到对应条目。我这里对应的是 /dev/disk2s1

image-20220530151450204

  1. sudo /Library/Filesystems/tuxera_ntfs.fs/Contents/Resources/mount_tuxera_ntfs -o nodev -o noowners -o nosuid /dev/diskXsY /Volumes/ntfs-disk,需将这里diskXsY替换掉,对应上图,这里就替换成 disk2s1。等待片刻,即可成功挂载,此时可正常读写。

​ 注意:退出硬盘需重新挂载,为了方便下面提供了脚本方便执行

脚本

1
2
3
4
5
6
7
8
9
10
11
# tuxera 挂载ntfs硬盘(适用于zsh,bash不知是否可以)
tuxera_mount()
{
sudo mkdir /Volumes/ntfs-disk
if [ ! $# -eq 0 ]; then
echo "$1"
sudo /Library/Filesystems/tuxera_ntfs.fs/Contents/Resources/mount_tuxera_ntfs -o nodev -o noowners -o nosuid /dev/$1 /Volumes/ntfs-disk
else
echo "先用diskutil list,查看需要挂载盘的信息"
fi
}

tuxera_mount需要接收一个参数。比如对应上图,此参数应为 disk2s1。挂载时,执行命令tuxera_mount disk2s1即可。

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

需求

在linux或mac中有时使用rm命令会误删文件,导致恢复过程十分复杂。能否实现一个类似于垃圾箱功能用于暂存文件,然后恢复误删文件

参考资料

  1. ·Linux回收站功能的实现

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 修改rm 命令
alias rm=delete #命令别名,通过delete来实现rm改为mv
alias r=delete
alias rl='ls /home/onwaier/Documents/trash' #rl 命令显示回收站的内容
alias ur=undelfile #ul 命令找回回收站的文件
# 回收文件
undelfile()
{
if [ ! $# -eq 0 ]; then
mv /home/onwaier/Documents/trash/$@ ./
else
echo "请传入需撤销删除的文件名称,不清楚文件名称请用rl命令查看"
fi
}
# 将文件移至trash文件夹下
delete()
{
if [ ! -d "/home/onwaier/Documents/trash/" ]; then
mkdir /home/onwaier/Documents/trash
fi
\mv $@ /home/onwaier/Documents/trash/
}
# 清空回收站
cleartrash()
{
read "confirm?Are you sure?[YN]"
case $confirm in
Y y)
/bin/rm -rf /home/onwaier/Documents/trash/*;;
N n)
echo "exit";;
*)
echo "error choice";;

esac
}

说明

删除文件时,用rm filename1 finename2将会实现软删除,文件其实被移到你设置的特定路径下(如/home/onwaier/Documents/trash/),恢复时使用ur filename1,查看回收站的内容rl,清空回收站cleartransh

ubuntu18.04上非root用户安装cuda9.0与cudnn

参考资料

  1. Linux非root用户如何优雅的安装cuda和cudnn
  2. 安装cuda时 提示toolkit installation failed using unsupported compiler解决方法

安装过程

  1. cuda与cudnn下载
  1. 安装cuda
  • 在浏览器中找到指定版本的cuda的下载链接,如cuda9.0.然后在命令行中下载wget link,如wget https://developer.nvidia.com/compute/cuda/9.0/Prod/local_installers/cuda_9.0.176_384.81_linux-run

  • 下载完成后,使用chmod +x filename.run赋予执行权限,然后执行命令./filename.run

  • 同意协议,不安装驱动,然后将cuda和cudasamples的目录修改为个人目录。安装时可能会出现错误toolkit installation failed using unsupported compiler,这是因为gcc版本过高引起的,解决方法为在命令后加上--override,即./filename.run --override(这种方法治标不治本,最好的解决方法是编译安装低版本的gcc)。

  1. 安装cudnn
  • 找到与cuda对应版本的cudnn,如cudnn7.6.5
  • 解压文件,tar -zxvf cudnn-9.0-linux-x64-v7.6.5.32.tgz
  • 将解压出的文件夹 includelib64中的文件复制到cuda安装位置中对应的 includelib64文件夹中.
  1. 修改个人用户的环境变量
  • 修改~/.bashrc文件,在文件末尾中加下以下代码(注: /data2/ljj/software/cuda-9.0是我的cuda安装位置
1
2
export PATH=/data2/ljj/software/cuda-9.0/bin:$PATH 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data2/ljj/software/cuda-9.0/lib64/
  • 执行source ~/.baserc使环境变量生效

非root用户编译安装GCC

参考资料

  1. 源码下载地址
  2. 非root权限下源码安装GCC)
  3. linux 没有root权限的用户安装GCC
  4. GCC编译器下载和安装教程(针对Linux发行版)
  5. mpc-0.8.1下载地址

编译安装GCC

  1. 下载GCC及其依赖的源码

这里以gcc-6.5.0为例,下载解压。tar -zxcf gcc-6.5.0.tar.gz ,进入目录cd gcc-6.5.0/contrib/,查看文件cat download_prerequisites,查看依赖的版本号 image-20200729163234221

1
2
3
MPFR=mpfr-2.4.2
GMP=gmp-4.3.2
MPC=mpc-0.8.1

然后在镜像网站下载指定版本依赖,其中mpc0.8.1在国内镜像网站没有找到,可以直接在这里下载。 解压命令

1
2
3
tar -zxvf gmp-4.3.2.tar.gz
tar -zxvf mpc-0.8.1.tar.gz
tar -zxvf mpfr-2.4.2.tar.gz
  1. 编译安装

根据参考资料,编译安装有两种方式, 一种是linux 没有root权限的用户安装GCC,对gcc和依赖依次编译安装,这样做需要注意依赖的安装顺序。

首先安装gmp、之后安装mpfr、最后安装mpc,因为它们之间有依赖关系。

并且依赖项存在依赖时,还需要在编译时加上with选项。另一种是一起编译。

把这三个依赖包拷贝到gcc源代码目录一块编译

首先在gcc-6.5.0新建文件夹mpfr、gmp和mpc,然后将它们复制gcc源目录下。

1
2
3
mv gmp-4.3.2 gcc-6.5.0/gmp
mv mpfr-2.4.2 gcc-6.5.0/mpfr
mv mpc-0.8.1 gcc-6.5.0/mpc

进入gcc-6.5.0目录,即cd gcc-6.5.0。 然后执行以下命令,分别生成makefile,编译,将文件复制到指定目录。

1
2
3
4
5
6
#生成MakeFile,换成立自己的绝对路径
./configure --prefix=/home/ljj/.local --enable-checking=release --enable-languages=c,c++ --disable-multilib
#编译,开启4个线程
make -j4
#拷贝到.local目录
make install
  1. 修改环境变量

此时执行gcc --version显示的是 7.4.0. 修改~/.bashrc文件,在文件末尾添加

1
export PATH=/home/ljj/.local/bin:$PATH

执行source ~/.bashrc,使修改生效. 再次执行gcc --version,显示的是6.5.0.

参考资料

  1. Linux在当前(指定)用户下安装软件
  2. Ubuntu 源码编译安装tmux指定版本于用户目录
  3. 无root权限下解决编译时的依赖问题

下载源码及依赖

tmux源码地址:https://github.com/tmux/tmux 依赖(Dependencies) - libevent 2.x源码地址:https://github.com/libevent/libevent - ncurses 源码地址:https://invisible-mirror.net/archives/ncurses/ 使用wget下载源码的示例命令如下:

1
2
3
wget https://github.com/tmux/tmux/releases/download/3.1b/tmux-3.1b.tar.gz
wget https://github.com/libevent/libevent/releases/download/release-2.1.11-stable/libevent-2.1.11-stable.tar.gz
wget https://invisible-mirror.net/archives/ncurses/ncurses-6.0.tar.gz

编译

参考资料2编译即可. 编译常见三部曲为./configure --prefix=$HOME/usr && make && make install,其中./configure设置尤为重要. 因为无root权限,所以需要使用prefix选项改变安装位置

  1. 安装依赖libevent
1
2
3
4
5
tar -zxvf libevent-2.1.11-stable.tar.gz
cd libevent-2.1.11-stable
./configure --prefix=$HOME/.local --disable-shared
make
make install
  1. 安装依赖ncurses
1
2
3
4
5
tar -zxvf ncurses-6.0.tar.gz
cd ncurses-6.0
./configure --prefix=$HOME/.local
make
make install

编译过程会出现错误,参考资料2解决即可. 大约是在104行,去除104行后面的注释。即:删除/* generated */

  1. 安装tmux
1
2
tar -zxvf tmux-3.1b.tar.gz
cd tmux-3.1b

tmux依赖于libevent和ncurses,需设置编译选项 编译有关的环境变量

1
2
3
4
5
6
7
8
9
10
11
12
# 编译器
CC 指定C编译器(compiler command)路径
CXX 指定C++编译器
# 编译器选项
CFLAGS 用于C编译器的选项
CXXFLAGS 用于C++编译器的选项
LDFLAGS 链接相关选项,如果你有自定义的函数库(lib dir),即可以用 -L<lib dir>指定
# 预编译器
CXXCPP C++ 预处理器(preprocessor)
CPP C 预处理器(preprocessor)
# 预编译器选项
CPPFLAGS C/C++预处理器选项, 如果你自定义的头文件,可以用-I<include dir>

tmux的编译选项设置可参考资料2资料3

1
2
3
4
cd tmux-3.1b
./configure CFLAGS="-I$HOME/.local/include -I$HOME/.local/include/ncurses" LDFLAGS="-L$HOME/.local/lib -L$HOME/.local/include/ncurses -L$HOME/.local/include" CPPFLAGS="-I$HOME/.local/include -I$HOME/.local/include/ncurses" LDFLAGS="-static -L$HOME/.local/include -L$HOME/.local/include/ncurses -L$HOME/.local/lib"
make
cp tmux $HOME/.local/bin
  1. 添加环境变量
1
2
3
# 用vim修改.bashrc,在文件中添加一行export PATH="$HOME/.local/bin:$PATH",保证每次都有效
export PATH="$HOME/.local/bin:$PATH"
source ~/.bashrc

这样就完成了tmux的编译安装,下一篇博文将介绍如何使用tmux.

参考资料

  1. CSDN - pytorch出现RuntimeError: CUDA out of memory.
  2. pytorch模型提示超出内存cuda runtime error(2): out of memory

解决方法

  1. 最容易想到的就是调小batch size
  2. 在测试时,不需要更新模型了,使用torch.no_grad()
  3. 参考资料2 我的问题是调小batch_size,正常的第1个epoch不会出错,而训练第2个epoch一开始,出现了CUDA out of memory。解决方法参考资料2的前2条,实测有效。

参考资料

  1. linux GPU查询和空闲时自动抢占脚本
  2. pytorc使用后正确释放GPU内存以及检测GPU使用情况
  3. GPU 命令行释放内存

问题描述

一大早起来,看看实验室的服务器有没有空闲的GPU,仍被占的满满的,太难了。想着自己总不能这样一直盯着吧,能不能写个脚本自动检测空闲GPU并占用呢?于是查到资料1,按照上面的提示,用命令pip install gpustat,安装了gpustat。然后在服务器上执行一下gpustat,发生了一件诡异的事。 第4块GPU的GPU显存占用了10066M,GPU-Util Compute却是0%(原来是0%,释放内存后恢复正常,这里对图片进行了修改)。昨天晚上我有一个在第4块GPU运行的程序异常退出,然后再次运行,发现GPU内存不够,当时以为有人跑了其它程序。现在看看,可能是主程序退出,子线程没有及时释放GPU资源,导致内存泄漏。

解决方法

参照[资料3],先使用命令fuser -v /dev/nvidia*查找占用GPU资源的PID,然后用kill -9 PID杀死程序,再用nvidia-smi发现资源已经成功释放了。