Linux基础 目录管理的个人实践

发布于 2022-07-02  82 次阅读


前言

经过Linux基础 个人VPS安全的相关设置,相信你的VPS的安全性已经大在地提升了。同时你对linux命令的使用应该也更加熟悉了!如果你使用的是国外的VPS和域名,甚至不需要备案就可以开始搭建互联网服务了,比如个人图床、个人博客了。

这一回我们简单地讲一下使用Linux系统时有关目录管理的实践。目录管理个性化很强的,没有什么天经地义的规矩。这里我会讲一些自己的习惯,仅供大家参考。

测试环境

uname -a # Linux VM-12-8-ubuntu 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

目录管理

我们先进入一下用户的home目录:

cd ~

我们看看有哪些东西:

ls -hl

比如我的输出就是这样:

total 4.0K
drwxr-xr-x 2 test_user test 4.0K Apr 20 21:13 softwares

顾名思义,这个目录是用来存在软件的。因为有一些软件是无法通过apt-get来安装的,所以一般要通过某种方法下载到本地。如果你用的时间长了,可能会有不少软件,这时候如果这里一个那里一个,就显得很混乱了。这里我自定义两个小程序,来说明一下这个问题。

比如,我要创建两个程序,第1个运行时会说“我爱你”。第2个程序运行时会说“你知道吗?”。OK,我们开始!

管理自己的小程序

我们一次性创建几个程序的目录:

mkdir -p ~/software/{test_love/v1.0.0,test_know/v1.0.0}

好像有点眼花,哈哈!没事,我们用一下tree命令:

tree -phDu

我的输出是这样的:

.
├── [drwxr-xr-x 4.0K Apr 20 21:26]  software
│   ├── [drwxr-xr-x 4.0K Apr 20 21:26]  test_know
│   │   └── [drwxr-xr-x 4.0K Apr 20 21:26]  v1.0.0
│   └── [drwxr-xr-x 4.0K Apr 20 21:26]  test_love
│       └── [drwxr-xr-x 4.0K Apr 20 21:26]  v1.0.0
└── [drwxr-xr-x 4.0K Apr 20 21:13]  softwares

6 directories, 0 files

一般我安装软件的时候,会加多一层目录用来表示软件的版本。因为我发现有一些软件会有很多个版本。如果你要安装新版本但又不想马上消除旧版本,这个方法就可以让新旧版本可以比较整齐地摆放。

和上面的命令仔细地对比一下,体会一下mkdir的用法哈!注意,{}里不能有任何空格喔!

如果你没有安装tree,可以用sudo apt-get install tree来安装。我觉得它很好用呢!

现在进入程序的目录:

cd ~/software/test_love/v1.0.0

创建一个新的小程序:

vim test_love.sh

我们输入以下内容:

#! /usr/bin/bash

# 创建者:苯苯

# 用法
# bash test_love.sh

# 日志
# 2022-04-20:第一次创建程序

# 程序
echo '我爱你!'

# End

当然,这里面很多东西都是被注释的,只是为了说明情况,哈哈!就算没有也不影响运行的。记得按:wq保存并退出。

这时,我们用一下这个刚刚写的小程序,就会输出我爱你!的字样了:

bash test_love.sh

现在我们看一下这个文件的详细信息:

cd ~/software/test_love/v1.0.0 && ls -hl 

输出如下:

total 4.0K
-rw-r--r-- 1 test_user test 153 Apr 20 21:38 test_love.sh

看,现在你对它只有rw两种权限。我们加一个x权限,就是让它成为一个可执行文件:

sudo chmod +x test_love.sh

再运行命令ls -hl,输出如下:

total 4.0K
-rwxr-xr-x 1 test_user test 153 Apr 20 21:38 test_love.sh

而且文件名变成了绿色喔!我们不加bash直接运行它:

./test_love.sh

这时会直接输出我爱你!噢。

更进一步的,我们可以给这个文件映射一个软链接到一个环境路径。我们看看有哪些默认的环境路径:

echo $PATH

输出为:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

我就选其中一个常见的吧,叫/usr/bin

sudo ln -s /home/test_user/software/test_love/v1.0.0/test_love.sh /usr/bin/test_love

这个时候我们回home目录:

cd ~

下面神奇的事情就要发生了!请输入:

test_love

有没有发现输出了我爱你!再来检查一下:

which test_love

这个时候会输出/usr/bin/test_love。我们再来探索一下:

ls -hl /usr/bin/test_love

输出为:

lrwxrwxrwx 1 root root 54 Apr 20 21:47 /usr/bin/test_love -> /home/test_user/software/test_love/v1.0.0/test_love.sh

前面有个l,说明这是一个软链接。我个人觉得它和windows的快捷键差不多。你删除这个软链接也不会影响到源文件。值得一提的是,如果你用ln命令时不加-s,它会创建一个硬链接。我个人觉得硬链接和影分身差不多,只要有一个存在,宿主就不会消失,而且它还不消耗整个文件的大小,在PT下载和管理中很好用。这里不展开说了。

好了,这就是自己的第一个Linux小程序了。我还创建了另外一个目录,自己也试着去实现我所讲的效果,即运行时会说“你知道吗?”。

不少软件都是这样使用的,即有一个原始目录,然后有一些软链接指向$PATH

以后下载更多的程序时,就用类似程序名/版本号的方式保存文件和管理。蛮简单吧!当然,这只是一种个人建议。

管理Docker程序

其实,目录管理对于Docker的使用也是很关键。这主要是与Docker的备份有关。我们可以先安装一下Docker。

首先看看自己的VPS有没有安装好Docker了:

which docker # /usr/bin/docker

国内VPS的Ubuntu用户可以根据菜鸟教程来安装。

我们可以先创建一个文件夹(可能没什么用,哈哈)

mkdir -p ~/docker/@install/ && cd ~/docker/@install/

如果你已经安装了docker,就不要运行下面的命令!如果你没有安装docker,可以运行:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

国外VPS的用户也可以参考官方安装方法,就是用不同的镜像嘛。

等安装完后,看一下docker:

which docker # /usr/bin/docker

我们下面安装一下docker-compose,这个是一个布署docker服务的神器。你可以在这里查看docker-compose的最新发行版。选一个最新的版本下载即可。比如我写此博文的时候,是v2.4.1。运行以下命令

sudo curl -L "https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

国内的VPS可以用:

sudo curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

然后进行一些设置:

sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

最后,看一下docker-compose的版本:

docker-compose --version # docker-compose version 1.28.6, build 5db8d86f

现在我们尝试一下用布署一个docker服务。我选了一个叫做Ward的程序(原程序是:B-Software/Ward)。

首先,我们创建目录:

work=~/docker/ward/ && mkdir -p $work && cd $work

仔细体会一下这个创建和进入目录的写法喔!总之就是建立一个临时的变量叫做work,我们暂时可以用$work来替代~/docker/ward/。特别是你的目录名很长时,这个方法看上去比较简洁。要注意,一旦你退出终端,这个变量就会消失。

我们新建一个docker-compose.yml:

vim docker-compose.yml

输入以下内容:

version: '3.3'
services:
    ward:
        restart: unless-stopped
        container_name: ward
        ports:
            - '4000:4000'
        environment:
            - WARD_PORT=4000
            - WARD_THEME=dark
            - WARD_NAME=leons-server
        privileged: true
        image: antonyleons/ward

:wq保存并退出。

这里分享一个Vim的小技巧。比如我想全部删除刚刚输入的内容,只要这样:

  • vim docker-compose.yml进入文件;
  • 按一下数字1,然后按Shift+G。成功的话,光标会定位到第一行第一个字符前面。
  • 按一下字母d,然后按下Shift+G,这就是将光标以下内容全部内容删除。这时就清空了
  • 按字母I,按Ctrl+Shift+v粘贴新内容,按:wq保存并退出。

如果你在以前玩Vim的时候就试过,就知道它有多好用了!这个操作在以后部署docker-compose.yml文件时会很经常用到,因为我们经常要在markdown上做一些微调,然后copy到vim里修改VPS上的文件。

当然,这个Docker程序没有挂载Volume到这个目录里。在以后使用Docker的时候,挂载目录是很常见的。我们备份docker一般就是备份这些目录,它们通常是一些网页根目录或者是数据库文件夹。

我们安装一下这个应用吧!只需要:

sudo docker-compose up -d

输出类似于:

Creating network "ward_default" with the default driver
Pulling ward (antonyleons/ward:)...
latest: Pulling from antonyleons/ward
4d32b49e2995: Pull complete
2e7405b632dc: Pull complete
82681fa0d627: Pull complete
3425bfab69e8: Pull complete
8e73379da14f: Pull complete
7031d37fc351: Pull complete
Digest: sha256:209587b7f0d4cb2ffc7bf992cd280829e61c6add4f2948a4edd98790e5d2dd08
Status: Downloaded newer image for antonyleons/ward:latest
Creating ward ... done

我们看看它的基本状态:

sudo docker ps -a | grep ward

输出如下:

33d53eb8dafc   antonyleons/ward "/bin/sh -c 'java -j…"   48 seconds ago   Up 47 seconds        0.0.0.0:4000->4000/tcp, :::4000->4000/tcp ward

如果你要正常地使用它,通常还要在ufw中请允许它的端口:

sudo ufw allow 4000 comment 'Ward dashboard' && sudo ufw reload

如果你用腾讯云之类的,还要在后台打开一下4000端口:

image-20220420222919488

image-20220420223053210

这时候,打开http://<VPS公网ip>:4000看看这个应用。界面是这样的:

image-20220420223242585

这个小东西可以在网上实时观察你的服务器负载状态喔!就像我的博客一样:

https://wardrn2.hwb0307.com

看着有点花里胡哨的,哈哈!

下面我们下线这个服务。只需要:

sudo docker-compose down

输出为:

Stopping ward ... done
Removing ward ... done
Removing network ward_default

如果你用的是较新版本的docker-compose,可能界面会略有不同。以后我们要备份这个应用,只要备份~/docker/ward/这个目录即可。是不是很帅呢!

如果你装了很多docker应用在~/docker这个目录里,你甚至只要备份~/docker这一个目录就可以了!是不是很帅呢!关于Docker备份的技巧以后出出博文讨论喽,也是蛮简单的,这里按下不表。

小结

经过玩几个小程序和一个小Docker应用,你应该大概了解目录管理的重要性。以后记得要整理好自己的目录,让它干干净净喔!