ฉันจะย้าย / var / log directory ได้อย่างไร


16

บนเซิร์ฟเวอร์ที่ใช้งานจริงของเรามีไดรฟ์ขนาดเล็กสำหรับจุดเมาท์รู//var/logใช้พื้นที่มากเกินไปและฉันต้องลบไฟล์บางไฟล์ด้วยตนเอง ฉัน/var/log/จะย้ายไปพูด/home/logโดยไม่ต้องรีบูตได้อย่างไร

นี่คือสิ่งที่ฉันคิดว่า:

$ mkdir /home/log
$ rsync -a /var/log /home/log
$ mount --bind /home/log /var/log
$ /etc/init.d/rsyslof restart

แต่ฉันรู้ว่าบริการบางอย่างใช้ file descriptors ดังนั้นพวกเขาจะยังคงใช้งาน/var/logหรือ inodes


มีคำตอบโดยละเอียดเกี่ยวกับคำถามเดียวกันเป็นหลักที่ AskUbuntu ที่askubuntu.com/a/346579/422224
Eborbob

นี่ไม่ใช่คำตอบ แต่เป็นคำแนะนำ ถ้าเป็นไปได้ใช้สำหรับบันทึกระบบไฟล์ที่มี compresion เรียลไทม์เช่น btrfs เมื่อคุณเมานต์พาร์ติชันนี้ให้ใช้ตัวเลือกการเมานต์ "compress = lzo" หรือ "compress = zlib" lzo ให้ประสิทธิภาพที่ดีกว่าการบีบอัดที่ดีกว่า
Massimo

คำตอบ:


26

การออกแบบที่เหมาะสม

ฉันคิดว่าคุณไม่สามารถขยายระบบไฟล์ที่เป็นปัญหา (โดยใช้lvextend && ext2online) เพียงเพราะคุณไม่ได้ใช้ LVM หรือใช้ระบบไฟล์ผิดประเภท

แนวทางของคุณ

สิ่งที่คุณเสนออาจใช้งานได้หากคุณส่งสัญญาณ daemons ด้วย SIGHUP (kill -1 pid) เห็นได้ชัดว่าคุณจะต้องในภายหลังใน "mount -o ผูก / / บางแห่ง" และทำความสะอาดสิ่งที่ถูกทิ้งไว้ภายใต้เมาท์ / var / log แต่มันมีกลิ่นเหม็นสำหรับฉันโดยเฉพาะอย่างยิ่งสำหรับการผลิต

หลีกเลี่ยงการหยุดทำงานมีผลสะอาด (แต่มีความซับซ้อนที่ต้องทำ)

ลืมความคิด "mount -o bind" สร้าง LV / พาร์ติชั่นใหม่ แต่ยังไม่ต้องเมาท์

lsof | grep /var/log             # lists open files in /var/log

สำหรับ daemon แต่ละตัวที่มีไฟล์เปิดอยู่ (ฉันคาดหวังอย่างน้อย syslog, inetd, sshd):

  • กำหนดค่า daemon no ใหม่เพื่อเข้าสู่ / var / log
  • รีเฟรช daemon ( kill -1 หรือ /etc/init.d/script reload)
  • ยืนยันด้วยlsof | grep /var/log ภูตนั้นปิดไฟล์

เมานต์ / var / log กู้คืนการกำหนดค่าเก่า SIGHUP / โหลด daemons อีกครั้ง

วิธีที่ง่าย (หยุดทำงาน)

สร้าง LV / พาร์ติชันใหม่และติดตั้งอย่างถูกต้องบน / var หรือ / var / log วิธีที่ง่ายคือถอดเซิร์ฟเวอร์ออกจากโหมดบำรุงรักษา (โหมดผู้ใช้คนเดียว) และใช้คอนโซลจริง (ไม่ใช่ ssh) สำหรับการดำเนินการ


8

คำตอบของคนอื่นนั้นยอดเยี่ยมและถูกต้องและคุณควรอ่านก่อน

ฉันแค่คิดว่าฉันจะแบ่งปันสิ่งนี้เพราะมันทำให้ง่ายต่อการคัดลอกและวางหากกรณีของคุณกลายเป็นเรื่องง่ายเหมือนของฉัน:

หยุด syslog และคัดลอกล็อกปัจจุบัน:

service rsyslog stop
mkdir -p /tmp/varlog
cp -r /var/log/* /tmp/varlog

จากนั้นติดตำแหน่งใหม่ของ/var/logคุณ สมมติว่าเป็นอุปกรณ์ใหม่ที่เรียกว่า/dev/sdb

mount /dev/sdb /var/log

ตอนนี้คุณสามารถคัดลอกไฟล์กลับมาและรีสตาร์ท syslog:

cp -r /tmp/varlog/* /var/log
rm -rf /tmp/varlog
service rsyslog start

สมมติว่าสิ่งนี้เกิดขึ้นค่อนข้างเร็วในช่วงอายุของเครื่องของคุณrsyslogมีแนวโน้มที่จะเป็นดีมอนเพียงตัวเดียวที่ทำงานอยู่ YMMV!

ป.ล. - คุณจะต้องการเพิ่มลงในของคุณfstabเช่นกันอาจจะ นี่คือวิธีหนึ่งในการทำเช่นนั้นอีกครั้งโดยถือว่าเป็นภูเขาที่ตรงไปตรงมามาก:

cat /etc/mtab |grep /var/log >>/etc/fstab

(cf /server//a/267610/80606เกี่ยวกับการกำหนด mtab เป็น fstab)


5
ทางออกที่ดี สิ่งหนึ่งที่ฉันต้องการเปลี่ยนคือการแทนที่cp -rด้วยsudo tar cpfและsudo tar xpfเพื่อรักษาความเป็นเจ้าของไฟล์และการอนุญาตเมื่อมีโอกาสที่จะมีบันทึกที่สร้างโดยผู้ใช้อื่นนอกเหนือจากรูท
เบรนด้าเบลล์

2

อีกสิ่งที่คุณสามารถทำได้คือ:

  • หยุดกระบวนการที่เปิดไฟล์ไว้ /var/log
  • ตรวจสอบว่าไม่มีกระบวนการใดที่เปิดไฟล์ไว้ /var/log ( lsofแนะนำให้ใช้kubanskamac)
  • ย้ายของคุณ /var/logไปยังพาร์ติชันอื่นที่มีพื้นที่ว่างเพียงพอ (ทำตามตัวอย่างของคุณ/home/log)
  • สร้างลิงค์สัญลักษณ์จาก / var / log ไปที่ / home / log (ln -s /home/log /var/log )
  • รีสตาร์ทกระบวนการที่คุณหยุดในขั้นตอนแรก

โปรดทราบว่านี่ไกลจากสิ่งที่ฉันคิดว่าเป็นแนวปฏิบัติที่ดี มันเป็นเพียงวิธีแก้ปัญหาเพื่อให้คุณไม่ต้องปิดเซิร์ฟเวอร์ ทางออกที่ถูกต้องคือการสร้างพาร์ติชันใหม่/varหรือ/var/logมีพื้นที่เพียงพอ (หรือขยายอันใหม่)


จะมีผลกระทบใด ๆ จากการทำลิงก์แนวคิดหรือไม่หาก logrotate รันอยู่ ฉันไม่รู้ว่ามันจะเขียนทับหรือทำให้เสียตำแหน่งของไฟล์ถ้าพวกเขาไม่ได้ทำการเชื่อมโยง ... นั่นอาจหมายถึงการปวดหัวในการบำรุงรักษาเพิ่มเติมในภายหลัง
Bart Silverstrim

ใช่ในที่สุดดูเหมือนว่าการดำเนินการนี้ในขณะที่เซิร์ฟเวอร์กำลังทำงานไม่ดี ฉันจะไม่สามารถดูว่ากระบวนการใดยังคงใช้ไฟล์เก่า / var / log / ยิ่งไปกว่านั้นฉันคิดว่าบางแอปพลิเคชันไม่สามารถจัดการกับลิงก์สัญลักษณ์ได้อย่างง่ายดาย บางทีฉันควรกำหนดตารางเวลาโหมดการบำรุงรักษา ที่จริงฉันลบไฟล์ด้วยตนเองเมื่อพื้นที่ด้านซ้ายสั้น mriedman: ฉันจะตรวจสอบถ้าผมสามารถปรับขนาดพาร์ทิชันที่
Razique

0

โซลูชันอื่นที่ใช้ @hwjp หากคุณไม่สามารถใช้ไดรฟ์ไดรฟ์อื่นเพื่อย้ายไดรฟ์คุณสามารถสร้างไดรฟ์เสมือนไดรฟ์ข้อมูลลงในไดรฟ์ข้อมูลอื่นที่มีพื้นที่ว่างมากขึ้น (นั่นคือกรณีของฉัน):

สร้างปริมาณเสมือน:

A) ทำ: sudo dd if=/dev/zero of=VHD-log.img bs=1M count=1200

  • if = / dev / zero: ไฟล์อินพุตเพื่อจัดเตรียมสตรีมอักขระสำหรับการเริ่มต้นการจัดเก็บข้อมูล
  • of = VHD.img: ไฟล์รูปภาพที่จะสร้างเป็นโวลุ่มการเก็บข้อมูลบน / thevolumeofyourchoice
  • bs = 1M: อ่านและเขียนสูงสุด 1 ล้านครั้ง
  • count = 1200: คัดลอกบล็อกอินพุตเท่านั้น 1200M (1GB)

B) ทำ: ฟอร์sudo mkfs -t ext4 /thevolumeofyourchoice/VHD-log.imgแมทประเภทระบบไฟล์ EXT4 ในไฟล์อิมเมจ VHD-log ด้วยยูทิลิตี้ mkfs

C) ทำ: sudo mkdir /thevolumeofyourchoice/vlogเมานต์ VHD-log ไปยังไดเรกทอรี (จุดเมานท์)

D) ทำ: sudo mount -t auto -o loop /thevolumeofyourchoice/VHD-log.img /thevolumeofyourchoice/vlog

D1) หากต้องการเมานต์ VHD-log ที่บูตระบบไปยังไดเรกทอรีสุดท้ายให้เพิ่มรายการนี้ในไฟล์ / etc / fstab

/thevolumeofyourchoice/VHD-log.img  /var/log/  ext4    defaults        0  0

ย้ายไฟล์บันทึกเก่า:

E) ทำ:

  • service rsyslog stop
  • lsof | grep /var/log เพื่อแสดงรายการไฟล์ที่เปิดใน / var / log และปิด daemon ที่ต้องการ (apach2, freshclam ในกรณีของฉัน)
  • cp -rp /var/log/* /thevolumeofyourchoice/vlog (cp -p เช่นเดียวกับ --preserve = mode, การเป็นเจ้าของ, การประทับเวลา)

F) ทำ:

  • sudo umount /thevolumeofyourchoice/vlog
  • sudo mv /var/log /var/log-old
  • sudo mkdir /var/log
  • sudo chgrp syslog /var/log
  • sudo mount -t auto -o loop /thevolumeofyourchoice/VHD-log.img /var/log

G) ทำ: service rsyslog startและเริ่มบริการอื่น ๆ ที่คุณหยุด

ตรวจสอบอีกครั้งในที่สุด:

คุณทำได้ - lsof | grep /var/logเพื่อแสดงรายการไฟล์ที่เปิดใน / var / log และตรวจสอบว่าไฟล์นั้นชี้ไปที่ / var / log ไม่ใช่ / var / log-old

คุณสามารถ mv สำรองหรือลบ / var / log-old หลังจากทั้งหมดเป็น ok


-1

ฉันแค่จะ:

apt install lsyncd
mv /var/log /varlog.root
mkdir /var/log /home/log
mount --bind /home/log /var/log

# set up lsyncd appropriately to sync real-time between /varlog.root & /var/log
service lsyncd start
sleep 3m

service rsyslog restart
# Proceed with all the other daemons
# to switch them over to the new /var/log and release /varlog.root
sleep 3m

# Then do this a few times until no processes use the old dir
lsof +D /varlog.root && rm -rf /varlog.root

มันเป็นการดีที่จะปล่อยให้/var/logติดตั้ง/home/logตามที่เป็นอยู่หรือไม่? คำถามทั้งหมดนี้ไม่ได้สำหรับผู้ดูแลระบบที่มีประสบการณ์ฉันเข้าใจ
kubanczyk

คุณหมายถึงอะไร / home / log ถูกเมาท์ผ่าน / var / log ไม่ใช่วิธีอื่น และใช่ไม่ใช่ปัญหาที่จะปล่อยให้มันเป็นเพียงแค่ให้แน่ใจว่ามันถูกเรียกคืนในการบู๊ตแต่ละครั้งโดยอัตโนมัติและเร็วพอสำหรับกระบวนการทั้งหมดที่จะไม่พยายามสร้างบันทึกใหม่ในจุดเมานต์ / var / log ที่ว่างเปล่า
Alexander Shcheblikin

หลายครั้งที่ข้อกำหนดด้านความปลอดภัยต้องการ / var / log และ / var / log / audit บนจุดเชื่อมต่อที่แยกต่างหากจริง มิฉะนั้นปล่อยให้เป็นเช่นนั้นและเพียงแค่ตั้งค่าการหมุนเวียนการบันทึกที่เหมาะสมเพื่อหลีกเลี่ยงการใช้ดิสก์ที่ไม่จำเป็น
แบรด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.