ollama编译安装@focal jammy Ubuntu @FreeBSD jail

Ollama是一个用于在本地运行大型语言模型(LLM)的开源框架。它支持多种操作系统,但是唯独不支持FreeBSD,于是尝试在FreeBSD的jail里安装Ubuntu,Ubuntu里再安装ollama。

先上结论,好像focal jail无法编译成功,jammy jail还没做实验,jammy bhyve可以编译安装成功。

如果go的版本较低,需要升级go版本。

ollama最快的安装方法是直接执行:

复制代码
curl -fsSL https://ollama.com/install.sh | sh

但是国内速度非常慢,可以选择编译安装

如果jail需要sudo -S才能用sudo,那么需要修改install.sh文件,把里面的sudo改成sudo -S

ollama编译安装

首先下载软件

复制代码
git clone https://github.com/ollama/ollama

然后到ollama目录执行go generate:

复制代码
go generate ./...

这段时间较长 ,因为要编译llama.cpp等包。最后generate完成

复制代码
+ git checkout examples/llava/clip.cpp
Updated 0 paths from the index
+ for patch in ../patches/*.diff
++ grep '^+++ ' ../patches/09-pooling.diff
++ cut -f2 '-d '
++ cut -f2- -d/
+ for file in $(grep "^+++ " ${patch} | cut -f2 -d' ' | cut -f2- -d/)
+ cd ../llama.cpp
+ git checkout src/llama.cpp
Updated 0 paths from the index
++ cd ../build/linux/x86_64/cpu_avx2/..
++ echo cpu cpu_avx cpu_avx2
+ echo 'go generate completed.  LLM runners: cpu cpu_avx cpu_avx2'
go generate completed.  LLM runners: cpu cpu_avx cpu_avx2

然后build

复制代码
go build .

如果go比较慢,可以加速:

复制代码
#启用 Go Modules 功能
export GO111MODULE=on
#配置 GOPROXY 环境变量
export GOPROXY=https://goproxy.io

如果Ubuntu没有安装一些依赖包,那么可以apt安装

复制代码
apt install cmake go

Ubuntu 版本里面自带的go版本较低,若build ollama的时候报错,需要升级go到新版本

升级go操作

下载go软件地址:All releases - The Go Programming Language

从上面下载地址找到自己需要的平台版本,然后使用wget下载软件:

https://go.dev/dl/go1.22.5.linux-amd64.tar.gz

复制代码
wget https://go.dev/dl/go1.22.5.linux-amd64.tar.gz

解压缩

复制代码
tar -xzvf go1.22.5.linux-amd64.tar.gz

解压缩之后直接添加路径就能使用新版本了:

复制代码
export PATH=/home/skywalk/download/go/bin:$PATH

路径设好,新版本go安装完了,这样就能愉快的使用go的新版本拉!

go加速网站:GOPROXY.IO - A Global Proxy for Go Modules

加速命令:

复制代码
# Set the GOPROXY environment variable
export GOPROXY=https://goproxy.io,direct
# Set environment variable allow bypassing the proxy for specified repos (optional)
export GOPRIVATE=git.mycompany.com,github.com/my/private

调试

build报错cannot load cmp: malformed module path "cmp":

build的死后报错信息:

复制代码
go: finding github.com/leodido/go-urn v1.4.0
build github.com/ollama/ollama: cannot load cmp: malformed module path "cmp": missing dot in first path element

难道目录一定要github.com ? 改成github.com目录,还是报错

复制代码
build github.com/ollama/ollama: cannot load cmp: malformed module path "cmp": missing dot in first path element

原来不是目录的事,我就说不能要求父目录的格式啊,况且以前也没碰到过要改目录名的情况。最终发现是go版本低的问题,改成go的1.23.x新版本,问题解决!

安装go新版本的方法见上面,也可以参考文章:Ubuntu linux安装新版本go-CSDN博客

jail里sudo 报错Name or service not known

root@ubfocal:~# sudo ls

sudo: unable to resolve host ubfocal.my.domain: Name or service not known

sudo倒是能执行,但是有报错,强迫症受不了,于是找到解决方法:

写host的文件,加入主机名和带域名的主机名

复制代码
cat /etc/hosts
127.0.0.1	localhost
127.0.0.1 ubfocal
127.0.0.1 ubfocal.my.domain

jail里个人用户sudo报错sudo: a terminal is required to read the password; either use the -S option

这是普通Ubuntu装机用户永远也不会碰到的问题,只有在FreeBSD里的linux jail里才会碰到,众所周知FreeBSD的用户占比很小,再安装Jail,jail里再安装Ubuntu的,就更少了,所以这个问题非常罕见。

~$ sudo ls

sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper

按照报错提示,使用sudo -S 后面跟要执行的命令,问题解决。如果是在install.sh这样的执行文件里用到了sudo指令,需要打文件里加上-S参数。

jail里个人用户git clone报错open /dev/null or dup failed: Permission denied

复制代码
@ubfocal:~/github.com$ git clone --deptch 1 https://github.com/ollama/ollama
fatal: open /dev/null or dup failed: Permission denied
@ubfocal:~/github.com$ ls -l /dev/null
-rw-r--r-- 1 root root 0 Jul 13 07:59 /dev/null

解决方法,把/dev/null权限设为 666

复制代码
sudo chmod 666 /dev/null

问题解决

用bhyve jammy Ubuntu环境go generate的时候说go版本低

发现bhyve jammy Ubuntu里的go版本1.18,使用apt不方便提高go版本,于是想了个投机取巧的办法:

修改go.mod文件,把 第三行go 1.22.0改成go 1.23

可以蒙混过去,但是后面go build . 的时候还是报错了

go build .

server/images.go:5:2: package cmp is not in GOROOT (/usr/lib/go-1.18/src/cmp)

envconfig/config.go:6:2: package log/slog is not in GOROOT (/usr/lib/go-1.18/src/log/slog)

gpu/amd_linux.go:12:2: package slices is not in GOROOT (/usr/lib/go-1.18/src/slices)

这样证明还是无法投机取巧。只能升级go版本了。

安装go新版本的方法见上面,也可以参考文章:Ubuntu linux安装新版本go-CSDN博客

相关推荐
JZC_xiaozhong1 小时前
数据不互通、审批慢?企业多系统智能协同与流程自动化解决方案
运维·自动化·流程管理·流程自动化·数据集成与应用集成·流程监控·流程可视化设计
爱学习的小囧2 小时前
ESXi 8.0 原生支持 NVMe 固态硬盘吗?VMD 配置详解教程
linux·运维·服务器·esxi·esxi8.0
专注写bug2 小时前
Spring AI Alibaba——支持Agent Skill
ai·llm·langchain4j·ai alibaba
坚持就完事了2 小时前
Linux中的变量
linux·运维·服务器
hERS EOUS2 小时前
nginx 代理 redis
运维·redis·nginx
handler012 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
Cat_Rocky2 小时前
利用Packet Tracer网络实验
linux·运维·服务器
嵌入式×边缘AI:打怪升级日志3 小时前
Linux 驱动实战:SR501 人体红外传感器驱动开发与调试全记录
linux·运维·驱动开发
正点原子3 小时前
【正点原子Linux连载】第三章 U-Boot使用 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南
linux·运维·驱动开发
Qbw20043 小时前
【Linux】进程地址空间
linux·c++