Làm thế nào tôi có thể đổ bộ nhớ hệ thống đầy đủ?


9

Sau khi khởi động VirtualBox, máy tính trở nên chậm chạp và sau đó bị treo hoàn toàn do OOM. Thông thường, OOM nên bắt đầu giết các quá trình để giải phóng không gian, nhưng điều này đã không xảy ra (đây là lần thứ hai tôi trải nghiệm điều này).

Tôi đã có một số công việc quan trọng chưa được lưu trong trình soạn thảo văn bản, vì vậy tôi đã hy vọng tìm thấy nó trở lại trong RAM hệ thống sau khi giết tất cả các quy trình trong bảng điều khiển hiện tại bằng cách sử dụng SysRq+ K. Máy đang được đề cập là một máy tính xách tay có RAM 8 GiB chạy Linux x86_64 3.7.5 với ổ SSD là đĩa đích.

Nỗ lực đầu tiên của tôi là dd if=/dev/mem of=memory, nhưng điều này đã thất bại sau khi đọc 1MiB dữ liệu. Tiếp theo, tôi đã thử dd if=/dev/fmem of=memory bs=1M, nhưng điều này đã dừng lại sau khi đọc 3010461696 byte (chính xác là 2871 MiB). Sau khi nhìn vào /proc/mtrr(hiển thị bên dưới), tôi quyết định thử thêm skip=4096. Điều này cuối cùng đã chậm lại, đọc với tốc độ chỉ 3 MiB / giây, vì vậy tôi đã làm gián đoạn nó (thu được một tệp 5,8 GiB). (ít nhất 100 MiB cuối cùng của tệp chứa FFs)

reg01: base=0x000000000 (    0MB), size= 2048MB, count=1: write-back
reg02: base=0x080000000 ( 2048MB), size= 1024MB, count=1: write-back
reg03: base=0x100000000 ( 4096MB), size= 4096MB, count=1: write-back
reg04: base=0x200000000 ( 8192MB), size= 1024MB, count=1: write-back
reg05: base=0x23c000000 ( 9152MB), size=   64MB, count=1: uncachable
reg06: base=0x0b4000000 ( 2880MB), size=   64MB, count=1: uncachable
reg07: base=0x0b8000000 ( 2944MB), size=  128MB, count=1: uncachable

Tôi không thể tìm thấy dữ liệu tôi đã mở trong một vài giờ trong trình soạn thảo văn bản, vì vậy tôi tin rằng tôi đã bỏ qua một số bộ nhớ trong khi thực hiện kết xuất. Vì vậy, với mục tiêu của tôi (phục hồi dữ liệu từ các chương trình không gian người dùng), phương pháp hiệu quả nhất để kết xuất bộ nhớ hệ thống vào một tệp là gì? Một số điểm phải được xem xét trong khi làm một bãi như vậy là gì?


Bạn đã thử / Proc / kmem chưa? Nó không có nhiều giá trị vì nó thay đổi trong khi bạn sao chép nó tho.
ott--

@ ott-- CONFIG_DEVKMEMbị vô hiệu hóa, tìm kiếm trong mã nguồn dường như cho phép truy cập không bị hạn chế, nhưng tôi vẫn không tin rằng đây là cách tốt nhất để làm điều đó (truy cập IO mem?)
Lekensteyn

2
Có thể bạn đã có được bộ nhớ của trình soạn thảo nhưng bạn đã không nhận ra nó. Tái tạo cấu trúc dữ liệu từ kết xuất bộ nhớ có thể khó khăn. Điều đầu tiên bạn cần làm là tái cấu trúc ánh xạ bộ nhớ từ các cấu trúc dữ liệu kernel (có thể có các công cụ pháp y hiện có cho điều đó) để có được bộ nhớ ảo của quá trình bạn quan tâm (có khả năng là trải rộng xung quanh nhiều trang 4kB khác nhau trong bộ nhớ vật lý). Sau đó, văn bản có thể không nằm trong một đốm màu liên tiếp và có thể sử dụng UCS4 hoặc các biểu diễn khác và có thể lưu trữ các dòng hoặc các khối khác trong các đoạn riêng biệt.
Gilles 'SO- ngừng trở nên xấu xa'

1
@Gilles +1, một khi quá trình bị hủy, tôi sẽ mong kernel giải phóng các mô tả tác vụ -> quên tất cả về ánh xạ không gian địa chỉ của nó. Đối với biểu diễn dữ liệu, nó có thể dễ dàng là một cây (có đủ may mắn được phân bổ bởi JVM :)).
peterph

Vì vậy, bạn sẽ đào qua hàng gigabyte dữ liệu để tìm kiếm một vài kb văn bản thậm chí có thể không có ở đó? Kim, gặp haystack. Trong thời gian bạn dành cho việc này, bạn có thể vừa gõ lại văn bản. Nếu có nhiều như vậy ở nơi đầu tiên, thì bạn nên đảm bảo rằng trình soạn thảo văn bản của bạn được định cấu hình để định kỳ lưu bản sao lưu để bạn không bị mất nhiều nếu nó gặp sự cố.
psusi

Câu trả lời:


4

Kiểm tra dự án này: foriana

Foriana là (FOrensic Ram Image ANAlyzer)

đầu vào: kết xuất (vật lý) đầu ra RAM: thông tin khác nhau

Phiên bản 1.0 có thể liệt kê các quy trình và mô-đun từ kết xuất bộ nhớ của hạt nhân i386 / x86_64 / arm linux / bsd và cung cấp tùy chọn để đọc bộ nhớ tuyến tính từ các bãi chứa.

Có một mô-đun hạt nhân fmem:

Fmem là trình điều khiển kernel, tạo / dev / fmem thiết bị. / dev / fmem hoạt động theo cách tương tự như / dev / mem (truy cập trực tiếp vào bộ nhớ vật lý), nhưng không có giới hạn mà / dev / mem có. Có thể kết xuất toàn bộ bộ nhớ vật lý thông qua / dev / fmem.

Tôi đã sử dụng nó, biên dịch khá dễ dàng.


Người hỏi đã thử /dev/fmem.
Tobu

3

Bạn có thể muốn sử dụng ddrescuehoặc chương trình tương tự, có thể bỏ qua dữ liệu không thể truy cập. dd conv=noerrorcũng có thể hữu ích Cũng kiểm tra câu hỏi này trên superuser .

Tuy nhiên, quan trọng hơn, nếu bạn rơi vào tình huống OOM, sự chậm chạp rất có thể là do kernel tráo đổi các trang từ bất cứ thứ gì khác ngoài ứng dụng yêu cầu. Do đó nếu bạn muốn dữ liệu của mình, hãy kiểm tra trao đổi thay vì /dev/mem- rất có thể nó sẽ ở đó. Tương tự, nếu kẻ giết OOM không tấn công và bạn giết các tiến trình bằng tay, một lần, ví dụ như trình soạn thảo của bạn bị giết trước tiên, quá trình đói bộ nhớ vẫn có thể xảy ra để lấy một số thời gian để lấy các trang đó.

Như Gilles đã đề cập trong bình luận, dữ liệu có thể dễ dàng ở một số cấu trúc đặc biệt, vì vậy bạn sẽ không thể tìm thấy chúng dễ dàng ngay cả khi bạn quản lý để tái tạo ánh xạ không gian địa chỉ của quy trình bị giết có đủ may mắn để tìm thấy tất cả những gì cần thiết trang vẫn còn nguyên.


1
Tôi đã thấy câu trả lời SU trước đó, đó là cách tôi tìm thấy fmem. ddrescuesẽ không giúp tôi vì 256 trang (1 MiB) là giới hạn mã hóa cứng. Tôi dự kiến ​​sẽ rơi vào tình trạng OOM, nhưng kẻ giết người OOM đã không đá vào ( pastebin.com/DvYTCcRK ). Một tuần trước, tôi gặp vấn đề tương tự (vẫn là Linux 3.7.5, tôi chưa khởi động lại, chỉ bị treo với ram). Không có tệp / phân vùng trao đổi kể từ khi tôi có SSD. (swappiness = 60 (mặc định)).
Lekensteyn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.