Accepting request 503692 from home:ptesarik:branches:Kernel:kdump

Aarch64 support, systemd services, IP in directory name

OBS-URL: https://build.opensuse.org/request/show/503692
OBS-URL: https://build.opensuse.org/package/show/Kernel:kdump/kdump?expand=0&rev=129
This commit is contained in:
Petr Tesařík 2017-06-14 13:00:33 +00:00 committed by Git OBS Bridge
parent d58c1277f3
commit e0f11a3f9b
9 changed files with 1175 additions and 20 deletions

View File

@ -3,6 +3,8 @@ From: Petr Tesarik <ptesarik@suse.com>
Subject: Add KDUMP_SSH_IDENTITY config option
References: FATE#321583
Git-commit: 3e7e5f020024eed5c6d944e0ff9554772cbdb896
Git-commit: d7e6f45461bf0f899cfedf564d985cf5cd41f331
Git-commit: f0a43757c99635ece304fc9c011c0b82acd86f64
Upstream: v0.8.17
Make the SSH private file configurable.
@ -10,14 +12,14 @@ Make the SSH private file configurable.
Signed-off-by: Petr Tesarik <ptesarik@suse.com>
---
doc/man/kdump.5.txt.in | 9 +++++++++
init/setup-kdump.functions | 37 ++++++++++++++++++++++++++-----------
doc/man/kdump.5.txt.in | 10 ++++++++++
init/setup-kdump.functions | 39 ++++++++++++++++++++++++++++-----------
kdumptool/define_opt.h | 1 +
3 files changed, 36 insertions(+), 11 deletions(-)
3 files changed, 39 insertions(+), 11 deletions(-)
--- a/doc/man/kdump.5.txt.in
+++ b/doc/man/kdump.5.txt.in
@@ -643,7 +643,16 @@ Example (broken into lines for readabili
@@ -643,7 +643,17 @@ Example (broken into lines for readabili
Default: ""
@ -26,7 +28,8 @@ Signed-off-by: Petr Tesarik <ptesarik@suse.com>
+List of SSH identity files for public key authentication. If empty, kdump
+will try all standard OpenSSH identities for the 'root' user (rsa, dsa,
+ecdsa, ed25519, in this order).
+ecdsa, ed25519, in this order). The path to every identity file is relative
+to +~root/.ssh+, or an absolute path can be given.
+
+Example: "/root/.ssh/id_kdump_rsa"
+
@ -36,7 +39,7 @@ Signed-off-by: Petr Tesarik <ptesarik@suse.com>
----------
--- a/init/setup-kdump.functions
+++ b/init/setup-kdump.functions
@@ -935,6 +935,27 @@ function kdump_modify_multipath()
@@ -935,6 +935,29 @@ function kdump_modify_multipath()
} # }}}
#
@ -45,18 +48,20 @@ Signed-off-by: Petr Tesarik <ptesarik@suse.com>
+# 1) dest: root of the temporary area
+function kdump_copy_ssh_ident() # {{{
+{
+ local dest="$1"
+ local ssh_conf="$dest/kdump/.ssh/config"
+ local sshdir="$1/kdump/.ssh"
+ local ssh_conf="$sshdir/config"
+ local f
+
+ shift
+ for f in "$@"; do
+ test "${f:0:1}" = "/" || f=~root/".ssh/$f"
+ test -f "$f" || continue
+
+ cp "$f" "${dest}/kdump/.ssh/"
+ test -f "${f}.pub" && cp "${f}.pub" "${dest}/kdump/.ssh/"
+ test -f "${f}-cert.pub" && cp "${f}-cert.pub" "${dest}/kdump/.ssh/"
+ echo "IdentityFile ${f}" >> "$ssh_conf"
+ cp "$f" "$sshdir/"
+ test -f "${f}.pub" && cp "${f}.pub" "$sshdir/"
+ test -f "${f}-cert.pub" && cp "${f}-cert.pub" "$sshdir/"
+ f=$( basename $f )
+ echo "IdentityFile /kdump/.ssh/${f}" >> "$ssh_conf"
+ done
+} # }}}
+
@ -64,7 +69,7 @@ Signed-off-by: Petr Tesarik <ptesarik@suse.com>
# Copy SSH keys and create a config file in the target
# Parameters:
# 1) dest: root of the temporary area
@@ -952,17 +973,11 @@ function kdump_init_ssh() # {{{
@@ -952,17 +975,11 @@ function kdump_init_ssh() # {{{
echo "StrictHostKeyChecking yes" >> "$ssh_conf"
echo "UserKnownHostsFile /kdump/.ssh/known_hosts" >> "$ssh_conf"
@ -82,7 +87,7 @@ Signed-off-by: Petr Tesarik <ptesarik@suse.com>
+ if [ -n "$KDUMP_SSH_IDENTITY" ] ; then
+ kdump_copy_ssh_ident "$dest" $KDUMP_SSH_IDENTITY
+ else
+ kdump_copy_ssh_ident "$dest" /root/.ssh/id_{rsa,dsa,ecdsa,ed25519}
+ kdump_copy_ssh_ident "$dest" id_{rsa,dsa,ecdsa,ed25519}
+ fi
} # }}}

View File

@ -0,0 +1,159 @@
Date: Fri Jun 9 16:46:10 2017 +0200
From: Petr Tesarik <ptesarik@suse.com>
Subject: Routable: parse and store preferred source address
References: FATE#321844
Upstream: v0.8.17
Git-commit: 3748faebf9834eae0a0676800984ebccd7d3cab9
This is the preferred source address, used by the kernel for outgoing
connections when no other address is explicitly set.
Signed-off-by: Petr Tesarik <ptesarik@suse.com>
diff --git a/kdumptool/routable.cc b/kdumptool/routable.cc
index d9833f6..6137f89 100644
--- a/kdumptool/routable.cc
+++ b/kdumptool/routable.cc
@@ -58,6 +58,10 @@ class NetLink {
int waitRouteChange(void);
+ const char *prefSrc(void) const
+ throw ()
+ { return m_prefsrc; }
+
protected:
class RecvCheck {
public:
@@ -89,6 +93,8 @@ class NetLink {
throw ()
{ return m_message; }
+ int parseAttrs(const struct rtattr *rta, size_t len);
+
private:
int m_timeout;
@@ -99,13 +105,16 @@ class NetLink {
size_t m_buflen;
unsigned char *m_buffer;
struct nlmsghdr *m_message;
+
+ int m_family;
+ char m_prefsrc[INET6_ADDRSTRLEN];
};
unsigned NetLink::m_seq;
// -----------------------------------------------------------------------------
NetLink::NetLink(unsigned subscribe, size_t recv_max)
- : m_timeout(-1), m_buflen(recv_max)
+ : m_timeout(-1), m_buflen(recv_max), m_family(AF_UNSPEC)
{
struct sockaddr_nl sa;
socklen_t salen;
@@ -126,6 +135,8 @@ NetLink::NetLink(unsigned subscribe, size_t recv_max)
throw KSystemError("Cannot get local netlink address", errno);
if (salen != sizeof m_local || m_local.nl_family != AF_NETLINK)
throw KError("Invalid local netlink address");
+
+ m_prefsrc[0] = '\0';
}
// -----------------------------------------------------------------------------
@@ -354,7 +365,8 @@ int NetLink::checkRoute(const struct addrinfo *ai)
case RTN_BROADCAST:
case RTN_ANYCAST:
case RTN_MULTICAST:
- return 0;
+ m_family = rt->rtm_family;
+ return parseAttrs(RTM_RTA(rt), RTM_PAYLOAD(nh));
case RTN_UNREACHABLE:
return -EHOSTUNREACH;
case RTN_BLACKHOLE:
@@ -368,6 +380,49 @@ int NetLink::checkRoute(const struct addrinfo *ai)
}
}
+// -----------------------------------------------------------------------------
+int NetLink::parseAttrs(const struct rtattr *rta, size_t len)
+{
+ while (RTA_OK(rta, len)) {
+ void *data = RTA_DATA(rta);
+ size_t dlen = RTA_PAYLOAD(rta);
+ int res;
+
+ switch (rta->rta_type) {
+ case RTA_PREFSRC:
+ if (m_family == AF_INET &&
+ dlen == sizeof(struct in_addr)) {
+ struct sockaddr_in saddr;
+ memset(&saddr, 0, sizeof saddr);
+ saddr.sin_family = AF_INET;
+ saddr.sin_addr = *(struct in_addr *)data;
+ res = getnameinfo((struct sockaddr*)&saddr, sizeof saddr,
+ m_prefsrc, sizeof m_prefsrc,
+ NULL, 0, NI_NUMERICHOST);
+ } else if (m_family == AF_INET6 &&
+ dlen == sizeof(struct in6_addr)) {
+ struct sockaddr_in6 saddr;
+ memset(&saddr, 0, sizeof saddr);
+ saddr.sin6_family = AF_INET6;
+ saddr.sin6_addr = *(struct in6_addr *)data;
+ res = getnameinfo((struct sockaddr*)&saddr, sizeof saddr,
+ m_prefsrc, sizeof m_prefsrc,
+ NULL, 0, NI_NUMERICHOST);
+ } else
+ res = EAI_FAMILY;
+ if (res)
+ throw KGaiError("Cannot parse preferred source address", res);
+
+ break;
+ }
+ rta = RTA_NEXT(rta, len);
+ }
+ if (len)
+ throw KError("Netlink rtattr truncated");
+
+ return 0;
+}
+
//}}}
//{{{ Routable -----------------------------------------------------------------
@@ -388,8 +443,11 @@ bool Routable::hasRoute(void)
Debug::debug()->trace("hasRoute(%s)", m_host.c_str());
for (p = m_ai; p; p = p->ai_next) {
- if (nl.checkRoute(p) == 0)
+ if (nl.checkRoute(p) == 0) {
+ Debug::debug()->dbg("m_prefsrc='%s'", nl.prefSrc());
+ m_prefsrc.assign(nl.prefSrc());
return true;
+ }
}
return false;
diff --git a/kdumptool/routable.h b/kdumptool/routable.h
index cdfffaf..0763131 100644
--- a/kdumptool/routable.h
+++ b/kdumptool/routable.h
@@ -42,6 +42,10 @@ class Routable {
bool check(int timeout);
+ const std::string& prefsrc(void) const
+ throw ()
+ { return m_prefsrc; }
+
protected:
bool resolve(void)
throw (KError);
@@ -51,6 +55,7 @@ class Routable {
private:
int m_nlfd;
std::string m_host;
+ std::string m_prefsrc;
struct addrinfo *m_ai;
};

View File

@ -0,0 +1,617 @@
Date: Wed Jun 14 10:48:33 2017 +0200
From: Petr Tesarik <ptesarik@suse.com>
Subject: Use the complete target URL for URLTransfer
References: FATE#321844
Upstream: v0.8.17
Git-commit: 4540de762995219c19f8feac2f594868595741ea
Append the subdirectory name in the caller and pass around a standard
vector or RootDirURL objects.
Signed-off-by: Petr Tesarik <ptesarik@suse.com>
diff --git a/kdumptool/configuration.cc b/kdumptool/configuration.cc
index 167195d..192dcfd 100644
--- a/kdumptool/configuration.cc
+++ b/kdumptool/configuration.cc
@@ -180,11 +180,13 @@ bool Configuration::needsNetwork()
if (netconfig != "auto")
return true;
- RootDirURLVector urlv(KDUMP_SAVEDIR.value(), "");
- RootDirURLVector::iterator it;
- for (it = urlv.begin(); it != urlv.end(); ++it)
- if (it->getProtocol() != URLParser::PROT_FILE)
+ std::istringstream iss(KDUMP_SAVEDIR.value());
+ string elem;
+ while (iss >> elem) {
+ URLParser url(elem);
+ if (url.getProtocol() != URLParser::PROT_FILE)
return true;
+ }
return !KDUMP_SMTP_SERVER.value().empty() &&
!KDUMP_NOTIFICATION_TO.value().empty();
diff --git a/kdumptool/deletedumps.cc b/kdumptool/deletedumps.cc
index 500299e..f19a421 100644
--- a/kdumptool/deletedumps.cc
+++ b/kdumptool/deletedumps.cc
@@ -87,10 +87,12 @@ void DeleteDumps::execute()
return;
}
- RootDirURLVector urls(config->KDUMP_SAVEDIR.value(), m_rootdir);
- RootDirURLVector::const_iterator it;
- for (it = urls.begin(); it != urls.end(); ++it)
- delete_one(*it, oldDumps);
+ std::istringstream iss(config->KDUMP_SAVEDIR.value());
+ string elem;
+ while (iss >> elem) {
+ RootDirURL url(elem, m_rootdir);
+ delete_one(url, oldDumps);
+ }
}
// -----------------------------------------------------------------------------
diff --git a/kdumptool/print_target.cc b/kdumptool/print_target.cc
index 06dbc41..8d3e50d 100644
--- a/kdumptool/print_target.cc
+++ b/kdumptool/print_target.cc
@@ -60,12 +60,16 @@ void PrintTarget::execute()
Configuration *config = Configuration::config();
- RootDirURLVector urlv(config->KDUMP_SAVEDIR.value(), m_rootdir);
- RootDirURLVector::iterator it;
- for (it = urlv.begin(); it != urlv.end(); ++it) {
- if (it != urlv.begin())
+ std::istringstream iss(config->KDUMP_SAVEDIR.value());
+ string elem;
+ bool first = true;
+ while (iss >> elem) {
+ RootDirURL url(elem, m_rootdir);
+ if (first)
+ first = false;
+ else
cout << endl;
- print_one(*it);
+ print_one(url);
}
}
diff --git a/kdumptool/rootdirurl.cc b/kdumptool/rootdirurl.cc
index 38e613c..41352e9 100644
--- a/kdumptool/rootdirurl.cc
+++ b/kdumptool/rootdirurl.cc
@@ -44,19 +44,4 @@ RootDirURL::RootDirURL(const std::string &url, const std::string &rootdir)
//}}}
-//{{{ RootDirURLVector ---------------------------------------------------------
-
-// -----------------------------------------------------------------------------
-RootDirURLVector::RootDirURLVector(const std::string &urls,
- const std::string &rootdir)
- throw (KError)
-{
- std::istringstream iss(urls);
- std::string url;
- while (iss >> url)
- push_back(RootDirURL(url, rootdir));
-}
-
-//}}}
-
// vim: set sw=4 ts=4 fdm=marker et: :collapseFolds=1:
diff --git a/kdumptool/rootdirurl.h b/kdumptool/rootdirurl.h
index c93c825..724d4ab 100644
--- a/kdumptool/rootdirurl.h
+++ b/kdumptool/rootdirurl.h
@@ -59,28 +59,7 @@ class RootDirURL : public URLParser {
std::string m_realpath;
};
-//}}}
-
-//{{{ RootDirURLVector ---------------------------------------------------------
-
-/**
- * Parse a list of URLs.
- */
-class RootDirURLVector: public std::vector<RootDirURL> {
-
- public:
-
- /**
- * Creates a new RootDirURLVector.
- *
- * @param[in] urls space-separated list of URLs to parse
- * @param[in] rootdir root directory for local files
- * @exception KError if any URL from the list cannot be parsed
- */
- RootDirURLVector(const std::string &urls, const std::string &rootdir)
- throw (KError);
-
-};
+typedef std::vector<RootDirURL> RootDirURLVector;
//}}}
diff --git a/kdumptool/savedump.cc b/kdumptool/savedump.cc
index eeec24e..9938b6f 100644
--- a/kdumptool/savedump.cc
+++ b/kdumptool/savedump.cc
@@ -110,9 +110,15 @@ void SaveDump::execute()
// build the transfer object
// prepend a time stamp to the save dir
string subdir = Stringutil::formatCurrentTime(ISO_DATETIME);
- RootDirURLVector urlv(config->KDUMP_SAVEDIR.value(), m_rootdir);
+ RootDirURLVector urlv;
+ std::istringstream iss(config->KDUMP_SAVEDIR.value());
+ FilePath elem;
+ while (iss >> elem) {
+ RootDirURL url(elem.appendPath(subdir), m_rootdir);
+ urlv.push_back(url);
+ }
- m_transfer = getTransfer(urlv, subdir);
+ m_transfer = getTransfer(urlv);
// save the dump
try {
@@ -120,11 +126,11 @@ void SaveDump::execute()
} catch (const KError &error) {
setErrorCode(1);
- sendNotification(true, urlv, subdir);
+ sendNotification(true, urlv);
// run checkAndDelete() in any case
try {
- checkAndDelete(urlv, subdir);
+ checkAndDelete(urlv);
} catch (const KError &error) {
cout << error.what() << endl;
}
@@ -136,13 +142,13 @@ void SaveDump::execute()
}
// send the email afterwards
- sendNotification(false, urlv, subdir);
+ sendNotification(false, urlv);
// because we don't know the file size in advance, check
// afterwards if the disk space is not sufficient and delete
// the dump again
try {
- checkAndDelete(urlv, subdir);
+ checkAndDelete(urlv);
} catch (const KError &error) {
setErrorCode(1);
if (config->KDUMP_CONTINUE_ON_ERROR.value())
@@ -594,22 +600,20 @@ string SaveDump::findMapfile()
}
// -----------------------------------------------------------------------------
-void SaveDump::checkAndDelete(const RootDirURLVector &urlv,
- const string &subdir)
+void SaveDump::checkAndDelete(const RootDirURLVector &urlv)
throw (KError)
{
RootDirURLVector::const_iterator it;
for (it = urlv.begin(); it != urlv.end(); ++it)
- check_one(*it, subdir);
+ check_one(*it);
}
// -----------------------------------------------------------------------------
-void SaveDump::check_one(const RootDirURL &parser,
- const string &subdir)
+void SaveDump::check_one(const RootDirURL &parser)
throw (KError)
{
- Debug::debug()->trace("SaveDump::check_one(\"%s\", \"%s\")",
- parser.getURL().c_str(), subdir.c_str());
+ Debug::debug()->trace("SaveDump::check_one(\"%s\")",
+ parser.getURL().c_str());
// only do that check for local files
if (parser.getProtocol() != URLParser::PROT_FILE) {
@@ -618,7 +622,6 @@ void SaveDump::check_one(const RootDirURL &parser,
}
FilePath path = parser.getRealPath();
- path.appendPath(subdir);
Configuration *config = Configuration::config();
unsigned long long freeSize = path.freeDiskSize();
@@ -634,8 +637,7 @@ void SaveDump::check_one(const RootDirURL &parser,
}
// -----------------------------------------------------------------------------
-void SaveDump::sendNotification(bool failure, const RootDirURLVector &urlv,
- const string &subdir)
+void SaveDump::sendNotification(bool failure, const RootDirURLVector &urlv)
throw ()
{
Debug::debug()->trace("SaveDump::sendNotification");
@@ -694,10 +696,8 @@ void SaveDump::sendNotification(bool failure, const RootDirURLVector &urlv,
else {
ss << "Dump has been copied to" << endl;
RootDirURLVector::const_iterator it;
- for (it = urlv.begin(); it != urlv.end(); ++it) {
- FilePath fp = it->getURL();
- ss << fp.appendPath(subdir) << endl;
- }
+ for (it = urlv.begin(); it != urlv.end(); ++it)
+ ss << it->getURL() << endl;
}
email.setBody(ss.str());
@@ -738,12 +738,11 @@ string SaveDump::getKernelReleaseCommandline()
}
// -----------------------------------------------------------------------------
-Transfer *SaveDump::getTransfer(const RootDirURLVector &urlv,
- const string &subdir)
+Transfer *SaveDump::getTransfer(const RootDirURLVector &urlv)
throw (KError)
{
- Debug::debug()->trace("SaveDump::getTransfer(%p, \"%s\")",
- &urlv, subdir.c_str());
+ Debug::debug()->trace("SaveDump::getTransfer(%p)",
+ &urlv);
if (urlv.size() == 0)
throw KError("No target specified!");
@@ -751,27 +750,27 @@ Transfer *SaveDump::getTransfer(const RootDirURLVector &urlv,
switch (urlv.begin()->getProtocol()) {
case URLParser::PROT_FILE:
Debug::debug()->dbg("Returning FileTransfer");
- return new FileTransfer(urlv, subdir);
+ return new FileTransfer(urlv);
case URLParser::PROT_FTP:
Debug::debug()->dbg("Returning FTPTransfer");
- return new FTPTransfer(urlv, subdir);
+ return new FTPTransfer(urlv);
case URLParser::PROT_SFTP:
Debug::debug()->dbg("Returning SFTPTransfer");
- return new SFTPTransfer(urlv, subdir);
+ return new SFTPTransfer(urlv);
case URLParser::PROT_SSH:
Debug::debug()->dbg("Returning SSHTransfer");
- return new SSHTransfer(urlv, subdir);
+ return new SSHTransfer(urlv);
case URLParser::PROT_NFS:
Debug::debug()->dbg("Returning NFSTransfer");
- return new NFSTransfer(urlv, subdir);
+ return new NFSTransfer(urlv);
case URLParser::PROT_CIFS:
Debug::debug()->dbg("Returning CIFSTransfer");
- return new CIFSTransfer(urlv, subdir);
+ return new CIFSTransfer(urlv);
default:
throw KError("Unknown protocol.");
diff --git a/kdumptool/savedump.h b/kdumptool/savedump.h
index cd3f70d..cd11177 100644
--- a/kdumptool/savedump.h
+++ b/kdumptool/savedump.h
@@ -86,12 +86,10 @@ class SaveDump : public Subcommand {
std::string findMapfile()
throw (KError);
- void checkAndDelete(const RootDirURLVector &urlv,
- const std::string &subdir)
+ void checkAndDelete(const RootDirURLVector &urlv)
throw (KError);
- void sendNotification(bool failure, const RootDirURLVector &urlv,
- const std::string &subdir)
+ void sendNotification(bool failure, const RootDirURLVector &urlv)
throw ();
std::string getKernelReleaseCommandline()
@@ -106,8 +104,7 @@ class SaveDump : public Subcommand {
* @exception KError if parsing the URL failed or there's no
* implementation for that class.
*/
- Transfer *getTransfer(const RootDirURLVector &urlv,
- const std::string &subdir)
+ Transfer *getTransfer(const RootDirURLVector &urlv)
throw (KError);
private:
@@ -122,8 +119,7 @@ class SaveDump : public Subcommand {
std::string m_hostname;
bool m_nomail;
- void check_one(const RootDirURL &parser,
- const std::string &subdir)
+ void check_one(const RootDirURL &parser)
throw (KError);
};
diff --git a/kdumptool/sshtransfer.cc b/kdumptool/sshtransfer.cc
index 5a036db..12f315d 100644
--- a/kdumptool/sshtransfer.cc
+++ b/kdumptool/sshtransfer.cc
@@ -40,10 +40,9 @@ using std::endl;
//{{{ SSHTransfer -------------------------------------------------------------
/* -------------------------------------------------------------------------- */
-SSHTransfer::SSHTransfer(const RootDirURLVector &urlv,
- const std::string &subdir)
+SSHTransfer::SSHTransfer(const RootDirURLVector &urlv)
throw (KError)
- : URLTransfer(urlv, subdir)
+ : URLTransfer(urlv)
{
if (urlv.size() > 1)
cerr << "WARNING: First dump target used; rest ignored." << endl;
@@ -59,9 +58,7 @@ SSHTransfer::SSHTransfer(const RootDirURLVector &urlv,
cerr << "WARNING: Dump target not reachable" << endl;
string remote;
- FilePath fp = target.getPath();
- fp.appendPath(getSubDir());
- remote.assign("mkdir -p ").append(fp);
+ remote.assign("mkdir -p ").append(target.getPath());
SubProcess p;
p.spawn("ssh", makeArgs(remote));
@@ -96,7 +93,7 @@ void SSHTransfer::perform(DataProvider *dataprovider,
const RootDirURL &target = urlv.front();
FilePath fp = target.getPath();
- fp.appendPath(getSubDir()).appendPath(target_files.front());
+ fp.appendPath(target_files.front());
string remote;
remote.assign("dd of=").append(fp).append("-incomplete");
@@ -357,10 +354,9 @@ ByteVector const &SFTPPacket::update(void)
//{{{ SFTPTransfer -------------------------------------------------------------
/* -------------------------------------------------------------------------- */
-SFTPTransfer::SFTPTransfer(const RootDirURLVector &urlv,
- const std::string &subdir)
+SFTPTransfer::SFTPTransfer(const RootDirURLVector &urlv)
throw (KError)
- : URLTransfer(urlv, subdir)
+ : URLTransfer(urlv)
{
if (urlv.size() > 1)
cerr << "WARNING: First dump target used; rest ignored." << endl;
@@ -394,9 +390,7 @@ SFTPTransfer::SFTPTransfer(const RootDirURLVector &urlv,
m_proto_ver = initpkt.getInt32();
Debug::debug()->dbg("Remote SFTP version %lu", m_proto_ver);
- FilePath fp = parser.getPath();
- fp.appendPath(getSubDir());
- mkpath(fp);
+ mkpath(parser.getPath());
}
/* -------------------------------------------------------------------------- */
@@ -433,7 +427,7 @@ void SFTPTransfer::perform(DataProvider *dataprovider,
const RootDirURL &target = urlv.front();
FilePath fp = target.getPath();
- fp.appendPath(getSubDir()).appendPath(target_files.front());
+ fp.appendPath(target_files.front());
string handle = createfile(fp);
try {
diff --git a/kdumptool/sshtransfer.h b/kdumptool/sshtransfer.h
index e90d0c3..8a9081a 100644
--- a/kdumptool/sshtransfer.h
+++ b/kdumptool/sshtransfer.h
@@ -41,7 +41,7 @@ class SSHTransfer : public URLTransfer {
*
* @exception KError when initialising the underlying library fails
*/
- SSHTransfer(const RootDirURLVector &urlv, const std::string &subdir)
+ SSHTransfer(const RootDirURLVector &urlv)
throw (KError);
/**
@@ -205,7 +205,7 @@ class SFTPTransfer : public URLTransfer {
*
* @exception KError when initialising the underlying library fails
*/
- SFTPTransfer(const RootDirURLVector &urlv, const std::string &subdir)
+ SFTPTransfer(const RootDirURLVector &urlv)
throw (KError);
/**
diff --git a/kdumptool/transfer.cc b/kdumptool/transfer.cc
index 365055e..4e419ff 100644
--- a/kdumptool/transfer.cc
+++ b/kdumptool/transfer.cc
@@ -64,9 +64,9 @@ void Transfer::perform(DataProvider *dataprovider,
//{{{ URLTransfer --------------------------------------------------------------
// -----------------------------------------------------------------------------
-URLTransfer::URLTransfer(const RootDirURLVector &urlv, const string &subdir)
+URLTransfer::URLTransfer(const RootDirURLVector &urlv)
throw (KError)
- : m_urlVector(urlv), m_subDir(subdir)
+ : m_urlVector(urlv)
{
}
@@ -74,10 +74,9 @@ URLTransfer::URLTransfer(const RootDirURLVector &urlv, const string &subdir)
//{{{ FileTransfer -------------------------------------------------------------
// -----------------------------------------------------------------------------
-FileTransfer::FileTransfer(const RootDirURLVector &urlv,
- const std::string &subdir)
+FileTransfer::FileTransfer(const RootDirURLVector &urlv)
throw (KError)
- : URLTransfer(urlv, subdir), m_bufferSize(0), m_buffer(NULL)
+ : URLTransfer(urlv), m_bufferSize(0), m_buffer(NULL)
{
RootDirURLVector::const_iterator it;
for (it = urlv.begin(); it != urlv.end(); ++it)
@@ -87,7 +86,6 @@ FileTransfer::FileTransfer(const RootDirURLVector &urlv,
// create directories
for (it = urlv.begin(); it != urlv.end(); ++it) {
FilePath dir = it->getRealPath();
- dir.appendPath(subdir);
dir.mkdir(true);
}
@@ -130,7 +128,7 @@ void FileTransfer::perform(DataProvider *dataprovider,
RootDirURLVector::const_iterator itv = urlv.begin();
for (it = target_files.begin(); it != target_files.end(); ++it) {
FilePath fp = itv->getRealPath();
- full_targets.push_back(fp.appendPath(getSubDir()).appendPath(*it));
+ full_targets.push_back(fp.appendPath(*it));
if (++itv == urlv.end())
itv = urlv.begin();
}
@@ -308,10 +306,9 @@ static int curl_debug(CURL *curl, curl_infotype info, char *buffer,
}
// -----------------------------------------------------------------------------
-FTPTransfer::FTPTransfer(const RootDirURLVector &urlv,
- const std::string &subdir)
+FTPTransfer::FTPTransfer(const RootDirURLVector &urlv)
throw (KError)
- : URLTransfer(urlv, subdir), m_curl(NULL)
+ : URLTransfer(urlv), m_curl(NULL)
{
if (urlv.size() > 1)
cerr << "WARNING: First dump target used; rest ignored." << endl;
@@ -425,7 +422,7 @@ void FTPTransfer::open(DataProvider *dataprovider,
// set the URL
FilePath full_url = parser.getURL();
- full_url.appendPath(getSubDir()).appendPath(target_file);
+ full_url.appendPath(target_file);
err = curl_easy_setopt(m_curl, CURLOPT_URL, full_url.c_str());
if (err != CURLE_OK)
throw KError(string("CURL error: ") + m_curlError);
@@ -440,16 +437,15 @@ void FTPTransfer::open(DataProvider *dataprovider,
//{{{ NFSTransfer --------------------------------------------------------------
// -----------------------------------------------------------------------------
-NFSTransfer::NFSTransfer(const RootDirURLVector &urlv,
- const std::string &subdir)
+NFSTransfer::NFSTransfer(const RootDirURLVector &urlv)
throw (KError)
- : URLTransfer(urlv, subdir), m_mountpoint(""), m_fileTransfer(NULL)
+ : URLTransfer(urlv), m_mountpoint(""), m_fileTransfer(NULL)
{
- RootDirURLVector file_urlv("", "");
+ RootDirURLVector file_urlv;
RootDirURLVector::const_iterator it;
for (it = urlv.begin(); it != urlv.end(); ++it)
file_urlv.push_back(translate(*it));
- m_fileTransfer = new FileTransfer(file_urlv, subdir);
+ m_fileTransfer = new FileTransfer(file_urlv);
}
// -----------------------------------------------------------------------------
@@ -521,16 +517,15 @@ void NFSTransfer::close()
//{{{ CIFSTransfer -------------------------------------------------------------
// -----------------------------------------------------------------------------
-CIFSTransfer::CIFSTransfer(const RootDirURLVector &urlv,
- const std::string &subdir)
+CIFSTransfer::CIFSTransfer(const RootDirURLVector &urlv)
throw (KError)
- : URLTransfer(urlv, subdir), m_mountpoint(""), m_fileTransfer(NULL)
+ : URLTransfer(urlv), m_mountpoint(""), m_fileTransfer(NULL)
{
- RootDirURLVector file_urlv("", "");
+ RootDirURLVector file_urlv;
RootDirURLVector::const_iterator it;
for (it = urlv.begin(); it != urlv.end(); ++it)
file_urlv.push_back(translate(*it));
- m_fileTransfer = new FileTransfer(file_urlv, subdir);
+ m_fileTransfer = new FileTransfer(file_urlv);
}
// -----------------------------------------------------------------------------
diff --git a/kdumptool/transfer.h b/kdumptool/transfer.h
index d81f2d4..a1ecf4f 100644
--- a/kdumptool/transfer.h
+++ b/kdumptool/transfer.h
@@ -102,10 +102,10 @@ class URLTransfer : public Transfer {
/**
* Creates a new URLTransfer object.
*
- * @param[in] url the URL
+ * @param[in] urlv target URLs
* @throw KError if parsing the URL failed
*/
- URLTransfer(const RootDirURLVector &urlv, const std::string &subdir)
+ URLTransfer(const RootDirURLVector &urlv)
throw (KError);
/**
@@ -117,18 +117,8 @@ class URLTransfer : public Transfer {
throw ()
{ return m_urlVector; }
- /**
- * Returns the subdirectory part.
- *
- * @return reference to the subdirectory.
- */
- const std::string &getSubDir()
- throw ()
- { return m_subDir; }
-
private:
RootDirURLVector m_urlVector;
- std::string m_subDir;
};
//}}}
@@ -144,10 +134,10 @@ class FileTransfer : public URLTransfer {
/**
* Creates a new FileTransfer object.
*
- * @param[in] target_url the directory
+ * @param[in] urlv target directories
* @throw KError if parsing the URL or creating the directory failed
*/
- FileTransfer(const RootDirURLVector &urlv, const std::string &subdir)
+ FileTransfer(const RootDirURLVector &urlv)
throw (KError);
/**
@@ -202,7 +192,7 @@ class FTPTransfer : public URLTransfer {
*
* @exception KError when initialising the underlying library fails
*/
- FTPTransfer(const RootDirURLVector &urlv, const std::string &subdir)
+ FTPTransfer(const RootDirURLVector &urlv)
throw (KError);
/**
@@ -248,7 +238,7 @@ class NFSTransfer : public URLTransfer {
*
* @exception KError when mounting the share failes
*/
- NFSTransfer(const RootDirURLVector &urlv, const std::string &subdir)
+ NFSTransfer(const RootDirURLVector &urlv)
throw (KError);
/**
@@ -302,7 +292,7 @@ class CIFSTransfer : public URLTransfer {
*
* @exception KError when mounting the share failes
*/
- CIFSTransfer(const RootDirURLVector &urlv, const std::string &subdir)
+ CIFSTransfer(const RootDirURLVector &urlv)
throw (KError);
/**

199
kdump-aarch64.patch Normal file
View File

@ -0,0 +1,199 @@
From: Matthias Brugger <mbrugger@suse.com>
Date: Mon May 8 13:58:38 2017 +0200
Subject: kdumptool: add aarch64
References: bsc#1033464
Upstream: v0.8.17
Git-commit: 914c79f493c858e7ab2c07248c17f23f9195daa3
Git-commit: f43e30a71f294020817f0c4f35ea96931ea9ab93
Git-commit: e6afa41112b5ab4a961a595841f3d6b6751f99b4
Git-commit: a885ddf80fb2c6c2490f2550338042581bca6150
Add support for Aarch64.
Signed-off-by: Matthias Brugger <mbrugger@suse.com>
Acked-by: Petr Tesarik <ptesarik@suse.com>
---
kdumptool/identifykernel.cc | 3 ++
kdumptool/kerneltool.cc | 47 +++++++++++++++++++++++++++++++++++++++++++-
kdumptool/kerneltool.h | 9 ++++++++
kdumptool/savedump.cc | 7 ++++++
tests/identify_kernel.sh | 5 +++-
5 files changed, 69 insertions(+), 2 deletions(-)
--- a/kdumptool/kerneltool.cc
+++ b/kdumptool/kerneltool.cc
@@ -130,6 +130,8 @@ list<string> KernelTool::imageNames(cons
ret.push_back("vmlinuz");
} else if (arch == "s390x") {
ret.push_back("image");
+ } else if (arch == "aarch64") {
+ ret.push_back("Image");
} else {
ret.push_back("vmlinux");
}
@@ -181,6 +183,11 @@ KernelTool::KernelType KernelTool::getKe
return KT_S390;
else
return KT_NONE;
+ } else if (Util::getArch() == "aarch64") {
+ if (isAarch64Kernel())
+ return KT_AARCH64;
+ else
+ return KT_NONE;
} else
return KT_NONE;
}
@@ -201,6 +208,9 @@ bool KernelTool::isRelocatable() const
case KernelTool::KT_S390:
return true;
+ case KernelTool::KT_AARCH64:
+ return true;
+
default:
throw KError("Invalid kernel type.");
break;
@@ -257,6 +267,39 @@ bool KernelTool::isS390Kernel() const
}
// -----------------------------------------------------------------------------
+bool KernelTool::isAarch64Kernel() const
+ throw (KError)
+{
+ struct {
+ uint32_t code0; /* Executable code */
+ uint32_t code1; /* Executable code */
+ uint64_t text_offset; /* Image load offset, little endian */
+ uint64_t image_size; /* Effective Image size, little endian */
+ uint64_t flags; /* kernel flags, little endian */
+ uint64_t res2; /* reserved */
+ uint64_t res3; /* reserved */
+ uint64_t res4; /* reserved */
+ uint32_t magic; /* Magic number, little endian, "ARM\x64" */
+ uint32_t res5; /* reserved (used for PE COFF offset) */
+ } buffer;
+
+ /* check the magic number */
+ if (lseek(m_fd, 0, SEEK_SET) == (off_t)-1) {
+ throw KSystemError("IdentifyKernel::isAarch64Kernel: lseek to "
+ "file start failed", errno);
+ }
+
+ int ret = read(m_fd, &buffer, sizeof(buffer));
+ if (ret < 0) {
+ throw KSystemError("IdentifyKernel::isAarch64Kernel: read of magic "
+ "start failed", errno);
+ } else if (ret < (int)sizeof(buffer))
+ return false;
+
+ return buffer.magic == 0x644d5241; /* little endian "ARM\x64" */
+}
+
+// -----------------------------------------------------------------------------
bool KernelTool::x86isRelocatable() const
throw (KError)
{
@@ -390,7 +433,7 @@ bool KernelTool::elfIsRelocatable() cons
bool KernelTool::isArchAlwaysRelocatable(const string &machine) const
throw ()
{
- return machine == "ia64";
+ return machine == "ia64" || machine == "aarch64";
}
// -----------------------------------------------------------------------------
@@ -426,6 +469,7 @@ string KernelTool::archFromElfMachine(un
case EM_S390: return "s390";
case EM_IA_64: return "ia64";
case EM_X86_64: return "x86_64";
+ case EM_AARCH64: return "aarch64";
default: return "unknown";
}
}
@@ -681,6 +725,7 @@ string KernelTool::extractKernelConfig()
case KernelTool::KT_ELF:
case KernelTool::KT_ELF_GZ:
case KernelTool::KT_S390:
+ case KernelTool::KT_AARCH64:
return extractKernelConfigELF();
case KernelTool::KT_X86:
--- a/tests/identify_kernel.sh
+++ b/tests/identify_kernel.sh
@@ -28,18 +28,21 @@ KERNEL_IMAGES=("kernel-bzImage-x86_64"
"kernel-ELFgz-ia64"
"kernel-ELF-ia64"
"kernel-ELF-ppc64"
+ "kernel-ELF-aarch64"
)
RELOCATABLE=( 1
0
0
1
1
- 0 )
+ 0
+ 1 )
TYPE=( "x86"
"ELF gzip"
"ELF"
"ELF gzip"
"ELF"
+ "ELF"
"ELF" )
# }}}
--- a/kdumptool/savedump.cc
+++ b/kdumptool/savedump.cc
@@ -563,6 +563,13 @@ string SaveDump::findKernel()
if (binaryroot.exists())
return binary;
+ // 5: Image
+ (binary = "/boot").appendPath("Image-" + m_crashrelease);
+ (binaryroot = m_rootdir).appendPath(binary);
+ Debug::debug()->dbg("Trying %s", binaryroot.c_str());
+ if (binaryroot.exists())
+ return binary;
+
FilePath fp = m_rootdir;
fp.appendPath("/boot");
throw KError("No kernel image found in " + fp);
--- a/kdumptool/identifykernel.cc
+++ b/kdumptool/identifykernel.cc
@@ -91,6 +91,9 @@ void IdentifyKernel::execute()
case KernelTool::KT_S390:
cout << "S390" << endl;
break;
+ case KernelTool::KT_AARCH64:
+ cout << "Aarch64" << endl;
+ break;
default:
throw KError("The specified file is not a kernel image.");
}
--- a/kdumptool/kerneltool.h
+++ b/kdumptool/kerneltool.h
@@ -42,6 +42,7 @@ class KernelTool {
KT_ELF_GZ,
KT_X86,
KT_S390,
+ KT_AARCH64,
KT_NONE
};
@@ -207,6 +208,14 @@ class KernelTool {
throw (KError);
/**
+ * Checks if the kernel is an Aarch64 kernel image.
+ *
+ * @return @c true if it's an Aarch64 kernel image, @c false otherwise.
+ */
+ bool isAarch64Kernel() const
+ throw (KError);
+
+ /**
* Returns the architecture as string from the ELF machine type.
*
* @param[in] et_machine the ELF machine type such as EM_386

View File

@ -0,0 +1,92 @@
From: Michal Koutny <mkoutny@suse.com>
Date: Wed Jun 7 15:16:05 2017 +0200
Subject: Fix kdump-related services
References: bsc#1021484
Upstreams: v0.8.17
Git-commit: 168b7bfeb992594df08c7e4020ac34f1d9a825bb
kdump.service should be the "big switch" to turn kdump on and off. We
can achieve this by adding an Also= directive.
kdump-early.service is merely a way to load a kdump kernel a early
during the boot process if and only if the kdumprd already exists (e.g.
from a previous boot). There may be some use cases for enabling only
the early service without kdump.service.
OTOH, it is not an error if the initrd is not found during the early
stages. This is indicated by exit code 6 (originally conforming to LSB
"program not configured" exit code).
Signed-off-by: Michal Koutny <mkoutny@suse.com>
Acked-by: Petr Tesarik <ptesarik@suse.com>
---
init/CMakeLists.txt | 2 +-
init/kdump-early.service | 14 ++++++++++++++
init/kdump-rebuild-initrd.service | 12 ------------
init/kdump.service | 8 ++++----
4 files changed, 19 insertions(+), 17 deletions(-)
--- a/init/kdump.service
+++ b/init/kdump.service
@@ -1,13 +1,13 @@
[Unit]
-Description=Load kdump kernel on startup
-After=local-fs.target
-Wants=kdump-rebuild-initrd.service
+Description=Load kdump kernel and initrd
+After=local-fs.target network.service YaST2-Second-Stage.service YaST2-Firstboot.service
[Service]
Type=oneshot
-ExecStart=/lib/kdump/load.sh
+ExecStart=/lib/kdump/load.sh --update
ExecStop=/lib/kdump/unload.sh
RemainAfterExit=true
[Install]
WantedBy=multi-user.target
+Also=kdump-early.service
--- /dev/null
+++ b/init/kdump-early.service
@@ -0,0 +1,14 @@
+[Unit]
+Description=Load kdump kernel early on startup
+After=local-fs.target
+
+[Service]
+Type=oneshot
+ExecStart=/lib/kdump/load.sh
+ExecStop=/lib/kdump/unload.sh
+RemainAfterExit=true
+# It is OK if the initrd is missing in this early attempt
+SuccessExitStatus=6
+
+[Install]
+WantedBy=multi-user.target
--- a/init/kdump-rebuild-initrd.service
+++ /dev/null
@@ -1,12 +0,0 @@
-[Unit]
-Description=Reload kdump kernel and updated initrd after the network is configured
-After=local-fs.target network.service YaST2-Second-Stage.service YaST2-Firstboot.service
-
-[Service]
-Type=oneshot
-ExecStart=/lib/kdump/load.sh --update
-ExecStop=/lib/kdump/unload.sh
-RemainAfterExit=true
-
-[Install]
-WantedBy=multi-user.target
--- a/init/CMakeLists.txt
+++ b/init/CMakeLists.txt
@@ -39,7 +39,7 @@ INSTALL(
INSTALL(
FILES
${CMAKE_CURRENT_SOURCE_DIR}/kdump.service
- ${CMAKE_CURRENT_SOURCE_DIR}/kdump-rebuild-initrd.service
+ ${CMAKE_CURRENT_SOURCE_DIR}/kdump-early.service
DESTINATION
/usr/lib/systemd/system
PERMISSIONS

View File

@ -0,0 +1,44 @@
Date: Wed Jun 14 14:39:15 2017 +0200
From: Petr Tesarik <ptesarik@suse.com>
Subject: Prepend IP address to remote target subdirectory
References: FATE#321844
Upstream: v0.8.17
Git-commit: d8f0f0cb4450776b0765ddb0441a5d5669a78062
Check the target route directly from save_dump and take the preferred
source IP address into the subdirectory name.
Signed-off-by: Petr Tesarik <ptesarik@suse.com>
diff --git a/kdumptool/savedump.cc b/kdumptool/savedump.cc
index 9938b6f..14e66b3 100644
--- a/kdumptool/savedump.cc
+++ b/kdumptool/savedump.cc
@@ -40,6 +40,7 @@
#include "vmcoreinfo.h"
#include "identifykernel.h"
#include "email.h"
+#include "routable.h"
using std::string;
using std::list;
@@ -114,8 +115,17 @@ void SaveDump::execute()
std::istringstream iss(config->KDUMP_SAVEDIR.value());
FilePath elem;
while (iss >> elem) {
- RootDirURL url(elem.appendPath(subdir), m_rootdir);
- urlv.push_back(url);
+ RootDirURL url(elem, m_rootdir);
+ if (url.getProtocol() != URLParser::PROT_FILE) {
+ Routable rt(url.getHostname());
+ if (!rt.check(config->KDUMP_NET_TIMEOUT.value())) {
+ cerr << "WARNING: Dump target not reachable" << endl;
+ elem.appendPath(string("unknown-") + subdir);
+ } else
+ elem.appendPath(rt.prefsrc() + '-' + subdir);
+ } else
+ elem.appendPath(subdir);
+ urlv.push_back(RootDirURL(elem, m_rootdir));
}
m_transfer = getTransfer(urlv);

View File

@ -1,3 +1,30 @@
-------------------------------------------------------------------
Wed Jun 14 12:48:34 UTC 2017 - ptesarik@suse.com
- kdump-Routable-preferred-source-address.patch: Routable: parse
and store preferred source address (FATE#321844).
- kdump-URLTransfer-complete-target.patch: Use the complete target
URL for URLTransfer (FATE#321844).
- kdump-prepend-IP-address.patch: Prepend IP address to remote
target subdirectory (FATE#321844).
-------------------------------------------------------------------
Thu Jun 8 15:02:09 UTC 2017 - ptesarik@suse.com
- kdump-fix-service-files.patch: Fix kdump-related services
(bsc#1021484).
-------------------------------------------------------------------
Thu Jun 8 13:10:41 UTC 2017 - ptesarik@suse.com
- kernel-ELF-aarch64: Test data for aarch64 findkernel.
- kdump-KDUMP_SSH_IDENTITY.patch: Update with later upstream fixes.
-------------------------------------------------------------------
Wed Jun 7 11:43:46 UTC 2017 - ptesarik@suse.com
- kdump-aarch64.patch: kdumptool: add aarch64 (bsc#1033464).
-------------------------------------------------------------------
Wed May 17 13:31:11 UTC 2017 - ptesarik@suse.com

View File

@ -40,6 +40,7 @@ License: GPL-2.0+
Group: System/Kernel
Url: https://github.com/ptesarik/kdump
Source: %{name}-%{version}.tar.bz2
Source1: kernel-ELF-aarch64
Source2: %{name}-rpmlintrc
Patch1: %{name}-cmake-compat.patch
Patch2: %{name}-KDUMP_SSH_IDENTITY.patch
@ -49,6 +50,11 @@ Patch5: %{name}-always-pass-kernelver-to-dracut.patch
Patch6: %{name}-pre-generate-mount-units.patch
Patch7: %{name}-bind-mount-sysroot.patch
Patch8: %{name}-x86_64-kexec-file-syscall.patch
Patch9: %{name}-aarch64.patch
Patch10: %{name}-fix-service-files.patch
Patch11: %{name}-Routable-preferred-source-address.patch
Patch12: %{name}-URLTransfer-complete-target.patch
Patch13: %{name}-prepend-IP-address.patch
BuildRequires: asciidoc
BuildRequires: cmake
BuildRequires: gcc-c++
@ -116,6 +122,12 @@ after a crash dump has occured.
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
cp %{S:1} tests/data/
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%build
export CFLAGS="%{optflags}"
@ -151,14 +163,14 @@ rm %{buildroot}%{_initddir}/boot.kdump
ln -s %{_sbindir}/service %{buildroot}%{_sbindir}/rckdump
%else
rm %{buildroot}/usr/lib/systemd/system/kdump.service
rm %{buildroot}/usr/lib/systemd/system/kdump-rebuild-initrd.service
rm %{buildroot}/usr/lib/systemd/system/kdump-early.service
ln -s ../..%{_initddir}/boot.kdump %{buildroot}%{_sbindir}/rckdump
%endif
%if %{systemd_present}
%pre
%service_add_pre kdump.service
%service_add_pre kdump-rebuild-initrd.service
%service_add_pre kdump-early.service
%endif
%post
@ -171,7 +183,7 @@ fi
%if %{systemd_present}
%{fillup_only -n kdump}
%service_add_post kdump.service
%service_add_post kdump-rebuild-initrd.service
%service_add_post kdump-early.service
%else
%{fillup_and_insserv -n kdump boot.kdump}
%endif
@ -188,7 +200,7 @@ fi
echo "Stopping kdump ..."
%if %{systemd_present}
%service_del_preun kdump.service
%service_del_preun kdump-rebuild-initrd.service
%service_del_preun kdump-early.service
%else
%stop_on_removal boot.kdump
%endif
@ -200,7 +212,7 @@ touch %{_sysconfdir}/sysconfig/kdump
rm /var/log/dump >/dev/null 2>&1 || true
%if %{systemd_present}
%service_del_postun kdump.service
%service_del_postun kdump-rebuild-initrd.service
%service_del_postun kdump-early.service
%else
%restart_on_update boot.kdump
%insserv_cleanup
@ -230,7 +242,7 @@ rm /var/log/dump >/dev/null 2>&1 || true
%{_udevrulesdir}/70-kdump.rules
%if %{systemd_present}
%{_unitdir}/kdump.service
%{_unitdir}/kdump-rebuild-initrd.service
%{_unitdir}/kdump-early.service
%else
%{_sysconfdir}/init.d/boot.kdump
%endif

BIN
kernel-ELF-aarch64 Normal file

Binary file not shown.