前言

最近好久没写博客了,事情太多了,我还搞了个新的好玩的项目,等后续做得差不多了来写篇文章介绍一下。

在我们目前的AI项目中,团队需要共同使用一台GPU服务器来做模型训练和数据处理。为了让每个团队成员都能高效地使用这台服务器,我们决定设置一个多用户共享环境。这样,无论是代码开发、模型测试还是结果验证,所有人都可以方便地访问并利用服务器的强大算力。

本文将记录一下配置Linux共享环境的过程,同时也希望能帮助那些面临类似需求的团队。

设置用户和组

要有效管理我们的GPU服务器,首先需要创建新的用户账户,并将这些账户组织到一个专门的用户组中。这样做可以更容易地管理权限和访问控制。

创建用户和组

先创建个组

sudo groupadd gpugroup

接下来创建用户

sudo adduser [用户名]

然后把用户添加到组里面

sudo usermod -a -G gpugroup username

配置SSH公钥登录

为了让团队成员能够安全地通过SSH连接到服务器,统一使用公钥认证,禁止密码登录。

每个用户需要生成一对密钥(如果还没有的话),并将公钥发送给管理员。然后,管理员需要将这些公钥添加到用户的 .ssh/authorized_keys 文件中。

首先,确保每个用户的 home 目录下都有 .ssh 目录,如果没有,可以使用下面的命令创建:

sudo mkdir /home/[用户名]/.ssh
sudo chmod 700 /home/[用户名]/.ssh

然后,将公钥添加到 authorized_keys 文件中:

echo [公钥内容] >> /home/[用户名]/.ssh/authorized_keys
sudo chmod 600 /home/[用户名]/.ssh/authorized_keys

替换 [用户名][公钥内容] 为实际的用户名和公钥。

创建共享文件夹

之前我把代码放在 home 目录下,不过实践中发现这样不利于共享。

毕竟把某个用户 home 目录下的一个文件夹设置为共享目录,让其他用户访问,总觉得怪怪的。

通常为了安全性和组织性,还是创建一个专门的目录用于共享项目比较好,问了GPT是这么说的

安全性:避免不必要的权限泄露。当你将项目放在个人家目录下时,可能会不小心赋予其他用户过多的访问权限,这可能导致敏感信息的泄露或不小心的数据损坏。

易管理性:一个专门的共享目录使得管理更为简单明了。你可以轻松控制谁可以访问这个目录,而不必担心影响到其他个人数据或设置。

扩展性:随着团队的增长,可能会有更多的用户需要访问这些共享资源。有一个独立的共享目录可以更方便地管理用户和权限,而不是不断调整家目录下的权限设置。

清晰的权限界定:独立的共享目录让权限的设置和调整变得更加清晰和简单。例如,可以针对这个目录设置定制的安全策略和备份策略。

所以我在 /srv 目录里创建了一个目录 /srv/projects 用来共享。

组权限设置

接下来,将团队共享的项目文件夹 /srv/projects 的所有权设置给 gpugroup 组。

sudo chown -R root:gpugroup /srv/projects
sudo chmod -R 775 /srv/projects

设置SGID(Set Group ID)

SGID 是一个特殊的权限设置,它确保在一个目录下创建的任何新文件或目录都会自动继承该目录的组。这非常适合我们的项目目录,因为它可以让团队中的所有成员都能访问和修改文件,而不必担心单个文件的组设置。

你可以使用以下命令来设置SGID位:

sudo chmod g+s /path/to/directory

例如,如果我们的项目目录是 /srv/projects,命令将是:

sudo chmod g+s /srv/projects

这样设置后,所有在 /srv/projects 下创建的新文件和目录都将自动设置为该组,保持权限的一致性。

调整 umask (optional)

PS: 我没有设置这个,可以但没必要

umask 是一个系统设置,决定了新创建的文件和目录的默认权限。为了确保团队成员可以编辑彼此的文件,我们需要设置一个合适的 umask 值。

通常的 umask 值是 022,这意味着新创建的文件默认权限是 644(用户可读写,组和其他人可读),新目录的默认权限是 755(用户可读写执行,组和其他人可读执行)。为了团队协作,我们可以设置 umask 为 002,这样新文件的权限为 664(用户和组可读写,其他人可读),新目录的权限为 775(用户和组可读写执行,其他人可读执行)。

可以通过以下命令临时改变 umask 值:

umask 002

为了永久改变,需要在用户的 shell 配置文件中设置,比如 .bashrc.profile

echo "umask 002" >> ~/.bashrc

其他

还有一些细节的,比如我之前把 conda 装到 home 目录里了

现在也得重新在 /srv/apps 里安装,原本在 home 里的就不要了

这样所有用户都能共享 python 的虚拟环境

复制文件时显示进度

cp -R 命令不支持显示进度

可以使用 rsync 或 pv 代替

rsync

rsync -ah --progress source destination

参数解释:

  • -a 是归档模式,它保留符号链接、文件权限、用户组信息等。
  • -h 使输出更易于阅读,使用人类可读的格式。
  • --progress 显示复制进度。

pv

这个是搭配压缩工具使用的,有些系统不自带,可能得先安装。

tar cf - source/ | pv | tar xf - -C destination

这个命令将 source 目录打包并通过 pv 显示进度,然后在 destination 目录中解包。

小结

这样设置下来就基本搞定了

我最近还探索了一些项目管理工具,部署了 MatterMost

接下来可以写文章记录一下。

为团队配置Linux环境,简单高效的项目共享方案的更多相关文章

  1. VSCode配置c++环境简单教程

    VSCode配置c++环境简单教程 1.下载MinGW 安装有关gdb,gcc,g++的所有包 2.文件夹 打开一个文件夹 在里面随便写一个cpp 不管是VS还是VSCode,它的基本操作单位都是文件 ...

  2. eclipse弃坑记第一篇之在idea上配置Tomcat环境并创建Javaweb项目的详细步骤原创

    IntelliJ IDEA是一款功能强大的开发工具,在代码自动提示.重构.J2EE支持.各类版本工具(如git.svn.github).maven等方面都有很好的应用. IntelliJ IDEA有免 ...

  3. Linux环境下第一次提交项目

    Linux环境下第一次提交项目: vi 日记 新增一个文件名为“日记”的文件 git status 工作区的状态 git add 日记 建立跟踪 git commit 提交变更 ----------- ...

  4. linux下配置python环境 django创建helloworld项目

    linux下配置python环境 1.linux下安装python3 a. 准备编译环境(环境如果不对的话,可能遇到各种问题,比如wget无法下载https链接的文件) yum groupinstal ...

  5. Hadoop第一式:配置Linux环境

    所有操作在虚拟机下完成,虚拟机软件选用VMware Workstation Pro 12 (后文简称为VM) 关于Linux安装不再阐述一.网络环境配置 1)Windows界面 首先在VM页面,点击虚 ...

  6. 三种配置linux环境变量的方法(以java为例)

    1.先确认是否为openjdk:参考 2. 修改/etc/profile文件  如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性 ...

  7. 【转】Linux环境进程间通信(五) 共享内存(上)

    转自:https://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以 ...

  8. <转>Linux环境进程间通信(五): 共享内存(上)

    http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写 ...

  9. ASP.NET Core Linux环境安装并运行项目

    原文地址:https://blog.csdn.net/u014368040/article/details/79192622 一 安装环境 1.  从微软官网下载 Linux版本的.NetCoreSd ...

  10. (一)配置linux环境实现持续集成

    目录 1.Centos7操作系统 2.Gnome 可视化桌面 3.远程shell工具 4.远程桌面工具 5.Jdk 6..Net Core 7.Git 8.Docker 容器 9.Kubernetes ...

随机推荐

  1. 很多人讲不明白HTTPS,但是我能

    很多人讲不明白HTTPS,但是我能 今天我们用问答的形式,来彻底弄明白HTTPS的过程 下面的问题都是 小明和小丽两个人通信为例 可以把小明想象成服务端,小丽想象成客户端 1. https是做什么用的 ...

  2. 一个或多个C文件编译KO

    参考文档:.c文件如何编译为ko的MAKEFILE文件编写 - young525 - 博客园 (cnblogs.com) 文档组织结构 header目录:存放头文件 source目录:存放源文件 单个 ...

  3. C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 文件夹体积很大

    现象:大量调用.p12证书时,C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 文件夹变得越来越大. 调用代码: X509Certificate2 x50 ...

  4. 安装 Nuxt.js 的步骤和注意事项

    title: 安装 Nuxt.js 的步骤和注意事项 date: 2024/6/17 updated: 2024/6/17 author: cmdragon excerpt: Nuxt.js在Vue. ...

  5. typroa破解

    Typora 一款 Markdown 编辑器和阅读器 风格极简 / 多种主题 / 支持 macOS,Windows 及 Linux 实时预览 / 图片与文字 / 代码块 / 数学公式 / 图表 目录大 ...

  6. Java面试知识点(六)hashmap深度理解

    1.hashmap 的数据结构 要知道 hashmap 是什么,首先要搞清楚它的数据结构,在 java 编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用 ...

  7. 实验7.Vlan划分实验

    # 实验7.Vlan划分实验 本实验用于划分Vlan,并对划分的Vlan做隔离测试. 实验组 拓扑 Vlan隔离配置 在配置vlan前,测试PC1234互通 具体配置vlan 这里给出其中一台交换机的 ...

  8. 如何查看docker容器的volume挂载情况

    准备在docker容器当中编写个日常维护的脚本,但容器里连yum和vim命令都没有,所以就想到通过容器映射在本机的volume里编写脚本这样在容器中不就可以直接用了吗,那么在这之前你首先得知道dock ...

  9. 微信小程序day04基础加强

    一.自定义组件 1.1 组件的创建与引用 首先创建组件 然后我们组件的引用分为局部和全局引用 局部引用就是在当前页面能使用,在当前页面的json文件里面配置 全局引用同样的道理,注意跟page等是同级 ...

  10. c语言生成随机数

    记录示例,留作自用 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) ...