LinuxMint开发环境搭建指南¶
选择正确的版本¶
您可以从 Linux Mint website 下载 Linux Mint。
阅读下文以选择合适的版本和架构.
Cinnamon,MATE 还是 Xfce?¶
Linux Mint 有三种不同风格的版本,分别提供三种不同的桌面环境。
Cinnamon | 最现代,最新颖,全功能的桌面 |
MATE | 更稳定,更快的桌面 |
Xfce | 最轻量级,最稳定 |
Linux Mint 最流行的版本是 Cinnamon 版。Cinnamon 是主要由 Linux Mint 团队开发,专为 Linux Mint 打造的桌面环境,流畅,美观,充满新特性。
Linux Mint 也参与了 MATE 的开发。MATE 是一个经典的桌面环境。它是 GNOME 2 的一个延续,在 2006 到 2011 年间曾作为 Linux Mint 的默认桌面环境。虽然它缺少一些新特性,开发也比 Cinnamon 要慢,但它运行更加快速,消耗更少资源,也比 Cinnamon 更加稳定。
Xfce 是一个轻量级的桌面环境。它支持的特性没有 Cinnamon 和 MATE 那么多,但极其稳定,消耗极少的资源。
当然,三种桌面都非常优秀,Linux Mint 为每个版本都非常自豪。虽然有的版本提供更多的特性和更好的支持,有的版本则有更快的运行和更低的资源消耗,它们都是不错的选择,而选择合适的版本在很大程度上只取决于个人口味。
除了特性和性能之外,Cinnamon 、Mate 和 Xfce 还代表了三种不同的桌面环境,它们有不同的菜单,不同的面板和配置工具。让您感到舒适自在的桌面环境就是您最好的选择。
如果您不确定应该选取哪个桌面,可以从 Cinnamon 版开始。当您有时间的时候,可以把所有的版本都尝试一遍。每个版本在 Linux Mint 社区中都有自己的受众,也都十分流行。
32位还是64位?¶
建议使用64位。
32位的ISO映像是为了与旧计算机兼容而提供的。目前32位的处理器已经非常罕见,大部分计算机都可以以64位运行。如果您的计算机出厂于2007年以后,其处理器很可能是64位的。
如果您有一台老计算机,并且不确定它是否能以64位运行,请阅读 X86 Chronology.
小技巧
您可以尝试在您的计算机上启动64位的 Linux Mint。即使它不兼容,也不会对计算机造成不良影响。您只会收到一条错误消息。
验证你的ISO镜像¶
验证ISO镜像 的完整性和可靠性是很重要的。
完整性检查确认你的ISO映像是否被正确下载,并且你的本地文件是否和下载服务器上存在的文件完全一致。下载过程中的错误可能导致文件损坏,并在安装过程中引发随机问题。
可靠性检验确认你下载的ISO镜像是否由Linux Mint签署的,因此它并不是被别人修改或恶意的拷贝。
下载由Linux Mint提供的SHA256值¶
所有 download mirrors 都提供ISO镜像, 一个 sha256sum.txt
文件和一个 sha256sum.txt.gpg
文件。你应该能够在你下载ISO镜像相同的位置找到这些文件。
如果你不能找到他们,请浏览 Heanet download mirror 并且检查你下载的Linux Mint版本。
下载 sha256sum.txt
和 sha256sum.txt.gpg
.
完整性检查¶
为了检验你本地ISO文件的完整性,生成它的SHA256值并且与 sha256sum.txt
里面的值进行比较。
sha256sum -b yourfile.iso
提示
如果你正在使用Windows系统,你可以通过安装 Cygwin 得到sha256值(和gpg)命令工具。
如果sum匹配,你的ISO映像被成功下载。如果没有,请再次下载。
校验和真实性检查¶
采取下面的步骤来核实 sha256sum.txt
的真实性, 以及检查 sha256sum.txt.gpg
的签名。
导入的Linux Mint的签名密钥:¶
gpg --keyserver keyserver.ubuntu.com --recv-key "27DE B156 44C6 B3CF 3BD7 D291 300F 846B A25B AE09"
注解
如果gpg提示ID非法,请尝试下面的命令:
gpg --keyserver keyserver.ubuntu.com --recv-key A25BAE09
gpg --list-key --with-fingerprint A25BAE09
检查最后命令的输出,确保指纹是 27DE B156 44C6 B3CF 3BD7 D291 300F 846B A25B AE09
.
验证sha256sum.txt的真实性:¶
gpg --verify sha256sum.txt.gpg sha256sum.txt
最后指令的输出应该告诉你文件签名是 good
的而且它以 A25BAE09
密钥签署。
注解
GPG也许会警告你Linux Mint签名并不会你的电脑所信任。这是意料之中的,非常正常。
提示
寻找有关ISO校验的更多信息,或者BETA、LMDE以及其他发行版校验的信息,请阅读 How to Verify ISO images 。
创建启动介质¶
现代的电脑上几乎很少使用光驱,因此我们采用U盘来进行安装。
如何制作U盘启动盘¶
下载、安装、运行 Etcher 。
点击 Select image, 然后选择您的ISO文件。
点击 Select drive, 然后选择您的U盘。
点击 Flash!.
提示
也可以使用 Win32 Disk Imager 来制作启动U盘。操作同上。
启动Linux¶
现在您在U盘上有了一个可用于启动计算机的 Linux Mint 系统。
- 将U盘插入您的计算机。
- 重启计算机。
- 在您的计算机启动您当前的操作系统(Windows,Mac,Linux)之前,你会看到您的 BIOS 加载画面。请查看屏幕或计算机的说明书,以确认按哪个键来从USB启动。
注解
大部分BIOS有一个特殊的键,您可以按该键以选择启动设备。所有的BIOS都有一个特殊的键来进入BIOS设置屏幕,你可以在该设置屏幕中调整启动顺序。对不同的BIOS,这个特殊键可能是 Escape, F1, F2, F8, F10, F11, F12,或者是 Delete。这些信息通常在启动时短暂地出现在屏幕上。
- Linux Mint ISO 可以在 EFI 或 BIOS 模式中启动。在 EFI 模式中它会显示一个 grub 菜单。在 BIOS 模式中它会显示一个 isolinux 菜单。
- 在这两个菜单中, 按 Enter 以从您的U盘启动Linux。
分区¶
Linux下的磁盘和分区¶
如果你不熟悉设备和分区的Linux命名方案,或者文件系统和挂载点的概念,请阅读:
独立的/home分区¶
在Linux中, /home
目录被用来个人数据和偏好设置。
这个目录包含每个用户帐户的一个子目录。 比如说你的用户名是 john
, 你的主目录是 /home/john
, 你的下载目录是 /home/john/Downloads
, 你的文档目录是 /home/john/Documents
, 你的火狐书签在 /home/john/.mozilla
, 等等。
通过给 /home
单独分区, 你可以把个人数据和其余部分的操作系统分开来。
优点是您可以在不影响用户数据的情况下擦除操作系统并进行替换。
您在安装 Linux Mint 时:
- 将
/
挂载点分配给专用于操作系统的分区,并告诉安装程序将其格式化。 - 将
/home
挂载点分配给专用于用户数据的分区,如果它已经包含用户数据,请确保告诉安装程序 不要格式化它。
警告
对于新手用户来说,这是不推荐的。安装过程中的失误可能会删除所有数据。始终进行备份,确保选择了正确的分区并仔细查看格式化选项。
注解
Linux Mint操作系统大约占据15GB并随着你安装的附加软件而增长。如果你能腾出空间,给它100GB。保留大部分空闲空间用于家分区。用户数据(下载、视频、图片)会占用更多的空间。
安装 Linux Mint¶
临时会话¶
当你从U盘引导系统后, LinuxMint进入了一个 临时会话
。它会自动以用户名为 mint
的用户登录, 并有一个安装器在桌面上:
临时会话
与普通会话(例如在计算机上永久安装的Linux Mint)类似,但有以下例外情况:
- 临时会话运行比较慢(它是从一个u盘加载的,而不是SSD或HDD)。
- 你在临时会话中所做的更改不是永久的。它们没有被写入U盘,也不会影响通过安装程序安装的系统。
- 一些软件会在临时会话中不一样 (或者完全不一样,例如Timeshift, Flatpak, 更新管理器, 欢迎界面等等)。
提示
临时会话的用户名是 mint
。 如果要求输入密码,请按 Enter.
在您的计算机上安装 Linux Mint¶
按以下步骤操作,以在你的电脑上永久的安装Linux Mint:
- 双击 Install Linux Mint.
- 选择你的语言。
- 连接的互联网。
- 如果你想安装额外的多媒体解码器,请勾选下面的复选框。
- 选择一种安装类型。
如果Linux Mint是你想在这个电脑上运行的唯一系统并且硬盘上所有的数据都可以丢失,选择 Erase disk and install Linux Mint.
注解
如果你想自定义分区请选择 Something else.
建议给根分区分配100G以上大小的空间,同时采用 ext4
文件系统。有关分区技巧,请参考 分区 。

还要创建一个 swap
分区, 大小和你的内存大小一样。
如果你硬盘上有 Windows
系统,不用担心,安装程序会自动识别它,并在启动时提供一个菜单让你选择从哪个系统启动。请将 LinuxMint
安装到一个单独的分区,否则你将破坏你的 Windows
系统。
- 选择你的时区。
- 选择你的键盘布局。
- 输入你的用户信息。
选用一个强密码。
- 当安装完成,点击 Restart Now.
电脑在重启前会提示你移除U盘,照做就可以了。
CMake使用简说¶
CMake是一种优秀的跨平台的构建系统, 类似于Makefile, 是专为C/C++开发的一套构建系统。
它使用自己定义的一套脚本语言来描述构建关系,最终也是生成Makefile。所以当您拿到一份采用CMake构建的源码时,它的使用姿势通常是这样的:
cmake .
make
构建可执行文件¶
一般来说,一个 CMakeLists.txt
文件长的是这样的:
cmake_minimum_required (VERSION 2.6)
project (helloworld)
set(HELLO_SRC hello.cpp)
add_executable(hello ${HELLO_SRC})
- cmake_minimum_required 指定了CMake的最低版本, 使用低于这个版本的CMake将会报错。
- project 指定了项目名称。
- set 是CMake脚本语言中用来给变量赋值的函数。
- add_executable 用来告诉CMake为我们用
HELLO_SRC
中的源文件生成一个可执行文件。
构建动态库和静态库¶
在CMake中提供了 add_library 这个函数来创建库, 具体用法如下:
# build shared library
add_library(LIB_NAME SHARED ${LIB_SRC})
# build static library
add_library(LIB_NAME STATIC ${LIB_SRC})
警告
在实际的环境中, CMake的目标名必须唯一,上面所示代码块中的 LIB_NAME
出现了两次,只是为了演示目的,在真实的环境中,这样做是会被报错的。
链接¶
CMake中我们使用 target_link_libraries 来进行链接操作。
target_link_libraries(hello LIB_NAME)
交叉编译的注意事项¶
在使用Yocto工具链进行交叉编译时,应当 避免 source其自带的 environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi
脚本后,直接cmake。原因是该脚本只是设置了 CC
等相关的环境变量,而CMake并不认为自身处于交叉编译的状态之下。这将可能导致一系列错误。
正确的做法是使用 -DCMAKE_TOOLCHAIN_FILE=path/to/file
来指定编译时的交叉编译工具链:
cmake -DCMAKE_TOOLCHAIN_FILE=path/to/file .
下面附上我自己写的 toolchain.cmake
:
SET(CMAKE_SYSTEM_NAME Linux)
set(CROSS_COMPILE_TOOLCHAIN_PATH $ENV{OECORE_NATIVE_SYSROOT}/usr/bin/aarch64-poky-linux)
set(CROSS_COMPILE_TOOLCHAIN_PREFIX "aarch64-poky-linux")
set(CROSS_COMPILE_SYSROOT $ENV{OECORE_TARGET_SYSROOT})
set(CMAKE_SYSROOT $ENV{OECORE_TARGET_SYSROOT})
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/usr/lib/cmake)
set(CMAKE_FIND_ROOT_PATH $ENV{OECORE_TARGET_SYSROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
if(DEFINED POLLY_COMPILER_GCC_CROSS_COMPILE)
return()
else()
set(POLLY_COMPILER_GCC_CROSS_COMPILE TRUE)
endif()
if( CMAKE_TOOLCHAIN_FILE )
# touch toolchain variable to suppress "unused variable" warning
endif()
string(COMPARE EQUAL
"${CROSS_COMPILE_TOOLCHAIN_PATH}"
""
_is_empty
)
if(_is_empty)
message(FATAL_ERROR "CROSS_COMPILE_TOOLCHAIN_PATH not set.")
endif()
string(COMPARE EQUAL
"${CROSS_COMPILE_TOOLCHAIN_PREFIX}"
""
_is_empty
)
if(_is_empty)
message(FATAL_ERROR "CROSS_COMPILE_TOOLCHAIN_PREFIX not set.")
endif()
string(COMPARE EQUAL
"${CROSS_COMPILE_SYSROOT}"
""
_is_empty
)
if(_is_empty)
message(FATAL_ERROR "CROSS_COMPILE_SYSROOT not set.")
endif()
if(POLLY_SKIP_SYSROOT)
# Do not modify CMAKE_{C,CXX}_FLAGS
# Workaround for x86_64-pc-linux-gcc error:
# "this linker was not configured to use sysroots"
else()
set(SYSROOT_COMPILE_FLAG "--sysroot=${CROSS_COMPILE_SYSROOT}")
endif()
# The (...)_PREFIX variable name refers to the Cross Compiler Triplet
set(TOOLCHAIN_PATH_AND_PREFIX ${CROSS_COMPILE_TOOLCHAIN_PATH}/${CROSS_COMPILE_TOOLCHAIN_PREFIX})
set(CMAKE_C_COMPILER "${TOOLCHAIN_PATH_AND_PREFIX}-gcc" CACHE PATH "C compiler" )
set(CMAKE_CXX_COMPILER "${TOOLCHAIN_PATH_AND_PREFIX}-g++" CACHE PATH "C++ compiler" )
set(CMAKE_ASM_COMPILER "${TOOLCHAIN_PATH_AND_PREFIX}-as" CACHE PATH "Assembler" )
set(CMAKE_C_PREPROCESSOR "${TOOLCHAIN_PATH_AND_PREFIX}-cpp" CACHE PATH "Preprocessor" )
set(CMAKE_STRIP "${TOOLCHAIN_PATH_AND_PREFIX}-strip" CACHE PATH "strip" )
if( EXISTS "${TOOLCHAIN_PATH_AND_PREFIX}-gcc-ar" )
# Prefer gcc-ar over binutils ar: https://gcc.gnu.org/wiki/LinkTimeOptimizationFAQ
set(CMAKE_AR "${TOOLCHAIN_PATH_AND_PREFIX}-gcc-ar" CACHE PATH "Archiver" )
else()
set(CMAKE_AR "${TOOLCHAIN_PATH_AND_PREFIX}-ar" CACHE PATH "Archiver" )
endif()
set(CMAKE_LINKER "${TOOLCHAIN_PATH_AND_PREFIX}-ld" CACHE PATH "Linker" )
set(CMAKE_NM "${TOOLCHAIN_PATH_AND_PREFIX}-nm" CACHE PATH "nm" )
set(CMAKE_OBJCOPY "${TOOLCHAIN_PATH_AND_PREFIX}-objcopy" CACHE PATH "objcopy" )
set(CMAKE_OBJDUMP "${TOOLCHAIN_PATH_AND_PREFIX}-objdump" CACHE PATH "objdump" )
set(CMAKE_RANLIB "${TOOLCHAIN_PATH_AND_PREFIX}-ranlib" CACHE PATH "ranlib" )
set(CMAKE_RC_COMPILER "${TOOLCHAIN_PATH_AND_PREFIX}-windres" CACHE PATH "WindowsRC" )
set(CMAKE_Fortran_COMPILER "${TOOLCHAIN_PATH_AND_PREFIX}-gfortran" CACHE PATH "gfortran" )
Android开发环境简说¶
AOSP
使用Makefile构建了一套自己的编译系统,其中有很多预定义的函数,编写Android.mk
就是使用这些预定义的函数并结合MakeFile的规则来告诉 AOSP
怎么去构建我们怎么的
代码。
例子¶
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_THIRD_LDLIBS_PATH = src/third_party_libs/lib
LOCAL_MODULE := avfilter
LOCAL_C_INCLUDES := src/third_party_libs/include
LOCAL_SRC_FILES := $(LOCAL_THIRD_LDLIBS_PATH)/libavfilter.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := src/helloworld.c
LOCAL_MODULE := helloworld
LOCAL_STATIC_LIBRARIES := avfilter
LOCAL_LDLIBS += -lm -lz -lc
include $(BUILD_SHARED_LIBRARY)
上面的例子什么意思?¶
LOCAL_PATH
用来表示当前Android.mk所处的路径include $(CLEAR_VARS)
用来清空除LOCAL_PATH
以外的变量LOCAL_THIRD_LDLIBS_PATH
用来表示第三方库的存放路径LOCAL_C_INCLUDES
用来指定编译时使用的头文件的路径LOCAL_SRC_FILES
用来指定编译时使用的源文件的路径include $(PREBUILT_STATIC_LIBRARY)
用来告诉构建系统我们希望构建一个包含预构建静态库的模块LOCAL_STATIC_LIBRARIES
用来指定编译所需要的静态库LOCAL_LDLIBS
用来指定链接使用的库BUILD_SHARED_LIBRARY
用来告诉编译系统我们希望构建一个共享库
上面的例子首先定义了一个 avfilter
模块。这个模块包含了一个构建好的静态库。然后
又定义了一个 helloworld
模块。 helloworld
模块编译了 src/helloworld.c
,
并链接了 avfilter
模块提供的静态库,同时还链接了 libm
、 libc
、 libz
这些库。限于篇幅,本教程不能够涵盖Android.mk编写的全部知识,读者可以通过访问 Android.mk 来了解细节。
VIM的基本使用¶
VIM是流行于全世界程序员中间的编辑器,以至于它成了在shell下编辑文本首选。VIM的精髓 就在于不同按键之间的任意组合。我们只需要掌握一些常用的就可以了。
警告
我们应当了解 vim 和 vi 是近亲, 但它们有一些不一样的地方, 在嵌入式操作系统 里我们通常用的是 vi.
光标移动¶
^ | 将光标移动到本行第一个非空白字符 |
$ | 将光标移动到行尾 |
gg | 将光标移动到文档的开头 |
G | 将光标移动到文档的末尾 |
w | 将光标移动向前移动一个单词 |
从命令模式进入插入模式¶
i | 进入插入模式 |
a | 在后一个字符的位置进入插入模式 |
A | 在行尾进入插入模式 |
o | 在当前行下面新插入一行并进入插入模式 |
Esc | 退出插入模式 |
剪切与复制¶
dd | 删除当前行 |
p | 粘贴刚才删除的东西 |
dw | 删除一个单词 |
x | 删除一个字符 |
yy | 复制一行 |
yw | 复制一个单词 |
搜索¶
/pattern | 查找 pattern |
n | 向下查找 pattern |
N | 向上查找 pattern |
关闭与保存¶
:w | 保存 |
:q | 退出 |
:q! | 不保存就退出 |
:wq | 保存并退出 |
阅读代码¶
说实话, Linux下的代码阅读工具主要是各种Tag系统,在这里,介绍下我使用的 GNU Global.
安装GNU Global¶
sudo apt-get install global
sudo apt-get install ctags
提示
如果你嫌Ubuntu源里自带的版本太旧, 可以前往 Getting GLOBAL 下载源码自己编译。 同时你还可以编译 universal-ctags 来取代ctags, 以提高查找的精确度。
GNU Global的使用¶
在你的源码目录下面运行 gtags -v 来索引源码。
提示
如果你索引C++代码, 运行 export GTAGSFORCECPP=1 使得global将 .h 文件当作C++文件。
索引结束后你就可以使用 global 来浏览代码了。常用命令如下:
global <symbol> 查看symbol在什么地方被定义 global -xr <symbol> 查看symbol在什么地方被使用 global -u 增量更新tags 提示
通常可以将tag工具通过插件和编辑器更好的结合起来,不过限于篇幅,本教程并不打算 涉及这个主题。读者可以自行研究。
CodeLite的安装与使用¶
CodeLite是一款C/C++的开源IDE,它长的是这个样子:
安装CodeLite¶
如果你使用的是Ubuntu 16.04或更新的版本,运行:
sudo apt-get install codelite codelite-plugins
就可以了。
提示
可能Ubuntu官方源中的codelite版本不是最新的,你需要运行以下命令从 CodeLite 自己的仓库中安装最新版本:
sudo apt-key adv --fetch-keys http://repos.codelite.org/CodeLite.asc
sudo apt-add-repository "deb http://repos.codelite.org/ubuntu/ $(lsb_release -sc) universe"
sudo apt-get update
sudo apt-get install codelite wxcrafter
创建工程¶
CodeLite的工程创建比较复杂,我个人喜欢写好CMake后,用CMake生成CodeLite的工程文件, 这样比较简单。命令如下:
cmake .. -G "CodeLite - Unix Makefiles"
在成功cmake后, 会在当前目录下生成后缀名为 .workspace 和 .project 的文件,再 启动 CodeLite, 点击 Open Workspace, 选择相应的 workspace 文件即可:
编译工程¶
在成功导入工程后,右击 Workspace, 在弹出的菜单中点击 Build 就可以了, 编译的结果会在下方弹出窗口中显示:
编译的结果显示在上图下方的弹出式窗口中。 点击其中的错误,会自动跳到相应的文件。
IntelliJ安装与使用简介¶
IntelliJ 是由JetBrains公司开发的IDE,其强大的功能使其成为开发Java的首选。
安装与运行¶
访问 Download IntelliJ IDEA 并根据你的操作系统来下载相应的安装包。 下载完成后,解压就完成了安装。进入解压目录下的 bin 目录,运行 idea.sh. 启动完成后,界面如下:
SpringBoot HelloWorld Demo¶
下面为大家演示下怎么用 IntelliJ 创建SpringBoot的工程:
在启动界面点击 Create New Project. 弹出以下界面:
选择左边的 Spring Initializr, 点击 Next.
保持 Project Metadata 处于默认状态, 点击 Next.
这里我们只是做个简单的演示,只选择 Web.
最后填写项目名称,路径,然后点击 Finish.
让我们新建一个类,右击左侧的包名 com.example.demo, 在弹出的菜单中选择 New -> JavaClass, 我们给这个类起名为 TestContoller.
给这个类添加上代码, 让Spring能将针对 http://127.0.0.1:8080/hello 的请求进行处理。代码如下:
package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class TestController { @ResponseBody @RequestMapping("/hello") public String hello() { return "Hello World!"; } }
大家可以看到在输入代码的过程中不需要我们手动的引入用到的类,IntelliJ已经帮我们自动引入了,在这个代码中我们只是简单的返回了一个 Hello World! 字符串。
点击界面右上角的 Run 按钮(在下图中用红框标出),启动我们的应用程序。
可以看到,在成功运行后, 底部弹出了一串Spring的Log。接着,打开浏览器访问 http://127.0.0.1:8080/hello. 应该出现下面的网页。
版本历史¶
beta2(2019-3-19)¶
- 修正了zshell的包名
- 添加了文档版本的章节
- 添加了在装有Windows的硬盘上安装Linux的注意事项
beta1(2019-3-16)¶
- 初版发布
写在最后的话¶
在本教程的写作过程中,得到了我司技术总监 周磊 先生的悉心指导。同时由于本人未曾涉猎过Java开发,在最后一章有关Java IDE的选择上,得到了同事 金庭瑶 的帮助。同时本教程借用了LinuxMint官方安装手册中的一些内容,在此也向LinuxMint项目表示感谢。
本教程使用 Sphinx 和 reStructuredText 构建。 由于本人水平有限,加之篇幅限制,诸多地方未能详述,对此我深表遗憾。期望各位同事不吝赐教,以利本教程充实和完善。本教程源码: https://github.com/chengyi/lm-general-env-setup-manual