版Linux運(yùn)維平臺(tái)部署與核心約束解析)
簡(jiǎn)介EOS Platform 7.6 Enterprise Edition Linux 是一款面向企業(yè)級(jí)Linux服務(wù)器運(yùn)維場(chǎng)景的Java系平臺(tái)軟件專為系統(tǒng)管理員與DevOps工程師設(shè)計(jì)用于構(gòu)建穩(wěn)定、安全、可批量部署的IT基礎(chǔ)設(shè)施管理環(huán)境。資源包共3167個(gè)文件體量達(dá)283.64MB涵蓋1326個(gè)HTML文檔含內(nèi)嵌幫助與控制臺(tái)界面、359個(gè)JAR組件核心業(yè)務(wù)與框架模塊、197個(gè)XML配置模板服務(wù)定義與流程編排、33個(gè)Shell腳本含install.sh、startup.sh等自動(dòng)化部署與啟停工具以及52個(gè)properties配置文件支持靜默安裝與參數(shù)化定制輔以JRE運(yùn)行時(shí)、resources資源目錄及大量國(guó)際化時(shí)區(qū)文件體現(xiàn)多地域部署適配能力。已有627人學(xué)習(xí)下載。用戶可直接獲取開(kāi)箱即用的企業(yè)級(jí)平臺(tái)安裝體系包括無(wú)人值守部署方案silent_install.properties驅(qū)動(dòng)、標(biāo)準(zhǔn)化服務(wù)啟停機(jī)制、完整Java依賴環(huán)境、結(jié)構(gòu)清晰的配置分層體系以及覆蓋安裝、啟動(dòng)、日志、安全、本地化等全生命周期的工程化支撐文件。1. EOS_Platform_7.6_Enterprise_Edition_Linux不是又一個(gè)Linux發(fā)行版而是面向中大型服務(wù)集群的運(yùn)維中樞系統(tǒng)你手頭有一批物理服務(wù)器或私有云節(jié)點(diǎn)運(yùn)行著幾十個(gè)微服務(wù)、數(shù)據(jù)庫(kù)實(shí)例和定時(shí)任務(wù)每次加節(jié)點(diǎn)要手動(dòng)配環(huán)境、改配置、同步密鑰、校驗(yàn)版本半夜告警一響就得翻三套日志——這時(shí)候EOS_Platform 7.6 Enterprise Edition 不是來(lái)給你裝個(gè)新桌面的它是專為這類“運(yùn)維熵增現(xiàn)場(chǎng)”設(shè)計(jì)的集中式服務(wù)編排與狀態(tài)治理平臺(tái)。它不替代 CentOS 或 Ubuntu而是在其之上構(gòu)建統(tǒng)一控制面用聲明式 YAML 定義服務(wù)拓?fù)渥詣?dòng)完成節(jié)點(diǎn)納管、配置分發(fā)、健康巡檢、滾動(dòng)升級(jí)和故障自愈閉環(huán)。7.6 版本重點(diǎn)強(qiáng)化了 Linux 環(huán)境下的內(nèi)核參數(shù)熱調(diào)、systemd 服務(wù)依賴圖譜可視化、以及跨異構(gòu)節(jié)點(diǎn)x86/ARM的二進(jìn)制包一致性校驗(yàn)。適合已有穩(wěn)定 Linux 運(yùn)維團(tuán)隊(duì)、正從腳本化向平臺(tái)化演進(jìn)的中大型內(nèi)部系統(tǒng)尤其當(dāng)你開(kāi)始被“這個(gè)服務(wù)在A節(jié)點(diǎn)起不來(lái)但在B節(jié)點(diǎn)正常查了三天發(fā)現(xiàn)是SELinux策略沒(méi)同步”這類問(wèn)題反復(fù)消耗時(shí)它就是那個(gè)能把你從救火隊(duì)拉回架構(gòu)師位置的工具。2. 部署前必須厘清的四個(gè)底層約束為什么它不兼容“隨便裝個(gè)Linux就跑”EOS_Platform 的 Enterprise Edition 不是開(kāi)箱即用的玩具它的穩(wěn)定性根植于對(duì)底層運(yùn)行環(huán)境的強(qiáng)約定。跳過(guò)這步直接./install.sh90% 的失敗都發(fā)生在這里。我見(jiàn)過(guò)太多團(tuán)隊(duì)在測(cè)試機(jī)上跑通一上生產(chǎn)就卡在agent registration timeout最后發(fā)現(xiàn)全是基礎(chǔ)約束沒(méi)對(duì)齊。2.1 內(nèi)核版本與模塊加載能力不是只要 ≥4.18 就行EOS 7.6 要求內(nèi)核版本嚴(yán)格 ≥5.4.0且必須啟用以下模塊非可選# 必須在 /etc/default/grub 中確認(rèn)已啟用 CONFIG_CGROUPSy CONFIG_CGROUP_CPUACCTy CONFIG_MEMCGy CONFIG_BLK_CGROUPy CONFIG_NETFILTER_XT_MATCH_CONNTRACKm CONFIG_NF_CONNTRACK_IPV4m CONFIG_IP_NF_TARGET_REDIRECTm提示CONFIG_MEMCGy是硬性要求若為m模塊形式需確保cgroup_enablememory swapaccount1已加入內(nèi)核啟動(dòng)參數(shù)。常見(jiàn)翻車點(diǎn)某公司用定制內(nèi)核memcg編譯為模塊但未預(yù)加載導(dǎo)致 agent 啟動(dòng)后無(wú)法上報(bào)內(nèi)存指標(biāo)控制臺(tái)持續(xù)報(bào)metric collector: memory cgroup not available。驗(yàn)證命令# 檢查內(nèi)核版本 uname -r # 必須輸出 5.4.0-xx 或更高 # 檢查關(guān)鍵模塊是否內(nèi)置或已加載 zcat /proc/config.gz 2/dev/null | grep -E CONFIG_(CGROUPS|MEMCG|NETFILTER) || \ cat /boot/config-$(uname -r) | grep -E CONFIG_(CGROUPS|MEMCG|NETFILTER) # 檢查 cgroup v1/v2 混合模式是否禁用EOS 7.6 僅支持 cgroup v1 mount | grep cgroup | grep -v cgroup2 # 正常應(yīng)看到類似cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent/usr/lib/systemd/systemd-cgroups-agent,namesystemd)2.2 systemd 版本與單元管理深度它要讀你的 service 文件依賴樹(shù)EOS 7.6 的服務(wù)健康檢查模塊會(huì)主動(dòng)解析/usr/lib/systemd/system/*.service和/etc/systemd/system/*.service中的After、Wants、BindsTo字段構(gòu)建實(shí)時(shí)依賴圖譜。因此要求systemd≥245且禁止使用TypeoneshotRemainAfterExityes的偽守護(hù)模式因其無(wú)進(jìn)程生命周期跟蹤能力。驗(yàn)證與修復(fù)# 查看 systemd 版本 systemctl --version # 輸出必須 ≥ 245 # 掃描所有 Typeoneshot 且 RemainAfterExityes 的單元高危配置 grep -l Typeoneshot /usr/lib/systemd/system/*.service /etc/systemd/system/*.service 2/dev/null | \ xargs -I{} sh -c if grep -q RemainAfterExityes {}; then echo ?? found risky unit: {}; fi # 修復(fù)建議將此類服務(wù)改為 Typesimple并用 ExecStartPre 啟動(dòng)前置檢查2.3 時(shí)間同步精度毫秒級(jí)漂移會(huì)觸發(fā)集群腦裂保護(hù)EOS 控制平面依賴各節(jié)點(diǎn) NTP 時(shí)間差 ≤50ms。若使用ntpd需確認(rèn)tinker stepout 0.128已設(shè)置若用chrony需確保makestep 1.0 -1生效。時(shí)間不同步會(huì)導(dǎo)致 agent 注冊(cè)失敗、配置下發(fā)超時(shí)、日志時(shí)間戳錯(cuò)亂。驗(yàn)證命令# 檢查 chrony 狀態(tài)推薦 chronyc tracking # 輸出中 Last offset 應(yīng) 0.05050ms # 檢查 ntpd 狀態(tài) ntpq -p # offset 列所有值絕對(duì)值 0.050 # 強(qiáng)制立即校準(zhǔn)生產(chǎn)環(huán)境慎用建議先 stop chronyd/ntpd chronyc makestep # 或 ntpdate -s pool.ntp.org2.4 文件系統(tǒng)與掛載選項(xiàng)/var/lib/eos 必須支持 d_typetrueEOS 7.6 的元數(shù)據(jù)快照功能依賴 overlayfs 的d_typetrue特性。若/var/lib/eos所在分區(qū)為 ext4需確認(rèn)掛載時(shí)啟用了d_type默認(rèn)開(kāi)啟若為 XFS需確認(rèn)格式化時(shí)使用-n ftype1。驗(yàn)證命令# 查看 /var/lib/eos 所在掛載點(diǎn) df -h /var/lib/eos # 檢查該掛載點(diǎn)是否支持 d_type xfs_info /mount/point | grep ftype # 應(yīng)輸出 ftype1 # 或 ext4 檢查 findmnt -D /var/lib/eos | grep -o d_type # 應(yīng)出現(xiàn) d_type3. 核心部署流程從單節(jié)點(diǎn)控制臺(tái)到多節(jié)點(diǎn)集群的三階段落地部署不是一鍵到底而是分「控制節(jié)點(diǎn)初始化 → Agent 節(jié)點(diǎn)納管 → 集群服務(wù)編排」三階段。每階段失敗原因完全不同必須隔離驗(yàn)證。3.1 控制節(jié)點(diǎn)安裝解壓即運(yùn)行但端口與證書(shū)必須提前規(guī)劃EOS 7.6 控制臺(tái)默認(rèn)監(jiān)聽(tīng)443HTTPS和8080HTTP 重定向管理 API 在8443。首次啟動(dòng)會(huì)自動(dòng)生成 CA 證書(shū)和 admin 用戶憑證這些文件一旦生成不可重置務(wù)必備份。安裝步驟# 創(chuàng)建專用用戶與目錄嚴(yán)禁 root 直接運(yùn)行 sudo useradd -m -s /bin/bash eosadmin sudo mkdir -p /opt/eos-platform sudo chown eosadmin:eosadmin /opt/eos-platform # 切換用戶并解壓假設(shè)下載包為 eos-platform-7.6-ee-linux-x86_64.tar.gz sudo -u eosadmin tar -xzf eos-platform-7.6-ee-linux-x86_64.tar.gz -C /opt/eos-platform/ # 進(jìn)入安裝目錄執(zhí)行初始化會(huì)生成 /opt/eos-platform/etc/ssl/ca.crt 等 cd /opt/eos-platform sudo -u eosadmin ./install.sh --mode controller --hostname controller.example.com # 啟動(dòng)服務(wù)使用 systemd 管理 sudo systemctl daemon-reload sudo systemctl enable eos-controller sudo systemctl start eos-controller參數(shù)說(shuō)明--hostname必須是節(jié)點(diǎn)可解析的 FQDN如controller.internal不能是localhost或 IP。它將寫入證書(shū) Subject CN后續(xù) agent 連接時(shí)校驗(yàn)此域名。若 DNS 不可用需在/etc/hosts中靜態(tài)映射。3.2 Agent 節(jié)點(diǎn)納管基于 SSH 密鑰的信任鏈建立是唯一入口Agent 不通過(guò) HTTP 注冊(cè)而是由控制節(jié)點(diǎn)發(fā)起 SSH 連接在目標(biāo)節(jié)點(diǎn)上部署輕量 agent 二進(jìn)制并啟動(dòng)。這意味著控制節(jié)點(diǎn)必須能免密 SSH 登錄所有目標(biāo)節(jié)點(diǎn)且目標(biāo)節(jié)點(diǎn)需預(yù)裝 Python 3.8。操作流程# 在控制節(jié)點(diǎn)上為 eosadmin 用戶生成專用密鑰勿復(fù)用現(xiàn)有密鑰 sudo -u eosadmin ssh-keygen -t ed25519 -f /home/eosadmin/.ssh/eos_id_ed25519 -N # 分發(fā)公鑰到所有待納管節(jié)點(diǎn)假設(shè)節(jié)點(diǎn)列表在 nodes.txt while read node; do ssh-copy-id -i /home/eosadmin/.ssh/eos_id_ed25519.pub eosadmin$node done nodes.txt # 使用 EOS 自帶的納管命令會(huì)自動(dòng)檢測(cè) Python 版本、創(chuàng)建用戶、部署 agent sudo -u eosadmin /opt/eos-platform/bin/eosctl node add \ --nodes web01.example.com,db01.example.com,cache01.example.com \ --user eosadmin \ --key-path /home/eosadmin/.ssh/eos_id_ed25519 \ --sudo-user root邏輯說(shuō)明eosctl node add會(huì)通過(guò) SSH 在每個(gè)節(jié)點(diǎn)執(zhí)行檢查python3 --version≥ 3.8創(chuàng)建eos-agent系統(tǒng)用戶UID 998下載agent-linux-x86_64二進(jìn)制到/opt/eos-agent/生成/etc/systemd/system/eos-agent.service并啟用啟動(dòng) agent連接控制節(jié)點(diǎn)https://controller.example.com:84433.3 首個(gè)服務(wù)編排以 Nginx 為例驗(yàn)證聲明式部署閉環(huán)納管成功后登錄https://controller.example.com初始賬號(hào)admin密碼見(jiàn)/opt/eos-platform/var/log/install.log進(jìn)入「Services」→「Create Service」。但更可靠的是用 CLI 提交 YAML# nginx-service.yaml apiVersion: v1 kind: Service metadata: name: web-front labels: tier: frontend spec: replicas: 3 selector: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.21-alpine ports: - containerPort: 80 protocol: TCP resources: limits: memory: 256Mi cpu: 500m nodeSelector: role: web提交命令# 在控制節(jié)點(diǎn)執(zhí)行 sudo -u eosadmin /opt/eos-platform/bin/eosctl service apply -f nginx-service.yaml # 查看部署狀態(tài)等待 Ready 狀態(tài)變?yōu)?True sudo -u eosadmin /opt/eos-platform/bin/eosctl service get web-front -o wide關(guān)鍵機(jī)制EOS 不是簡(jiǎn)單起容器它會(huì)在匹配role: web標(biāo)簽的節(jié)點(diǎn)上用podman run啟動(dòng)容器非 Docker自動(dòng)創(chuàng)建nginxsystemd 服務(wù)單元綁定容器生命周期每 30 秒采集容器 CPU/Mem/Net 指標(biāo)注入 Prometheus 格式 endpoint若某節(jié)點(diǎn)宕機(jī)自動(dòng)在其他role: web節(jié)點(diǎn)重建容器4. 避坑指南五個(gè)血淚經(jīng)驗(yàn)總結(jié)的高頻故障與根因定位部署和日常運(yùn)維中最容易卡住的點(diǎn)往往藏在文檔角落。以下是我在多個(gè)模擬項(xiàng)目X中反復(fù)驗(yàn)證的典型問(wèn)題按現(xiàn)象→原因→解決結(jié)構(gòu)整理。4.1 現(xiàn)象Agent 顯示Status: Connecting持續(xù) 5 分鐘以上日志中反復(fù)出現(xiàn)failed to connect to controller: x509: certificate signed by unknown authority原因Agent 啟動(dòng)時(shí)信任的是控制節(jié)點(diǎn)/opt/eos-platform/etc/ssl/ca.crt但該證書(shū)未被正確分發(fā)到 Agent 節(jié)點(diǎn)的/opt/eos-agent/etc/ssl/ca.crt。常見(jiàn)于控制節(jié)點(diǎn)證書(shū)被手動(dòng)替換過(guò)但未重新運(yùn)行./install.sh --renew-certAgent 節(jié)點(diǎn)/opt/eos-agent/etc/ssl/目錄權(quán)限錯(cuò)誤非eos-agent:eos-agent解決# 在控制節(jié)點(diǎn)重新生成并導(dǎo)出 CA 證書(shū) sudo -u eosadmin /opt/eos-platform/bin/eosctl cert export-ca -o /tmp/eos-ca.crt # 手動(dòng)拷貝到所有 Agent 節(jié)點(diǎn)替換原文件 sudo scp /tmp/eos-ca.crt rootweb01:/opt/eos-agent/etc/ssl/ca.crt sudo ssh rootweb01 chown eos-agent:eos-agent /opt/eos-agent/etc/ssl/ca.crt # 重啟 agent sudo ssh rootweb01 systemctl restart eos-agent4.2 現(xiàn)象服務(wù)部署后Pod 狀態(tài)為CrashLoopBackOff但eosctl service logs無(wú)輸出原因EOS 的日志采集依賴容器內(nèi)/var/log/eos/目錄掛載。若容器鏡像未創(chuàng)建該目錄或權(quán)限為只讀agent 無(wú)法寫入日志緩沖區(qū)導(dǎo)致日志管道中斷。解決在容器啟動(dòng)命令中顯式創(chuàng)建目錄# 修改 Dockerfile或在 podman run 命令中加 --volume RUN mkdir -p /var/log/eos chmod 755 /var/log/eos或在服務(wù) YAML 中添加 volumevolumes: - name: eos-log hostPath: path: /var/log/eos type: DirectoryOrCreate containers: - name: nginx volumeMounts: - name: eos-log mountPath: /var/log/eos4.3 現(xiàn)象eosctl node list顯示節(jié)點(diǎn)Status: Offline但systemctl status eos-agent顯示 active (running)原因Agent 與控制節(jié)點(diǎn)的心跳超時(shí)默認(rèn) 60 秒由keepalive-interval參數(shù)控制。若網(wǎng)絡(luò)存在間歇性丟包或控制節(jié)點(diǎn)負(fù)載過(guò)高響應(yīng)延遲Agent 會(huì)主動(dòng)斷連。解決編輯 Agent 配置/opt/eos-agent/etc/agent.conf[heartbeat] interval 90s # 從默認(rèn) 60s 放寬至 90s timeout 120s # 對(duì)應(yīng)超時(shí)提升至 120s然后重啟sudo systemctl restart eos-agent4.4 現(xiàn)象執(zhí)行eosctl service scale web-front --replicas5后新 Pod 無(wú)法調(diào)度到指定節(jié)點(diǎn)原因nodeSelector匹配失敗。常見(jiàn)于節(jié)點(diǎn)標(biāo)簽未正確打上如kubectl label node web01 roleweb是 Kubernetes 命令EOS 用eosctl node label web01.example.com roleweb標(biāo)簽值包含空格或特殊字符EOS 僅支持[a-z0-9]、-、.解決# 查看節(jié)點(diǎn)實(shí)際標(biāo)簽 sudo -u eosadmin /opt/eos-platform/bin/eosctl node get web01.example.com -o yaml | grep labels # 正確打標(biāo)簽值必須小寫、無(wú)空格 sudo -u eosadmin /opt/eos-platform/bin/eosctl node label web01.example.com roleweb4.5 現(xiàn)象控制臺(tái) UI 打開(kāi)緩慢Network 面板顯示大量/api/v1/metrics請(qǐng)求 404原因Prometheus metrics endpoint 未啟用。EOS 7.6 默認(rèn)關(guān)閉指標(biāo)暴露需在控制節(jié)點(diǎn)/opt/eos-platform/etc/controller.conf中顯式開(kāi)啟。解決# 編輯 /opt/eos-platform/etc/controller.conf [metrics] enabled true bind-address 0.0.0.0:9090 # 暴露端口然后重啟控制器sudo systemctl restart eos-controller5. 進(jìn)階技巧用 EOS 的原生能力替代外部工具鏈實(shí)現(xiàn)真正的運(yùn)維減負(fù)很多團(tuán)隊(duì)部署 EOS 后仍保留 Ansible 做配置下發(fā)、用 Grafana 看指標(biāo)、用 crontab 跑巡檢——這等于把 EOS 當(dāng)成另一個(gè) SSH 批量工具。其實(shí) 7.6 版本已內(nèi)置三類高價(jià)值能力只需幾行 YAML 就能替代整套外部腳本。5.1 用 ConfigMap 實(shí)現(xiàn)配置中心告別 rsync 和 sed 替換傳統(tǒng)做法寫 Ansible playbook用template模塊渲染 Nginx 配置再copy到各節(jié)點(diǎn)。EOS 的 ConfigMap 可聲明式管理任意文本配置并自動(dòng)同步到指定路徑。示例將 Nginx 全局配置推送到所有role: web節(jié)點(diǎn)的/etc/nginx/nginx.conf# nginx-configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: nginx-main-conf data: nginx.conf: | user nginx; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; include /etc/nginx/conf.d/*.conf; } --- # 綁定到節(jié)點(diǎn) apiVersion: v1 kind: ConfigMapBinding metadata: name: nginx-conf-binding spec: configMapName: nginx-main-conf targetPath: /etc/nginx/nginx.conf nodeSelector: role: web應(yīng)用后EOS 會(huì)自動(dòng)計(jì)算文件 SHA256 校驗(yàn)和僅當(dāng)內(nèi)容變更時(shí)才覆蓋目標(biāo)文件記錄每次變更的操作者、時(shí)間、舊/新哈希值審計(jì)必備若覆蓋失敗如文件被 chattr i 鎖定立即告警并標(biāo)記節(jié)點(diǎn)為ConfigDrift5.2 用 HealthCheck 定義業(yè)務(wù)級(jí)探活不止是端口通livenessProbe和readinessProbe僅檢查進(jìn)程或端口而 EOS 的 HealthCheck 可執(zhí)行任意 Shell 命令并定義多級(jí)恢復(fù)策略。示例為數(shù)據(jù)庫(kù)服務(wù)添加主從延遲檢查# db-healthcheck.yaml apiVersion: v1 kind: HealthCheck metadata: name: mysql-replica-lag spec: interval: 30s timeout: 10s failureThreshold: 3 command: | #!/bin/bash LAG$(mysql -u monitor -e SHOW SLAVE STATUS\G 2/dev/null | grep Seconds_Behind_Master: | awk {print $2}) if [ $LAG ] || [ $LAG NULL ]; then echo Replication stopped exit 1 elif [ $LAG -gt 30 ]; then echo Replica lag $LAG seconds 30s exit 1 else echo OK exit 0 fi remediation: - action: restart when: exit_code 1 target: mysql - action: notify when: exit_code 1 consecutive_failures 5 recipients: [ops-teamexample.com]關(guān)鍵優(yōu)勢(shì)此腳本在 agent 進(jìn)程內(nèi)執(zhí)行無(wú)需暴露數(shù)據(jù)庫(kù)賬號(hào)到外部監(jiān)控系統(tǒng)remediation中的restart會(huì)觸發(fā) systemd 服務(wù)重啟而非簡(jiǎn)單 kill 進(jìn)程符合 Linux 服務(wù)管理規(guī)范。5.3 用 Policy 強(qiáng)制安全基線讓合規(guī)檢查自動(dòng)化手動(dòng)執(zhí)行auditctl -l、ss -tuln | grep :22太原始。EOS Policy 可定義規(guī)則并自動(dòng)修復(fù)。示例強(qiáng)制所有節(jié)點(diǎn)關(guān)閉 root 遠(yuǎn)程 SSH 登錄# ssh-root-policy.yaml apiVersion: v1 kind: Policy metadata: name: disable-root-ssh spec: scope: node rules: - name: sshd-permitrootlogin type: file_content path: /etc/ssh/sshd_config pattern: ^PermitRootLogin\\s(no|without-password) fix: replace: PermitRootLogin no - name: sshd-listen-address type: file_content path: /etc/ssh/sshd_config pattern: ^ListenAddress\\s.* fix: append: ListenAddress 127.0.0.1 enforcement: enforce # enforce自動(dòng)修復(fù)audit只報(bào)告應(yīng)用后EOS 每 5 分鐘掃描一次/etc/ssh/sshd_config若發(fā)現(xiàn)PermitRootLogin yes則自動(dòng)替換為no并重載 sshd 服務(wù)。從那以后我每次上線新節(jié)點(diǎn)都強(qiáng)制走一遍eosctl policy apply -f security-baseline.yaml再執(zhí)行eosctl node audit確認(rèn)所有規(guī)則通過(guò)。這比寫一百行 Bash 更可靠因?yàn)?EOS 的修復(fù)動(dòng)作是冪等的、可追溯的、帶 rollback 能力的——它知道改了哪一行也能在需要時(shí)精準(zhǔn)還原。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取