一、准备工作
1.1 nodejs的安装
在官网中 https://nodejs.org/zh-cn/download/选择对应的版本进行下载
我在这里选择直接在官网中通过浏览器工具找到真实下载地址后,在centos中使用wget工具下载
wget https://nodejs.org/dist/v16.14.2/node-v16.14.2-linux-x64.tar.xz
下载成功:
1.2 安装nodejs
1.将目录移动到/usr/local目录下
mv node-v16.14.2-linux-x64 /usr/local/
2.解压文件
tar -xvf node-v16.14.2-linux-x64.tar.xz
1.3 配置nodejs
设置软链接
ln -s /usr/local/node-v16.14.2-linux-x64/bin/npm /usr/local/bin/
ln -s /usr/local/node-v16.14.2-linux-x64/bin/node /usr/local/bin/
1.4 查看配置结果
node -v
npm -v
配置成功
2.1 miniconda的安装
下载
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
安装
bash Miniconda3-latest-Linux-x86_64.sh
接受许可协议并指定安装路径(如果输错了请使用Ctrl+Backspace):
初始化Miniconda3:
加载环境变量配置文件使之生效
source ~/.bashrc
默认情况下conda激活了(base)环境,可以禁止激活默认的base环境:
conda config --set auto_activate_base false
打开新终端即可发现(base)消失。
可以进一步配置conda的国内镜像(我没配置):
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
conda config --set show_channel_urls yes
三、Linux多用户共用miniconda3环境(为普通用户和root用户都能使用jupyterhub所在的虚拟环境做准备)
3.1创建anaconda用户组
groupadd anaconda
3.2添加用户到用户组
usermod -a -G anaconda <username>
将一个用户添加到用户组中,千万不能直接用: usermod -G groupA这样做会使你离开其他用户组,仅仅做为 这个用户组 groupA 的成员。
应该用 加上 -a 选项: usermod -a -G groupA user,-a 代表 append, 也就是 将自己添加到 用户组groupA 中,而不必离开 其他用户组。
添加结束通过 vim /etc/group在最后可以查看用户组和用户
3.3 移交目录管理权
chgrp -R anaconda /opt/module/miniconda3
3.4 设置读写权限
chmod 770 -R /opt/module/miniconda3
3.5 设置组继承
chmod g+s /opt/module/miniconda3
3.6 设置子目录组继承
chmod g+s `find /opt/module/miniconda3 -type d`
3.7 关闭共享环境的写入权限
# 关闭用户新建虚拟环境
chmod g-w /opt/module/miniconda3/envs
# 关闭用户读写pip包
chmod g-r /opt/module/miniconda3/envs/jupyter_hub/lib/python3.10/site-packages/pip
chmod g-w /opt/module/miniconda3/envs/jupyter_hub/lib/python3.10/site-packages/pip
# 关闭用户读conda包
chmod g-r /opt/module/miniconda3/condabin
chmod g-w /opt/module/miniconda3/condabin
chmod g-r /opt/module/miniconda3/envs/jupyter_hub/conda-meta
chmod g-w /opt/module/miniconda3/envs/jupyter_hub/conda-meta
# 关闭用户读miniconda内的bin目录(即禁止了miniconda内的base环境)
chmod g-r /opt/module/miniconda3/bin
# 关闭用户读miniconda内的pkgs包(所有包更新之类的都在这)
chmod g-r /opt/module/miniconda3/pkgs
chmod g-r /opt/module/miniconda3/conda-meta
chmod g-r /opt/module/miniconda3/condabin
3.8 root用户下启动anaconda环境
source /opt/module/miniconda3/bin/activate
3.9 创建共享环境
conda create -n jupyter_hub python=3.10
3.10 配置环境变量
vim /etc/profile
添加:
export PATH=/opt/module/miniconda3/bin:$PATH
激活文件使其生效:
source /etc/profile
3.11 其他用户激活conda环境
查看conda环境
切换用户 su test1, 并查看conda环境
发现jupyter_hub虚拟环境在root用户和test1用户下都已存在
四、在jupyter_hub虚拟环境下配置jupyterhub
4.1 安装jupyterhub以及一些相关的jupyter库和调试工具
# 安装jupyter相关的库,从左至右依次是:hub,lab,用户管理,远程调试包
pip install jupyterhub jupyterlab jupyterhub-idle-culler ptvsd
# 安装configurable-http-proxy
npm install -g configurable-http-proxy
# 安装调试工具
conda install -c conda-forge xeus-python
jupyter labextension install @jupyterlab/debugger
# 安装debug插件
jupyter labextension install @jupyterlab/debugger
conda install xeus-python -c conda-forge
4.2 测试软件
jupyterhub -h
configurable-http-proxy -h
这里出现了错误,显示configurable-http-proxy:command not found,我的做法是先不管,后续在jupyterhub_config.py文件里面,写入configurable-http-proxy的绝对路径。
4.3 生成并修改配置文件
# 在/etc下创建一个jupyterhub文件夹,用于存储jupyterhub的配置文件
mkdir /etc/jupyterhub
# 进入这个文件夹并生成配置文件
cd /etc/jupyterhub
jupyterhub --generate-config
4.4 编辑jupyterhub_config.py文件配置
import sys
c.Authenticator.admin_users = {'root'} # 管理员用户
# 管理员是否有权在各自计算机上以其他用户身份登录,以进行调试,此选项通常用于 JupyterHub 的托管部署,以避免在启动服务之前手动创建所有用户
c.JupyterHub.admin_access = True
c.JupyterHub.authenticator_class = 'jupyterhub.auth.PAMAuthenticator' #解决Centos下用户认证问题
c.PAMAuthenticator.open_sessions = False # 解决多用户同时登录问题
c.Spawner.args = ['--allow-root'] # 允许root用户使用
c.LocalAuthenticator.create_system_users = True # 允许创建其他用户
c.Spawner.notebook_dir = '~' # 设置工作目录
c.Spawner.default_url = '/lab'
c.JupyterHub.base_url = '/py'
c.ConfigurableHTTPProxy.command = '/usr/local/node-v16.14.2-linux-x64/bin/configurable-http-proxy'
# 设置用户一小时内无使用则关闭jupyterlab服务
c.JupyterHub.services = [
{
'name': 'idle-culler',
'command': [sys.executable, '-m', 'jupyterhub_idle_culler', '--timeout=3600'],
}
]
c.JupyterHub.load_roles = [
{
"name": "list-and-cull", # name the role
"services": [
"idle-culler", # assign the service to this role
],
"scopes": [
# declare what permissions the service should have
"list:users", # list users
"read:users:activity", # read user last-activity
"admin:servers", # start/stop servers
],
}
]
4.5 启动服务
# 启动服务
jupyterhub -f=/etc/jupyterhub/jupyterhub_config.py --no-ssl
# 服务挂载在后台
nohup jupyterhub -f=/etc/jupyterhub/jupyterhub_config.py --no-ssl >> jupyterhub_running.log 2>&1 &
五、通过文件夹共享或收集文件
为了分享数据决定设置一个包含原始数据和代码的只读文件夹,为了收集汇总用户/学生的作业数据和代码可以设置一个只写文件夹。(最终放弃)
5.1 在服务器中创建只读文件夹
通过在服务器中直接创建一个可供所有用户访问的只读文件夹,用户即可自行从中下载数据。这个目录将权限将只提供给root用户。整个过程可以直接选择使用root用户登录jupyterhub然后使用里面的 命令行进程完成:
在root用户登录后,打开一个命令行进程,如下:
然后,在用户目录下创建一个文件夹,并将其动态链接到系统的/srv/data/my_shared_data_folder文件夹。在JupyterHub中,用户的主目录位于/etc/skel路径下,放置在此目录中的任何内容也将显示在新用户的主目录中。具体的方法为:
# 在/srv路径下创建一个存放数据的文件夹
sudo mkdir -p /srv/data/shared_data_folder
# 在用户的根目录中添加该文件夹
# 首先进入etc/skel目录
cd /etc/skel
# 然后创建两个文件夹之间的动态链接
sudo ln -s /srv/data/shared_data_folder shared_data_folder
创建一个新用户test2,并通过test2 身份登录确认是否有效,你以新用户身份登录后,该文件夹出现在新用户主目录中,如下图
此后,当一个新的用户账户被创建时,他们的主目录中会带有有这个文件夹(以及/etc/skel中的其他文件),当服务器文件夹中的内容发生变化时,用户目录中的内容也会同时变化。需要注意的是,这个操作不会对现有用户的目录产生影响,即新的共享文件夹不会被写入旧用户的主目录中。
5.2 在服务器中创建只写文件夹
为了实现有一个共享文件夹,所有用户都可以访问,并互相共享数据,但共享的数据除共享者有修改权限外,其他用户只有运行和查看下载的权限,并没有修改权限。决定在服务器中创建只写文件夹实现,具体操作如下:
依旧是root用户登录jupyterhub,并打开一个命令行(或者在服务器内直接操作也可以),然后创建/srv/scratch文件夹
sudo mkdir -p /srv/scratch
接着将文件夹管理权交给用户组:anaconda,并更改该文件夹的权限设置
# 将文件夹管理权交给用户组:anaconda
charp -R anaconda /srv/scratch
# 对共享文件夹设置权限,1.子目录全部继承父目录,2.给予文件拥有组成员s权限
sudo chmod 777 /srv/scratch
sudo chmod g+s /srv/scratch
新建文件夹的默认权限使用全局umask(drwxr-sr-x),chmod g+s表示文件使用jupyterhub-users组的默认权限(rw-r--r--)
最后,在用户目录/etc/skel/路径下创建该文件夹的链接
sudo ln -s /srv/scratch /etc/skel/scratch
当新用户进入JupyterHub后,他们的主目录中会带有有这个文件夹。同样,该配置只针对于新用户的目录有效。
这样就实现了组内共享文件的需求。
ps.若想实现最终目的,需要在共享文件夹内为每一个用户建一个属于他们的文件夹,共享数据都共享在自己文件夹内,不然直接在文件夹内新建数据的话,新建数据的用户会自动占有共享文件夹的权限(尽管从linux数据权限考虑或者jupyterhub官方文档说明考虑,都不会导致这样的情况发生,而且服务器内文件是建在每个用户自己文件夹内的,也能看到文件所属于所建用户,但现实测试发现会出现直接在共享文件夹新建数据会占据共享文件夹的情况)。
以下是新建一个用户test4,并且新建用户出现scratch文件夹。
六、禁止从jupyterlab面板中下载文件
关于工作环境内是否有涉密文件或者服务器大文件下载产生的流量费过高问题:
6.1 下载选项作为扩展禁用
jupyter labextension disable @jupyterlab/docmanager-extension:download
6.2 删除右键菜单中的下载选项
jupyter labextension disable @jupyterlab/filebrowser-extension:download