❶ debian sparkr怎麼配置環境變數
1. SparkR的安裝配置
1.1. R與Rstudio的安裝
1.1.1. R的安裝
我們的工作環境都是在Ubuntu下操作的,所以只介紹Ubuntu下安裝R的方法:
1) 在/etc/apt/sources.list添加源
deb http://mirror.bjtu.e.cn/cran/bin/linux/ubuntu precise/,
然後更新源apt-get update;
2) 通過apt-get安裝:
sudo apt-get install r-base
1.1.2. Rstudio的安裝
官網有詳細介紹:
http://www.rstudio.com/procts/rstudio/download-server/
sudo apt-get install gdebi-core
sudo apt-get install libapparmor1 # Required only for Ubuntu, not Debian
wget http://download2.rstudio.org/rstudio-server-0.97.551-amd64.deb
sudo gdebi rstudio-server-0.97.551-amd64.deb
1.2. rjava安裝
1.2.1. rJava介紹
rJava是一個R語言和Java語言的通信介面,通過底層JNI實現調用,允許在R中直接調用Java的對象和方法。
rJava還提供了Java調用R的功能,是通過JRI(Java/R Interface)實現的。JRI現在已經被嵌入到rJava的包中,我們也可以單獨試用這個功能。現在rJava包,已經成為很多基於Java開發R包的基礎功能組件。
正是由於rJava是底層介面,並使用JNI作為介面調用,所以效率非常高。在JRI的方案中,JVM通過內存直接載入RVM,調用過程性能幾乎無損耗,因此是非常高效連接通道,是R和Java通信的首選開發包。
1.2.2. rJava安裝
1) 配置rJava環境
執行R CMD javareconf
root@testnode4:/home/payton# R CMD javareconf
2) 啟動R並安裝rJava
root@testnode4:/home/payton# R
> install.packages("rJava")
1.3. SparkR的安裝
1.3.1. SparkR的代碼下載
從網頁下載代碼SparkR-pkg-master.zip https://github.com/amplab-extras/SparkR-pkg
1.3.2. SparkR的代碼編譯
1) 解壓SparkR-pkg-master.zip,然後cd SparkR-pkg-master/
2) 編譯的時候需要指明Hadoop版本和Spark版本
SPARK_HADOOP_VERSION=2.4.1 SPARK_VERSION=1.2.0 ./install-dev.sh
至此,單機版的SparkR已經安裝完成。
1.3.3. 分布式SparkR的部署配置
1) 編譯成功後,會生成一個lib文件夾,進入lib文件夾,打包SparkR為SparkR.tar.gz,這個是分布式SparkR部署的關鍵。
2) 由打包好的SparkR.tar.gz在各集群節點上安裝SparkR
R CMD INSTALL SparkR.tar.gz
至此分布式SparkR搭建完成。
2. SparkR的運行
2.1. SparkR的運行機制
SparkR是AMPLab發布的一個R開發包,為Apache Spark提供了輕量的前端。SparkR提供了Spark中彈性分布式數據集(RDD)的API,用戶可以在集群上通過R shell交互性的運行job。SparkR集合了Spark 和R的優勢,下面的這3幅圖很好的闡釋了SparkR的運行機制。
2.2. 用SparkR 進行數據分析
2.2.1. SparkR基本操作
首先介紹下SparkR的基本操作:
第一步,載入SparkR包
library(SparkR)
第二步,初始化Spark context
sc <- sparkR.init(master=" spark://localhost:7077"
,sparkEnvir=list(spark.executor.memory="1g",spark.cores.max="10"))
第三步,讀入數據,spark的核心是Resilient Distributed Dataset (RDD),RDDS可以從Hadoop的InputFormats來創建(例如,HDFS文件)或通過轉化其它RDDS。例如直接從HDFS讀取數據為RDD的示例如下:
lines <- textFile(sc, "hdfs://sparkR_test.txt")
另外,也可以通過parallelize函數從向量或列表創建RDD,如:
rdd <- parallelize(sc, 1:10, 2)
到了這里,那麼我們就可以運用RDD的動作(actions)和轉換(transformations)來對RDD進行操作並產生新的RDD;也可以很容易地調用R開發包,只需要在集群上執行操作前用includePackage讀取R開發包就可以了(例:includePackage(sc, Matrix));當然還可以把RDD轉換為R語言格式的數據形式來對它進行操作。
具體可參見如下兩個鏈接:
http://amplab-extras.github.io/SparkR-pkg/
https://github.com/amplab-extras/SparkR-pkg/wiki/SparkR-Quick-Start
那麼下面我們就通過兩個示例來看下 SparkR是如何運行的吧。
2.2.2. SparkR使用舉例
1) Example1:word count
# 載入SparkR包
library(SparkR)
# 初始化 Spark context
sc <- sparkR.init(master="spark://集群ip:7077"
,sparkEnvir=list(spark.executor.memory="1g",spark.cores.max="10"))
# 從HDFS上讀取文件
lines <- textFile(sc, "hdfs://集群ip:8020/tmp/sparkR_test.txt")
# 按分隔符拆分每一行為多個元素,這里返回一個序列
words<-flatMap(lines,function(line) {strsplit(line,"\\|")[[1]]})
# 使用 lapply 來定義對應每一個RDD元素的運算,這里返回一個(K,V)對
wordCount <-lapply(words, function(word) { list(word, 1L) })
# 對(K,V)對進行聚合計算
counts<-receByKey(wordCount,"+",2L)
# 以數組的形式,返回數據集的所有元素
output <- collect(counts)
# 按格式輸出結果
for (wordcount in output) {
cat(wordcount[[1]], ": ", wordcount[[2]], "\n")
}
2) Example2:logistic regression
# 載入SparkR包
library(SparkR)
# 初始化 Spark context
sc <- sparkR.init(master="集群ip:7077",
appName='sparkr_logistic_regression',
sparkEnvir=list(spark.executor.memory='1g',
spark.cores.max="10"))
# 從hdfs上讀取txt文件, 該RDD由spark集群的4個分區構成
input_rdd <- textFile(sc,
"hdfs://集群ip:8020/user/payton/german.data-numeric.txt",
minSplits=4)
# 解析每個RDD元素的文本(在每個分區上並行)
dataset_rdd <- lapplyPartition(input_rdd, function(part) {
part <- lapply(part, function(x) unlist(strsplit(x, '\\s')))
part <- lapply(part, function(x) as.numeric(x[x != '']))
part
})
# 我們需要把數據集dataset_rdd分割為訓練集(train)和測試集(test)兩部分,這里
# ptest為測試集的樣本比例,如取ptest=0.2,即取dataset_rdd的20%樣本數作為測試
# 集,80%的樣本數作為訓練集
split_dataset <- function(rdd, ptest) {
#以輸入樣本數ptest比例創建測試集RDD
data_test_rdd <- lapplyPartition(rdd, function(part) {
part_test <- part[1:(length(part)*ptest)]
part_test
})
# 用剩下的樣本數創建訓練集RDD
data_train_rdd <- lapplyPartition(rdd, function(part) {
part_train <- part[((length(part)*ptest)+1):length(part)]
part_train
})
# 返回測試集RDD和訓練集RDD的列表
list(data_test_rdd, data_train_rdd)
}
# 接下來我們需要轉化數據集為R語言的矩陣形式,並增加一列數字為1的截距項,
# 將輸出項y標准化為0/1的形式
get_matrix_rdd <- function(rdd) {
matrix_rdd <- lapplyPartition(rdd, function(part) {
m <- matrix(data=unlist(part, F, F), ncol=25, byrow=T)
m <- cbind(1, m)
m[,ncol(m)] <- m[,ncol(m)]-1
m
})
matrix_rdd
}
# 由於該訓練集中y的值為1與0的樣本數比值為7:3,所以我們需要平衡1和0的樣本
# 數,使它們的樣本數一致
balance_matrix_rdd <- function(matrix_rdd) {
balanced_matrix_rdd <- lapplyPartition(matrix_rdd, function(part) {
y <- part[,26]
index <- sample(which(y==0),length(which(y==1)))
index <- c(index, which(y==1))
part <- part[index,]
part
})
balanced_matrix_rdd
}
# 分割數據集為訓練集和測試集
dataset <- split_dataset(dataset_rdd, 0.2)
# 創建測試集RDD
matrix_test_rdd <- get_matrix_rdd(dataset[[1]])
# 創建訓練集RDD
matrix_train_rdd <- balance_matrix_rdd(get_matrix_rdd(dataset[[2]]))
# 將訓練集RDD和測試集RDD放入spark分布式集群內存中
cache(matrix_test_rdd)
cache(matrix_train_rdd)
# 初始化向量theta
theta<- runif(n=25, min = -1, max = 1)
# logistic函數
hypot <- function(z) {
1/(1+exp(-z))
}
# 損失函數的梯度計算
gCost <- function(t,X,y) {
1/nrow(X)*(t(X)%*%(hypot(X%*%t)-y))
# 定義訓練函數
train <- function(theta, rdd) {
# 計算梯度
gradient_rdd <- lapplyPartition(rdd, function(part) {
X <- part[,1:25]
y <- part[,26]
p_gradient <- gCost(theta,X,y)
list(list(1, p_gradient))
})
agg_gradient_rdd <- receByKey(gradient_rdd, '+', 1L)
# 一次迭代聚合輸出
collect(agg_gradient_rdd)[[1]][[2]]
}
# 由梯度下降演算法優化損失函數
# alpha :學習速率
# steps :迭代次數
# tol :收斂精度
alpha <- 0.1
tol <- 1e-4
step <- 1
while(T) {
cat("step: ",step,"\n")
p_gradient <- train(theta, matrix_train_rdd)
theta <- theta-alpha*p_gradient
gradient <- train(theta, matrix_train_rdd)
if(abs(norm(gradient,type="F")-norm(p_gradient,type="F"))<=tol) break
step <- step+1
}
# 用訓練好的模型預測測試集信貸評測結果(「good」或「bad」),並計算預測正確率
test <- lapplyPartition(matrix_test_rdd, function(part) {
X <- part[,1:25]
y <- part[,26]
y_pred <- hypot(X%*%theta)
result <- xor(as.vector(round(y_pred)),as.vector(y))
})
result<-unlist(collect(test))
corrects = length(result[result==F])
wrongs = length(result[result==T])
cat("\ncorrects: ",corrects,"\n")
cat("wrongs: ",wrongs,"\n")
cat("accuracy: ",corrects/length(y_pred),"\n")
❷ 如何在"特殊"的網路環境下編譯 Docker
由於 Docker 編譯需要依賴於 Docker Daemon ,所以只能在 64 位的 Linux 環境下先安裝 Docker 程序,再從 Github 上克隆 Docker 的代碼進行編譯。
在 Docker 的目錄下執行 make 命令將默認執行 Makefile 中 make binary 指令進行編譯。
?
default: binary
all: build
$(DOCKER_RUN_DOCKER) hack/make.sh
binary: build
$(DOCKER_RUN_DOCKER) hack/make.sh binary
cross: build
$(DOCKER_RUN_DOCKER) hack/make.sh binary cross
從以上的 Makefile 可以看出,執行 make、make binary、make all 或 make cross 都可以得到可運行的 Docker 程序。
在 Mac OS 環境下使用 brew 的命令安裝 Docker ,只能得到一個 docker client 的二進製程序,如果以 daemon 的方式運行,會得到 『This is a client-only binary - running the Docker daemon is not supported.』 的錯誤提示信息。
方法 1.
使用 VirtualBox 或者 VMWare Workstation 安裝一個 Linux 的虛擬機。宿主機使用 VPN 等方案使網路「正常」訪問各種「服務」,虛擬機網卡使用 NAT 模式。在 Linux 虛擬機內使用 make 進行編譯 Docker 不會有任何網路問題。只是編譯速度受限於 VPN 等網路解決方案,有可能等待時間很長。
方法 2.
Docker 每次發布新版本,都會在 docker-dev 的鏡像倉庫發布一個新的標簽,這個鏡像倉庫包含了編譯 Docker 鏡像所依賴的所有環境,只需替換 Docker 代碼目錄下的 Dockerfile 即可實現編譯 Docker 。
?
FROM docker.cn/docker/docker-dev:v1.2.0
VOLUME /var/lib/docker
WORKDIR /go/src/github.com/docker/docker
ENV DOCKER_BUILDTAGS apparmor selinux
ENTRYPOINT [「hack/dind」]
COPY . /go/src/github.com/docker/docker
Dockerfile 中只保留必要的步驟就可以實現編譯了。
❸ 想實現一個linux內核安全功能模塊的技術思路是怎樣的
參考網站:http://www.hu.com/question/21637060
用戶在執行系統調用時,先通過原有的內核介面依次執行功能性的錯誤檢查,接著進行傳統的DAC檢查,並在即將訪問內核的內部對象之前,通過LSM鉤子函數調用LSM。LSM再調用具體的訪問控制策略來決定訪問的合法性。訪問控制整體構架:
LSM框架下訪問決策模塊包括selinux,smack,tomoyo,yama,apparmor.
每個決策模塊都是通過各自的XXX_init函數調用register_security()函數,注冊到LSM框架的模塊被載入成功後,就可以進行訪問控制操作。如果此時還有一個安全模塊要使用register_security()函數進行載入,則會出現錯誤,直到使用框架注銷後,下一個模塊才可以載入。
Linux安全模塊(LSM)提供了兩類對安全鉤子函數的調用:一類管理內核對象的安全域,另一類仲裁對這些內核對象的訪問。對安全鉤子函數的調用通過鉤子來實現,鉤子是全局表security_ops中的函數指針,這個全局表的類型是security_operations結構,這個結構定義在include/linux/security.h這個頭文件中。
通過對security代碼進行一番簡單的分析,LSM啟動過程流圖:
security_initcall只能調用selinux_init,smack_init ,tomoyo_init , yama_init 和apparmor_init中的一個,因為內核不允許多種安全機制同時一起工作。一旦一個安全模塊被載入,就成為系統的安全策略決策中心,而不會被後面的register_security()函數覆蓋,直到這個安全模塊被使用unregister_security()函數向框架注銷。
因此LSM框架下只能開啟一種安全機制,smack編譯進Linux內核的配置和要求:
(1)要求smack和selinux不能夠同時運行,不能同時存在於同一個運行中的內核;
查看內核是否開啟以下的功能(如果沒有則需要開啟):
CONFIG_NETLABEL=y
CONFIG_SECURITY=y
CONFIG_SECURITY_NETWORK=y
CONFIG_SECURITY_SMACK=y
CONFIG_SECURITY_SELINUX should not be
set
步驟:
make menuconfig
make moles_install
make install
查看/proc/filesystems
可以看到smackfs,說明smack已經編進內核
執行如下的命令:
mkdir -p /smack
在文件/etc/fstab添加下面的一行
smackfs /smack smackfs defaults 0 0
然後執行下面的命令:
mount –a
然後就體驗一下它的功能了:
1. 比如在用戶test的home目錄下(/home/test),新建文件夾 mkdir testdir
cd testdir/
touch testfile
2. 給新建的testfile 打上TheOther標簽
setfattr
--name=security.SMACK64 --value=TheOther testfile
查看其標簽
getfattr
--only-values -n security.SMACK64 -e text testfile
可以看到標簽TheOther
3. echo TheOne
2>/dev/null > /proc/self/attr/current,當前執行的進程默認都會被打為/proc/self/attr/current下的標簽
4.配置策略echo -n "TheOne TheOther r---"> /sma ck/load
因為當前進程只要是沒有特殊配置過的都被打為TheOne,所以當轉換到普通用戶test下,cat testfile是可讀的
5.現在我將當前進程打為NotTheOne ,echo NotTheOne 2>/dev/null >
/proc/self/attr/current
當轉換到普通用戶test下,cat testfile則變成不可讀的了
6.如果你想單獨對某個進程打標簽,而不是對當前進程打,就
attr -s security.SMACK64 -V TheOne /bin/cat
此時cat被標為TheOne,根據策略可以看出,當轉換到普通用戶test下,cat testfile是可讀的
若attr -s
security.SMACK64 –V Not TheOne /bin/cat
根據策略可以看出,當轉換到普通用戶test下,cat testfile是不可讀的
(需要說明的一點是,當cat本身被標上標簽和/proc/self/attr/current打入標簽共存時,cat本身的標簽生效,而/proc/self/attr/current打入標簽沒有生效)
❹ 我已經完成了ubuntu10.10的內核編譯,現在是2.6.33.20的內核,為什麼還是不能安裝selinux
沒遇到過。可能是軟體包的依賴關系問題,你原來的內核版本比這個高嗎?我不確定內核是否影響軟體包依賴。我只能說,試試更新管理器里,更新軟體包,注意不要選擇內核包。
❺ 想實現一個linux內核安全功能模塊的技術思路是怎樣的
參考網站:http://www.hu.com/question/21637060
用戶在執行系統調用時,先通過原有的內核介面依次執行功能性的錯誤檢查,接著進行傳統的DAC檢查,並在即將訪問內核的內部對象之前,通過LSM鉤子函數調用LSM。LSM再調用具體的訪問控制策略來決定訪問的合法性。訪問控制整體構架:
LSM框架下訪問決策模塊包括selinux,smack,tomoyo,yama,apparmor.
每個決策模塊都是通過各自的XXX_init函數調用register_security()函數,注冊到LSM框架的模塊被載入成功後,就可以進行訪問控制操作。如果此時還有一個安全模塊要使用register_security()函數進行載入,則會出現錯誤,直到使用框架注銷後,下一個模塊才可以載入。
Linux安全模塊(LSM)提供了兩類對安全鉤子函數的調用:一類管理內核對象的安全域,另一類仲裁對這些內核對象的訪問。對安全鉤子函數的調用通過鉤子來實現,鉤子是全局表security_ops中的函數指針,這個全局表的類型是security_operations結構,這個結構定義在include/linux/security.h這個頭文件中。
通過對security代碼進行一番簡單的分析,LSM啟動過程流圖:
security_initcall只能調用selinux_init,smack_init ,tomoyo_init , yama_init 和apparmor_init中的一個,因為內核不允許多種安全機制同時一起工作。一旦一個安全模塊被載入,就成為系統的安全策略決策中心,而不會被後面的register_security()函數覆蓋,直到這個安全模塊被使用unregister_security()函數向框架注銷。
因此LSM框架下只能開啟一種安全機制,smack編譯進Linux內核的配置和要求:
(1)要求smack和selinux不能夠同時運行,不能同時存在於同一個運行中的內核;
查看內核是否開啟以下的功能(如果沒有則需要開啟):
❻ 如何查看linux系統源碼
一般在Linux系統中的/usr/src/linux*.*.*(*.*.*代表的是內核版本,如2.4.23)目錄下就是內核源代碼(如果沒有類似目錄,是因為還沒安裝內核代碼)。另外還可從互連網上免費下載。注意,不要總到http://www.kernel.org/去下載,最好使用它的鏡像站點下載。請在http://www.kernel.org/mirrors/里找一個合適的下載點,再到pub/linux/kernel/v2.6/目錄下去下載2.4.23內核。
代碼目錄結構
在閱讀源碼之前,還應知道Linux內核源碼的整體分布情況。現代的操作系統一般由進程管理、內存管理、文件系統、驅動程序和網路等組成。Linux內核源碼的各個目錄大致與此相對應,其組成如下(假設相對於Linux-2.4.23目錄):
1.arch目錄包括了所有和體系結構相關的核心代碼。它下面的每一個子目錄都代表一種Linux支持的體系結構,例如i386就是Intel CPU及與之相兼容體系結構的子目錄。PC機一般都基於此目錄。
2.include目錄包括編譯核心所需要的大部分頭文件,例如與平台無關的頭文件在include/linux子目錄下。
3.init目錄包含核心的初始化代碼(不是系統的引導代碼),有main.c和Version.c兩個文件。這是研究核心如何工作的好起點。
4.mm目錄包含了所有的內存管理代碼。與具體硬體體系結構相關的內存管理代碼位於arch/*/mm目錄下。
5.drivers目錄中是系統中所有的設備驅動程序。它又進一步劃分成幾類設備驅動,每一種有對應的子目錄,如音效卡的驅動對應於drivers/sound。
6.ipc目錄包含了核心進程間的通信代碼。
7.moles目錄存放了已建好的、可動態載入的模塊。
8.fs目錄存放Linux支持的文件系統代碼。不同的文件系統有不同的子目錄對應,如ext3文件系統對應的就是ext3子目錄。
Kernel內核管理的核心代碼放在這里。同時與處理器結構相關代碼都放在arch/*/kernel目錄下。
9.net目錄里是核心的網路部分代碼,其每個子目錄對應於網路的一個方面。
10.lib目錄包含了核心的庫代碼,不過與處理器結構相關的庫代碼被放在arch/*/lib/目錄下。
11.scripts目錄包含用於配置核心的腳本文件。
12.documentation目錄下是一些文檔,是對每個目錄作用的具體說明。
一般在每個目錄下都有一個.depend文件和一個Makefile文件。這兩個文件都是編譯時使用的輔助文件。仔細閱讀這兩個文件對弄清各個文件之間的聯系和依託關系很有幫助。另外有的目錄下還有Readme文件,它是對該目錄下文件的一些說明,同樣有利於對內核源碼的理解。
在閱讀方法或順序上,有縱向與橫向之分。所謂縱向就是順著程序的執行順序逐步進行;所謂橫向,就是按模塊進行。它們經常結合在一起進行。對於Linux啟動的代碼可順著Linux的啟動順序一步步來閱讀;對於像內存管理部分,可以單獨拿出來進行閱讀分析。實際上這是一個反復的過程,不可能讀一遍就理解。
❼ 如何在"特殊"的網路環境下編譯 Docker
由於 Docker 編譯需要依賴於 Docker Daemon ,所以只能在 64 位的 Linux 環境下先安裝 Docker 程序,再從 Github 上克隆 Docker 的代碼進行編譯。
在 Docker 的目錄下執行 make 命令將默認執行 Makefile 中 make binary 指令進行編譯。
?
default: binary
all: build
$(DOCKER_RUN_DOCKER) hack/make.sh
binary: build
$(DOCKER_RUN_DOCKER) hack/make.sh binary
cross: build
$(DOCKER_RUN_DOCKER) hack/make.sh binary cross
從以上的 Makefile 可以看出,執行 make、make binary、make all 或 make cross 都可以得到可運行的 Docker 程序。
在 Mac OS 環境下使用 brew 的命令安裝 Docker ,只能得到一個 docker client 的二進製程序,如果以 daemon 的方式運行,會得到 『This is a client-only binary - running the Docker daemon is not supported.』 的錯誤提示信息。
方法 1.
使用 VirtualBox 或者 VMWare Workstation 安裝一個 Linux 的虛擬機。宿主機使用 VPN 等方案使網路「正常」訪問各種「服務」,虛擬機網卡使用 NAT 模式。在 Linux 虛擬機內使用 make 進行編譯 Docker 不會有任何網路問題。只是編譯速度受限於 VPN 等網路解決方案,有可能等待時間很長。
方法 2.
Docker 每次發布新版本,都會在 docker-dev 的鏡像倉庫發布一個新的標簽,這個鏡像倉庫包含了編譯 Docker 鏡像所依賴的所有環境,只需替換 Docker 代碼目錄下的 Dockerfile 即可實現編譯 Docker 。
?
FROM docker.cn/docker/docker-dev:v1.2.0
VOLUME /var/lib/docker
WORKDIR /go/src/github.com/docker/docker
ENV DOCKER_BUILDTAGS apparmor selinux
ENTRYPOINT [「hack/dind」]
COPY . /go/src/github.com/docker/docker
Dockerfile 中只保留必要的步驟就可以實現編譯了。
方法 3.
對 Docker 代碼中的 Docker 進行徹底的改造,用國內的各種鏡像替換其中不能在「正常」網路條件下訪問的鏡像,使得代碼能夠快速編譯通過。
?
FROM docker.cn/docker/ubuntu:14.04.1
MAINTAINER Meaglith Ma <[email protected]> (@genedna)
RUN echo "deb http://mirrors.aliyun.com/ubuntu trusty main universe" > /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty universe" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty universe" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-updates universe" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates universe" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-security universe" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y \
aufs-tools \
automake \
btrfs-tools \
build-essential \
curl \
dpkg-sig \
git \
iptables \
libapparmor-dev \
libcap-dev \
libsqlite3-dev \
lxc=1.0* \
mercurial \
parallel \
reprepro \
ruby1.9.1 \
ruby1.9.1-dev \
s3cmd=1.1.0* \
unzip \
--no-install-recommends
RUN git clone --no-checkout https://coding.net/genedna/lvm2.git /usr/local/lvm2 && cd /usr/local/lvm2 && git checkout -q v2_02_103
RUN cd /usr/local/lvm2 && ./configure --enable-static_link && make device-mapper && make install_device-mapper
RUN curl -sSL http://docker-cn.qiniudn.com/go1.3.1.src.tar.gz | tar -v -C /usr/local -xz
ENV PATH /usr/local/go/bin:$PATH
ENV GOPATH /go:/go/src/github.com/docker/docker/vendor
ENV PATH /go/bin:$PATH
RUN cd /usr/local/go/src && ./make.bash --no-clean 2>&1
ENV DOCKER_CROSSPLATFORMS \
linux/386 linux/arm \
darwin/amd64 darwin/386 \
freebsd/amd64 freebsd/386 freebsd/arm
ENV GOARM 5
RUN cd /usr/local/go/src && bash -xc 'for platform in $DOCKER_CROSSPLATFORMS; do GOOS=${platform%/*} GOARCH=${platform##*/} ./make.bash --no-clean 2>&1; done'
RUN mkdir -p /go/src/github.com/gpmgo \
&& cd /go/src/github.com/gpmgo \
&& curl -o gopm.zip http://gopm.io/api/v1/download?pkgname=github.com/gpmgo/gopm\&revision=dev --location \
&& unzip gopm.zip \
&& mv $(ls | grep "gopm-") gopm \
&& rm gopm.zip \
&& cd gopm \
&& go install
RUN gopm bin -v code.google.com/p/go.tools/cmd/cover
RUN gem sources --remove https://rubygems.org/ \
&& gem sources -a https://ruby.taobao.org/ \
&& gem install --no-rdoc --no-ri fpm --version 1.0.2
RUN gopm bin -v -d /go/bin github.com/cpuguy83/go-md2man@tag:v1
RUN git clone -b buildroot-2014.02 https://github.com/jpetazzo/docker-busybox.git /docker-busybox
RUN /bin/echo -e '[default]\naccess_key=$AWS_ACCESS_KEY\nsecret_key=$AWS_SECRET_KEY' > /.s3cfg
RUN git config --global user.email '[email protected]'
RUN groupadd -r docker
RUN useradd --create-home --gid docker unprivilegeser
VOLUME /var/lib/docker
WORKDIR /go/src/github.com/docker/docker
ENV DOCKER_BUILDTAGS apparmor selinux
ENTRYPOINT ["hack/dind"]
COPY . /go/src/github.com/docker/docker
以上的命令把 Ubuntu 鏡像中的源替換為國內速度較快的阿里源;把 lvm2 鏡像到國內的 Git 託管服務 coding.net;從 七牛雲存儲 保存的 Golang 源碼進行獲取和編譯;使用 gopm 下載編譯所需要的 Library ;最後把其中 gem 源切換到淘寶。至此,可以在「特殊」的網路條件下快速編譯 Docker 。
❽ 為什麼說Linux比Windows安全
一:病毒
1)Windows下都是administrator用戶登錄,病毒可以自由感染系統任何文件;ubuntu下普通用戶不能修改系統文件。
2)Windows用戶很多,研究的人也多,病毒,木馬數量也很多,被攻擊的數量也很多,攻擊Windows終端用戶有很多商業利益,如偷qq號,偷銀行交易密碼等等,有利益驅動研究的人也越多,「成果」也就越多;linux當前還沒有普及所以病毒很少。
二:木馬
同上
三:流氓軟體
同上
四:常見攻擊和入侵
同上,但需要補充一下,攻擊者通常攻擊兩個方向:
a)終端用戶,偷取個人信息
b)伺服器,一次性獲取巨額利益,比如攻擊銀行IBM AIX / HP-UX 等等大機,目前ubuntu兩者都不算,所以很安全
五:系統設計架構上的差異
1. Win2k沒有棧保護,很容易溢出/Win2k malloc攻擊也沒有加強;WinXP稍有加強,但相對還是容易;Win2003加強了很多,很難攻擊了,現在的晶元也都有棧不可執行保護了,XP sp2以後和2003都利用了此特性,這將很難實施溢出攻擊
2. Linux kernel 2.6以後的版本很多默認開啟了棧保護功能,而起2.4 kernel很久前就有非官方的PAX內核補丁,加強了對抗溢出攻擊,可以說早就達到了2003的標准,kernel 2.6現在的版本都內置了此功能
3. 大的伺服器晶元+OS: SPARC+Solaric / PowerPC + AIX / PA + HP-UX 等在9x年就有了晶元+內核的棧不可執行保護機制
4.linux文件系統本身的特性,沒個文件夾、文件都有所有者、所有組、其它用戶,而且對這三者可以分別設置讀、寫、執行的許可權,而且在許可權的分配和管理上也下了很大的功夫,這樣在以普通用戶登陸的情況下,很難危及到關鍵的系統文件的安全。這些都是windows的文件系統所沒有的特性。Unix許可權機制的確是對Windows的先天優勢,但NT4的內核是VMS起來的,也是Unix的一個分支,安全機制真正用起來也不弱。
關鍵還是它定位為主要是單用戶使用,定位不同。
六:開源
當黑客與工程師同時發現系統的漏洞時,windows封閉源,UBUNTU開源,黑客只是利用漏洞,而工程師在開源情況下可以自己修復漏洞,而在封閉源情下只能等待補丁,UBUNTU公開源有世界各地的愛好者為系統修復,而windows只能等待微軟修復。
七:關於Ubuntu安全性的其它建議
1. 關閉所有對外服務,如ssh
2. 開啟iptables,只讓需要訪問你的人能連上你
當黑客與工程師同時發現系統的漏洞時,windows封閉源,UBUNTU開源,黑客只是利用漏洞,而工程師在開源情況下可以自己修復漏洞,而在封閉源情下只能等待補丁,UBUNTU公開源有世界各地的愛好者為系統修復,而windows只能等待微軟修復
大多數黑客(真正的黑客,不是拿著木馬專搞破壞的那種)致力於對操作系統的研究的同時,不遺餘力地為操作系統修補漏洞,盡管這些人往往對Windows系統沒有好感,但他們也不吝於為Win做一些事情,當然他們乾的更多的是為Unix/linux修補漏洞,所以往往Linux系統的漏洞一經發現,補丁也隨之產生;至於Windows──什麼事情都等工程師的話,龜波氣功都出來了,更別說沖擊波、震盪波啦。
3.真正直接獲取利益就是攻擊大量的個人用戶和攻擊商用大機獲取數據,前者比較容易實施,後者你看金融都用IBM AIX/HP-UX ...,都放在內網,想當難攻擊。攻擊在公網的WEB伺服器,郵件伺服器很難,因為他們只開放了1個對外服務,這時候攻擊的是這個服務,如apache,難度很大,而且管理員不會在上面裝什麼軟體,攻擊途徑也少多了,所以現在的攻擊都轉向了攻擊客戶端,而客戶端自然要大面積撒網,所以攻擊對象就轉向了windows用戶群了。
❾ 如何在Ubuntu上檢查一個軟體包是否安裝
如何在Ubuntu上檢查一個軟體包是否安裝(引用Believe41o的專業答案):
在Ubuntu上檢查一個軟體包是否安裝的方法:
如果正在管理Debian或者Ubuntu伺服器,也許會經常使用dpkg 或者 apt-get命令。這兩個命令用來安裝、卸載和更新包。在這里看下如何在基於DEB的系統下檢查是否安裝了一個包。
一、要檢查特定的包,比如firefox是否安裝了,使用這個命令:
dpkg -s firefox
示例輸出:
Package: firefox Status:
install ok installed Priority: optional
Section: web
Installed-Size: 93339
Maintainer: Ubuntu Mozilla Team <[email protected]> Architecture: amd64
Version: 35.0+build3-0ubuntu0.14.04.2
Replaces: kubuntu-firefox-installer
Provides: gnome-www-browser, iceweasel, www-browser
Depends: lsb-release, libasound2 (>= 1.0.16), libatk1.0-0 (>= 1.12.4), libc6 (>= 2.17), libcairo2 (>= 1.2.4), libdbus-1-3 (>= 1.0.2), libdbus-glib-1-2 (>= 0.78), libfontconfig1 (>= 2.9.0), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:4.1.1), libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.37.3), libgtk2.0-0 (>= 2.24.0), libpango-1.0-0 (>= 1.22.0), libpangocairo-1.0-0 (>= 1.14.0), libstartup-notification0 (>= 0.8), libstdc++6 (>= 4.6), libx11-6, libxcomposite1 (>= 1:0.3-1), libxdamage1 (>= 1:1.1), libxext6, libxfixes3, libxrender1, libxt6
Recommends: xul-ext-ubufox, libcanberra0, libdbusmenu-glib4, libdbusmenu-gtk4
Suggests: ttf-lyx
Conffiles:
/etc/firefox/syspref.js /etc/apport/blacklist.d/firefox /etc/apport/native-origins.d/firefox /etc/apparmor.d/usr.bin.firefox
Description: Safe and easy web browser from Mozilla
Firefox delivers safe, easy web browsing. A familiar user interface,
enhanced security features including protection from online identity theft,
and integrated search let you get the most out of the web.
Xul-Appid: {ec8030f7-c20a-464f-9b0e-13a3a9e97384}
如上所見,firefox已經安裝了。
二、同樣可以使用dpkg-query 命令。這個命令會有一個更好的輸出,當然可以用通配符。
dpkg-query -l firefox
示例輸出:
Desired=Unknown/Install/Remove/Purge/Hold| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)||/ Name
Version
Architecture
Description+++-====================================-=======================-=======================-=============================================================================
ii firefox 35.0+build3-0ubuntu0.14 amd64
Safe and easy web browser from Mozilla
三、要列出系統中安裝的所有包,輸入下面的命令:
dpkg --get-selections
示例輸出:
abiword
installabiword-common
installaccountsservice
installacl
installadser
installalsa-base
installalsa-utils
installanacron
installapp-install-data
installapparmor
install...zeitgeist
installzeitgeist-core
installzeitgeist-datahub
installzenity
installzenity-common
installzip
installzlib1g:amd64
installzlib1g:i386
install
上面的輸出可能會非常長,這依賴於系統已安裝的包。
四、同樣可以通過grep來過濾割到更精確的包。比如想要使用dpkg命令查看系統中安裝的gcc包:
dpkg --get-selections | grep gcc
示例輸出:
gcc
installgcc-4.8
installgcc-4.8-base:amd64
installgcc-4.8-base:i386
installgcc-4.9-base:amd64
installgcc-4.9-base:i386
installlibgcc-4.8-dev:amd64
installlibgcc1:amd64
installlibgcc1:i386
install
五、此外,可以使用「-L」參數來找出包中文件的位置。
dpkg -L gcc-4.8
示例輸出:
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/gcc-4.8-base
/usr/share/doc/gcc-4.8-base/README.Bugs
/usr/share/doc/gcc-4.8-base/NEWS.html
/usr/share/doc/gcc-4.8-base/quadmath
/usr/share/doc/gcc-4.8-base/quadmath/changelog.gz
/usr/share/doc/gcc-4.8-base/gcc...
/usr/bin/x86_64-linux-gnu-gcc-4.8
/usr/bin/x86_64-linux-gnu-gcc-ar-4.8
/usr/bin/x86_64-linux-gnu-gcov-4.8
❿ 如何在"特殊"的網路環境下編譯 Docker
方法 1.
使用 VirtualBox 或者 VMWare Workstation 安裝一個 Linux 的虛擬機。宿主機使用 VPN 等方案使網路「正常」訪問各種「服務」,虛擬機網卡使用 NAT 模式。在 Linux 虛擬機內使用 make 進行編譯 Docker 不會有任何網路問題。只是編譯速度受限於 VPN 等網路解決方案,有可能等待時間很長。
方法 2.
Docker 每次發布新版本,都會在 docker-dev 的鏡像倉庫發布一個新的標簽,這個鏡像倉庫包含了編譯 Docker 鏡像所依賴的所有環境,只需替換 Docker 代碼目錄下的 Dockerfile 即可實現編譯 Docker 。
FROM docker.cn/docker/docker-dev:v1.2.0
VOLUME /var/lib/docker
WORKDIR /go/src/github.com/docker/docker
ENV DOCKER_BUILDTAGS apparmor selinux
ENTRYPOINT [「hack/dind」]
COPY . /go/src/github.com/docker/docker
Dockerfile 中只保留必要的步驟就可以實現編譯了。